chiark / gitweb /
Merge branch 'master' of https://git.tartarus.org/simon/puzzles into widelines
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 3 Oct 2017 19:48:34 +0000 (20:48 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 3 Oct 2017 19:48:34 +0000 (20:48 +0100)
782 files changed:
.gitignore [deleted file]
Buildscr [deleted file]
CHECKLST.txt [deleted file]
HACKING [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
Makefile.cyg [new file with mode: 0644]
Makefile.doc
Makefile.emcc [new file with mode: 0644]
Makefile.gnustep [new file with mode: 0644]
Makefile.gtk [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
Makefile.nestedvm [new file with mode: 0644]
Makefile.osx [new file with mode: 0644]
Makefile.vc [new file with mode: 0644]
Makefile.wce [new file with mode: 0644]
PuzzleApplet.java [deleted file]
Recipe
aclocal.m4 [new file with mode: 0644]
benchmark.pl [deleted file]
benchmark.sh [deleted file]
chm.but [new file with mode: 0644]
chm.css [deleted file]
compile [new file with mode: 0755]
configure [new file with mode: 0755]
configure.ac
debian/README.Debian [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/desktop/sgt-blackbox.desktop [new file with mode: 0644]
debian/desktop/sgt-bridges.desktop [new file with mode: 0644]
debian/desktop/sgt-cube.desktop [new file with mode: 0644]
debian/desktop/sgt-dominosa.desktop [new file with mode: 0644]
debian/desktop/sgt-fifteen.desktop [new file with mode: 0644]
debian/desktop/sgt-filling.desktop [new file with mode: 0644]
debian/desktop/sgt-flip.desktop [new file with mode: 0644]
debian/desktop/sgt-flood.desktop [new file with mode: 0644]
debian/desktop/sgt-galaxies.desktop [new file with mode: 0644]
debian/desktop/sgt-guess.desktop [new file with mode: 0644]
debian/desktop/sgt-inertia.desktop [new file with mode: 0644]
debian/desktop/sgt-keen.desktop [new file with mode: 0644]
debian/desktop/sgt-lightup.desktop [new file with mode: 0644]
debian/desktop/sgt-loopy.desktop [new file with mode: 0644]
debian/desktop/sgt-magnets.desktop [new file with mode: 0644]
debian/desktop/sgt-map.desktop [new file with mode: 0644]
debian/desktop/sgt-mines.desktop [new file with mode: 0644]
debian/desktop/sgt-net.desktop [new file with mode: 0644]
debian/desktop/sgt-netslide.desktop [new file with mode: 0644]
debian/desktop/sgt-palisade.desktop [new file with mode: 0644]
debian/desktop/sgt-pattern.desktop [new file with mode: 0644]
debian/desktop/sgt-pearl.desktop [new file with mode: 0644]
debian/desktop/sgt-pegs.desktop [new file with mode: 0644]
debian/desktop/sgt-range.desktop [new file with mode: 0644]
debian/desktop/sgt-rect.desktop [new file with mode: 0644]
debian/desktop/sgt-samegame.desktop [new file with mode: 0644]
debian/desktop/sgt-signpost.desktop [new file with mode: 0644]
debian/desktop/sgt-singles.desktop [new file with mode: 0644]
debian/desktop/sgt-sixteen.desktop [new file with mode: 0644]
debian/desktop/sgt-slant.desktop [new file with mode: 0644]
debian/desktop/sgt-solo.desktop [new file with mode: 0644]
debian/desktop/sgt-tents.desktop [new file with mode: 0644]
debian/desktop/sgt-towers.desktop [new file with mode: 0644]
debian/desktop/sgt-tracks.desktop [new file with mode: 0644]
debian/desktop/sgt-twiddle.desktop [new file with mode: 0644]
debian/desktop/sgt-undead.desktop [new file with mode: 0644]
debian/desktop/sgt-unequal.desktop [new file with mode: 0644]
debian/desktop/sgt-unruly.desktop [new file with mode: 0644]
debian/desktop/sgt-untangle.desktop [new file with mode: 0644]
debian/patches/102_fix-pearl-min-dimensions.diff [new file with mode: 0644]
debian/patches/201_make-more-docs.diff [new file with mode: 0644]
debian/patches/202_online-help.diff [new file with mode: 0644]
debian/patches/206_translate-docs.diff [new file with mode: 0644]
debian/patches/207_slant-shade-filled.diff [new file with mode: 0644]
debian/patches/302_rename-binaries.diff [new file with mode: 0644]
debian/patches/303_show-debian-version-number.diff [new file with mode: 0644]
debian/patches/304_combine-binaries.diff [new file with mode: 0644]
debian/patches/fix-ftbfs-with-gcc-6.patch [new file with mode: 0644]
debian/patches/series [new file with mode: 0644]
debian/po/de.po [new file with mode: 0644]
debian/po/puzzles-doc.pot [new file with mode: 0644]
debian/po/puzzles-doc.pot.head [new file with mode: 0644]
debian/rules [new file with mode: 0755]
debian/sgt-puzzles.dirs [new file with mode: 0644]
debian/sgt-puzzles.docs [new file with mode: 0644]
debian/source/format [new file with mode: 0644]
depcomp [new file with mode: 0755]
desktop.pl [deleted file]
devel.but
emcclib.js [deleted file]
emccpre.js [deleted file]
emccx.json [deleted file]
gtk.c
html/blackbox.html [deleted file]
html/bridges.html [deleted file]
html/cube.html [deleted file]
html/dominosa.html [deleted file]
html/fifteen.html [deleted file]
html/filling.html [deleted file]
html/flip.html [deleted file]
html/flood.html [deleted file]
html/galaxies.html [deleted file]
html/group.html [deleted file]
html/guess.html [deleted file]
html/inertia.html [deleted file]
html/javapage.pl [deleted file]
html/jspage.pl [deleted file]
html/keen.html [deleted file]
html/lightup.html [deleted file]
html/loopy.html [deleted file]
html/magnets.html [deleted file]
html/map.html [deleted file]
html/mines.html [deleted file]
html/net.html [deleted file]
html/netslide.html [deleted file]
html/palisade.html [deleted file]
html/pattern.html [deleted file]
html/pearl.html [deleted file]
html/pegs.html [deleted file]
html/range.html [deleted file]
html/rect.html [deleted file]
html/samegame.html [deleted file]
html/signpost.html [deleted file]
html/singles.html [deleted file]
html/sixteen.html [deleted file]
html/slant.html [deleted file]
html/solo.html [deleted file]
html/tents.html [deleted file]
html/towers.html [deleted file]
html/tracks.html [deleted file]
html/twiddle.html [deleted file]
html/undead.html [deleted file]
html/unequal.html [deleted file]
html/unruly.html [deleted file]
html/untangle.html [deleted file]
icons/blackbox-16d24.png [new file with mode: 0644]
icons/blackbox-16d4.png [new file with mode: 0644]
icons/blackbox-16d8.png [new file with mode: 0644]
icons/blackbox-32d24.png [new file with mode: 0644]
icons/blackbox-32d4.png [new file with mode: 0644]
icons/blackbox-32d8.png [new file with mode: 0644]
icons/blackbox-48d24.png [new file with mode: 0644]
icons/blackbox-48d4.png [new file with mode: 0644]
icons/blackbox-48d8.png [new file with mode: 0644]
icons/blackbox-base.png [new file with mode: 0644]
icons/blackbox-ibase.png [new file with mode: 0644]
icons/blackbox-ibase4.png [new file with mode: 0644]
icons/blackbox-icon.c [new file with mode: 0644]
icons/blackbox-web.png [new file with mode: 0644]
icons/blackbox.ico [new file with mode: 0644]
icons/blackbox.rc [new file with mode: 0644]
icons/bridges-16d24.png [new file with mode: 0644]
icons/bridges-16d4.png [new file with mode: 0644]
icons/bridges-16d8.png [new file with mode: 0644]
icons/bridges-32d24.png [new file with mode: 0644]
icons/bridges-32d4.png [new file with mode: 0644]
icons/bridges-32d8.png [new file with mode: 0644]
icons/bridges-48d24.png [new file with mode: 0644]
icons/bridges-48d4.png [new file with mode: 0644]
icons/bridges-48d8.png [new file with mode: 0644]
icons/bridges-base.png [new file with mode: 0644]
icons/bridges-ibase.png [new file with mode: 0644]
icons/bridges-ibase4.png [new file with mode: 0644]
icons/bridges-icon.c [new file with mode: 0644]
icons/bridges-web.png [new file with mode: 0644]
icons/bridges.ico [new file with mode: 0644]
icons/bridges.rc [new file with mode: 0644]
icons/cube-16d24.png [new file with mode: 0644]
icons/cube-16d4.png [new file with mode: 0644]
icons/cube-16d8.png [new file with mode: 0644]
icons/cube-32d24.png [new file with mode: 0644]
icons/cube-32d4.png [new file with mode: 0644]
icons/cube-32d8.png [new file with mode: 0644]
icons/cube-48d24.png [new file with mode: 0644]
icons/cube-48d4.png [new file with mode: 0644]
icons/cube-48d8.png [new file with mode: 0644]
icons/cube-base.png [new file with mode: 0644]
icons/cube-ibase.png [new file with mode: 0644]
icons/cube-ibase4.png [new file with mode: 0644]
icons/cube-icon.c [new file with mode: 0644]
icons/cube-web.png [new file with mode: 0644]
icons/cube.ico [new file with mode: 0644]
icons/cube.rc [new file with mode: 0644]
icons/dominosa-16d24.png [new file with mode: 0644]
icons/dominosa-16d4.png [new file with mode: 0644]
icons/dominosa-16d8.png [new file with mode: 0644]
icons/dominosa-32d24.png [new file with mode: 0644]
icons/dominosa-32d4.png [new file with mode: 0644]
icons/dominosa-32d8.png [new file with mode: 0644]
icons/dominosa-48d24.png [new file with mode: 0644]
icons/dominosa-48d4.png [new file with mode: 0644]
icons/dominosa-48d8.png [new file with mode: 0644]
icons/dominosa-base.png [new file with mode: 0644]
icons/dominosa-ibase.png [new file with mode: 0644]
icons/dominosa-ibase4.png [new file with mode: 0644]
icons/dominosa-icon.c [new file with mode: 0644]
icons/dominosa-web.png [new file with mode: 0644]
icons/dominosa.ico [new file with mode: 0644]
icons/dominosa.rc [new file with mode: 0644]
icons/fifteen-16d24.png [new file with mode: 0644]
icons/fifteen-16d4.png [new file with mode: 0644]
icons/fifteen-16d8.png [new file with mode: 0644]
icons/fifteen-32d24.png [new file with mode: 0644]
icons/fifteen-32d4.png [new file with mode: 0644]
icons/fifteen-32d8.png [new file with mode: 0644]
icons/fifteen-48d24.png [new file with mode: 0644]
icons/fifteen-48d4.png [new file with mode: 0644]
icons/fifteen-48d8.png [new file with mode: 0644]
icons/fifteen-base.png [new file with mode: 0644]
icons/fifteen-ibase.png [new file with mode: 0644]
icons/fifteen-ibase4.png [new file with mode: 0644]
icons/fifteen-icon.c [new file with mode: 0644]
icons/fifteen-web.png [new file with mode: 0644]
icons/fifteen.ico [new file with mode: 0644]
icons/fifteen.rc [new file with mode: 0644]
icons/filling-16d24.png [new file with mode: 0644]
icons/filling-16d4.png [new file with mode: 0644]
icons/filling-16d8.png [new file with mode: 0644]
icons/filling-32d24.png [new file with mode: 0644]
icons/filling-32d4.png [new file with mode: 0644]
icons/filling-32d8.png [new file with mode: 0644]
icons/filling-48d24.png [new file with mode: 0644]
icons/filling-48d4.png [new file with mode: 0644]
icons/filling-48d8.png [new file with mode: 0644]
icons/filling-base.png [new file with mode: 0644]
icons/filling-ibase.png [new file with mode: 0644]
icons/filling-ibase4.png [new file with mode: 0644]
icons/filling-icon.c [new file with mode: 0644]
icons/filling-web.png [new file with mode: 0644]
icons/filling.ico [new file with mode: 0644]
icons/filling.rc [new file with mode: 0644]
icons/flip-16d24.png [new file with mode: 0644]
icons/flip-16d4.png [new file with mode: 0644]
icons/flip-16d8.png [new file with mode: 0644]
icons/flip-32d24.png [new file with mode: 0644]
icons/flip-32d4.png [new file with mode: 0644]
icons/flip-32d8.png [new file with mode: 0644]
icons/flip-48d24.png [new file with mode: 0644]
icons/flip-48d4.png [new file with mode: 0644]
icons/flip-48d8.png [new file with mode: 0644]
icons/flip-base.png [new file with mode: 0644]
icons/flip-ibase.png [new file with mode: 0644]
icons/flip-ibase4.png [new file with mode: 0644]
icons/flip-icon.c [new file with mode: 0644]
icons/flip-web.png [new file with mode: 0644]
icons/flip.ico [new file with mode: 0644]
icons/flip.rc [new file with mode: 0644]
icons/flood-16d24.png [new file with mode: 0644]
icons/flood-16d4.png [new file with mode: 0644]
icons/flood-16d8.png [new file with mode: 0644]
icons/flood-32d24.png [new file with mode: 0644]
icons/flood-32d4.png [new file with mode: 0644]
icons/flood-32d8.png [new file with mode: 0644]
icons/flood-48d24.png [new file with mode: 0644]
icons/flood-48d4.png [new file with mode: 0644]
icons/flood-48d8.png [new file with mode: 0644]
icons/flood-base.png [new file with mode: 0644]
icons/flood-ibase.png [new file with mode: 0644]
icons/flood-ibase4.png [new file with mode: 0644]
icons/flood-icon.c [new file with mode: 0644]
icons/flood-web.png [new file with mode: 0644]
icons/flood.ico [new file with mode: 0644]
icons/flood.rc [new file with mode: 0644]
icons/galaxies-16d24.png [new file with mode: 0644]
icons/galaxies-16d4.png [new file with mode: 0644]
icons/galaxies-16d8.png [new file with mode: 0644]
icons/galaxies-32d24.png [new file with mode: 0644]
icons/galaxies-32d4.png [new file with mode: 0644]
icons/galaxies-32d8.png [new file with mode: 0644]
icons/galaxies-48d24.png [new file with mode: 0644]
icons/galaxies-48d4.png [new file with mode: 0644]
icons/galaxies-48d8.png [new file with mode: 0644]
icons/galaxies-base.png [new file with mode: 0644]
icons/galaxies-ibase.png [new file with mode: 0644]
icons/galaxies-ibase4.png [new file with mode: 0644]
icons/galaxies-icon.c [new file with mode: 0644]
icons/galaxies-web.png [new file with mode: 0644]
icons/galaxies.ico [new file with mode: 0644]
icons/galaxies.rc [new file with mode: 0644]
icons/guess-16d24.png [new file with mode: 0644]
icons/guess-16d4.png [new file with mode: 0644]
icons/guess-16d8.png [new file with mode: 0644]
icons/guess-32d24.png [new file with mode: 0644]
icons/guess-32d4.png [new file with mode: 0644]
icons/guess-32d8.png [new file with mode: 0644]
icons/guess-48d24.png [new file with mode: 0644]
icons/guess-48d4.png [new file with mode: 0644]
icons/guess-48d8.png [new file with mode: 0644]
icons/guess-base.png [new file with mode: 0644]
icons/guess-ibase.png [new file with mode: 0644]
icons/guess-ibase4.png [new file with mode: 0644]
icons/guess-icon.c [new file with mode: 0644]
icons/guess-web.png [new file with mode: 0644]
icons/guess.ico [new file with mode: 0644]
icons/guess.rc [new file with mode: 0644]
icons/inertia-16d24.png [new file with mode: 0644]
icons/inertia-16d4.png [new file with mode: 0644]
icons/inertia-16d8.png [new file with mode: 0644]
icons/inertia-32d24.png [new file with mode: 0644]
icons/inertia-32d4.png [new file with mode: 0644]
icons/inertia-32d8.png [new file with mode: 0644]
icons/inertia-48d24.png [new file with mode: 0644]
icons/inertia-48d4.png [new file with mode: 0644]
icons/inertia-48d8.png [new file with mode: 0644]
icons/inertia-base.png [new file with mode: 0644]
icons/inertia-ibase.png [new file with mode: 0644]
icons/inertia-ibase4.png [new file with mode: 0644]
icons/inertia-icon.c [new file with mode: 0644]
icons/inertia-web.png [new file with mode: 0644]
icons/inertia.ico [new file with mode: 0644]
icons/inertia.rc [new file with mode: 0644]
icons/keen-16d24.png [new file with mode: 0644]
icons/keen-16d4.png [new file with mode: 0644]
icons/keen-16d8.png [new file with mode: 0644]
icons/keen-32d24.png [new file with mode: 0644]
icons/keen-32d4.png [new file with mode: 0644]
icons/keen-32d8.png [new file with mode: 0644]
icons/keen-48d24.png [new file with mode: 0644]
icons/keen-48d4.png [new file with mode: 0644]
icons/keen-48d8.png [new file with mode: 0644]
icons/keen-base.png [new file with mode: 0644]
icons/keen-ibase.png [new file with mode: 0644]
icons/keen-ibase4.png [new file with mode: 0644]
icons/keen-icon.c [new file with mode: 0644]
icons/keen-web.png [new file with mode: 0644]
icons/keen.ico [new file with mode: 0644]
icons/keen.rc [new file with mode: 0644]
icons/lightup-16d24.png [new file with mode: 0644]
icons/lightup-16d4.png [new file with mode: 0644]
icons/lightup-16d8.png [new file with mode: 0644]
icons/lightup-32d24.png [new file with mode: 0644]
icons/lightup-32d4.png [new file with mode: 0644]
icons/lightup-32d8.png [new file with mode: 0644]
icons/lightup-48d24.png [new file with mode: 0644]
icons/lightup-48d4.png [new file with mode: 0644]
icons/lightup-48d8.png [new file with mode: 0644]
icons/lightup-base.png [new file with mode: 0644]
icons/lightup-ibase.png [new file with mode: 0644]
icons/lightup-ibase4.png [new file with mode: 0644]
icons/lightup-icon.c [new file with mode: 0644]
icons/lightup-web.png [new file with mode: 0644]
icons/lightup.ico [new file with mode: 0644]
icons/lightup.rc [new file with mode: 0644]
icons/loopy-16d24.png [new file with mode: 0644]
icons/loopy-16d4.png [new file with mode: 0644]
icons/loopy-16d8.png [new file with mode: 0644]
icons/loopy-32d24.png [new file with mode: 0644]
icons/loopy-32d4.png [new file with mode: 0644]
icons/loopy-32d8.png [new file with mode: 0644]
icons/loopy-48d24.png [new file with mode: 0644]
icons/loopy-48d4.png [new file with mode: 0644]
icons/loopy-48d8.png [new file with mode: 0644]
icons/loopy-base.png [new file with mode: 0644]
icons/loopy-ibase.png [new file with mode: 0644]
icons/loopy-ibase4.png [new file with mode: 0644]
icons/loopy-icon.c [new file with mode: 0644]
icons/loopy-web.png [new file with mode: 0644]
icons/loopy.ico [new file with mode: 0644]
icons/loopy.rc [new file with mode: 0644]
icons/magnets-16d24.png [new file with mode: 0644]
icons/magnets-16d4.png [new file with mode: 0644]
icons/magnets-16d8.png [new file with mode: 0644]
icons/magnets-32d24.png [new file with mode: 0644]
icons/magnets-32d4.png [new file with mode: 0644]
icons/magnets-32d8.png [new file with mode: 0644]
icons/magnets-48d24.png [new file with mode: 0644]
icons/magnets-48d4.png [new file with mode: 0644]
icons/magnets-48d8.png [new file with mode: 0644]
icons/magnets-base.png [new file with mode: 0644]
icons/magnets-ibase.png [new file with mode: 0644]
icons/magnets-ibase4.png [new file with mode: 0644]
icons/magnets-icon.c [new file with mode: 0644]
icons/magnets-web.png [new file with mode: 0644]
icons/magnets.ico [new file with mode: 0644]
icons/magnets.rc [new file with mode: 0644]
icons/map-16d24.png [new file with mode: 0644]
icons/map-16d4.png [new file with mode: 0644]
icons/map-16d8.png [new file with mode: 0644]
icons/map-32d24.png [new file with mode: 0644]
icons/map-32d4.png [new file with mode: 0644]
icons/map-32d8.png [new file with mode: 0644]
icons/map-48d24.png [new file with mode: 0644]
icons/map-48d4.png [new file with mode: 0644]
icons/map-48d8.png [new file with mode: 0644]
icons/map-base.png [new file with mode: 0644]
icons/map-ibase.png [new file with mode: 0644]
icons/map-ibase4.png [new file with mode: 0644]
icons/map-icon.c [new file with mode: 0644]
icons/map-web.png [new file with mode: 0644]
icons/map.ico [new file with mode: 0644]
icons/map.rc [new file with mode: 0644]
icons/mines-16d24.png [new file with mode: 0644]
icons/mines-16d4.png [new file with mode: 0644]
icons/mines-16d8.png [new file with mode: 0644]
icons/mines-32d24.png [new file with mode: 0644]
icons/mines-32d4.png [new file with mode: 0644]
icons/mines-32d8.png [new file with mode: 0644]
icons/mines-48d24.png [new file with mode: 0644]
icons/mines-48d4.png [new file with mode: 0644]
icons/mines-48d8.png [new file with mode: 0644]
icons/mines-base.png [new file with mode: 0644]
icons/mines-ibase.png [new file with mode: 0644]
icons/mines-ibase4.png [new file with mode: 0644]
icons/mines-icon.c [new file with mode: 0644]
icons/mines-web.png [new file with mode: 0644]
icons/mines.ico [new file with mode: 0644]
icons/mines.rc [new file with mode: 0644]
icons/net-16d24.png [new file with mode: 0644]
icons/net-16d4.png [new file with mode: 0644]
icons/net-16d8.png [new file with mode: 0644]
icons/net-32d24.png [new file with mode: 0644]
icons/net-32d4.png [new file with mode: 0644]
icons/net-32d8.png [new file with mode: 0644]
icons/net-48d24.png [new file with mode: 0644]
icons/net-48d4.png [new file with mode: 0644]
icons/net-48d8.png [new file with mode: 0644]
icons/net-base.png [new file with mode: 0644]
icons/net-ibase.png [new file with mode: 0644]
icons/net-ibase4.png [new file with mode: 0644]
icons/net-icon.c [new file with mode: 0644]
icons/net-web.png [new file with mode: 0644]
icons/net.ico [new file with mode: 0644]
icons/net.rc [new file with mode: 0644]
icons/netslide-16d24.png [new file with mode: 0644]
icons/netslide-16d4.png [new file with mode: 0644]
icons/netslide-16d8.png [new file with mode: 0644]
icons/netslide-32d24.png [new file with mode: 0644]
icons/netslide-32d4.png [new file with mode: 0644]
icons/netslide-32d8.png [new file with mode: 0644]
icons/netslide-48d24.png [new file with mode: 0644]
icons/netslide-48d4.png [new file with mode: 0644]
icons/netslide-48d8.png [new file with mode: 0644]
icons/netslide-base.png [new file with mode: 0644]
icons/netslide-ibase.png [new file with mode: 0644]
icons/netslide-ibase4.png [new file with mode: 0644]
icons/netslide-icon.c [new file with mode: 0644]
icons/netslide-web.png [new file with mode: 0644]
icons/netslide.ico [new file with mode: 0644]
icons/netslide.rc [new file with mode: 0644]
icons/palisade-16d24.png [new file with mode: 0644]
icons/palisade-16d4.png [new file with mode: 0644]
icons/palisade-16d8.png [new file with mode: 0644]
icons/palisade-32d24.png [new file with mode: 0644]
icons/palisade-32d4.png [new file with mode: 0644]
icons/palisade-32d8.png [new file with mode: 0644]
icons/palisade-48d24.png [new file with mode: 0644]
icons/palisade-48d4.png [new file with mode: 0644]
icons/palisade-48d8.png [new file with mode: 0644]
icons/palisade-base.png [new file with mode: 0644]
icons/palisade-ibase.png [new file with mode: 0644]
icons/palisade-ibase4.png [new file with mode: 0644]
icons/palisade-icon.c [new file with mode: 0644]
icons/palisade-web.png [new file with mode: 0644]
icons/palisade.ico [new file with mode: 0644]
icons/palisade.rc [new file with mode: 0644]
icons/pattern-16d24.png [new file with mode: 0644]
icons/pattern-16d4.png [new file with mode: 0644]
icons/pattern-16d8.png [new file with mode: 0644]
icons/pattern-32d24.png [new file with mode: 0644]
icons/pattern-32d4.png [new file with mode: 0644]
icons/pattern-32d8.png [new file with mode: 0644]
icons/pattern-48d24.png [new file with mode: 0644]
icons/pattern-48d4.png [new file with mode: 0644]
icons/pattern-48d8.png [new file with mode: 0644]
icons/pattern-base.png [new file with mode: 0644]
icons/pattern-ibase.png [new file with mode: 0644]
icons/pattern-ibase4.png [new file with mode: 0644]
icons/pattern-icon.c [new file with mode: 0644]
icons/pattern-web.png [new file with mode: 0644]
icons/pattern.ico [new file with mode: 0644]
icons/pattern.rc [new file with mode: 0644]
icons/pearl-16d24.png [new file with mode: 0644]
icons/pearl-16d4.png [new file with mode: 0644]
icons/pearl-16d8.png [new file with mode: 0644]
icons/pearl-32d24.png [new file with mode: 0644]
icons/pearl-32d4.png [new file with mode: 0644]
icons/pearl-32d8.png [new file with mode: 0644]
icons/pearl-48d24.png [new file with mode: 0644]
icons/pearl-48d4.png [new file with mode: 0644]
icons/pearl-48d8.png [new file with mode: 0644]
icons/pearl-base.png [new file with mode: 0644]
icons/pearl-ibase.png [new file with mode: 0644]
icons/pearl-ibase4.png [new file with mode: 0644]
icons/pearl-icon.c [new file with mode: 0644]
icons/pearl-web.png [new file with mode: 0644]
icons/pearl.ico [new file with mode: 0644]
icons/pearl.rc [new file with mode: 0644]
icons/pegs-16d24.png [new file with mode: 0644]
icons/pegs-16d4.png [new file with mode: 0644]
icons/pegs-16d8.png [new file with mode: 0644]
icons/pegs-32d24.png [new file with mode: 0644]
icons/pegs-32d4.png [new file with mode: 0644]
icons/pegs-32d8.png [new file with mode: 0644]
icons/pegs-48d24.png [new file with mode: 0644]
icons/pegs-48d4.png [new file with mode: 0644]
icons/pegs-48d8.png [new file with mode: 0644]
icons/pegs-base.png [new file with mode: 0644]
icons/pegs-ibase.png [new file with mode: 0644]
icons/pegs-ibase4.png [new file with mode: 0644]
icons/pegs-icon.c [new file with mode: 0644]
icons/pegs-web.png [new file with mode: 0644]
icons/pegs.ico [new file with mode: 0644]
icons/pegs.rc [new file with mode: 0644]
icons/range-16d24.png [new file with mode: 0644]
icons/range-16d4.png [new file with mode: 0644]
icons/range-16d8.png [new file with mode: 0644]
icons/range-32d24.png [new file with mode: 0644]
icons/range-32d4.png [new file with mode: 0644]
icons/range-32d8.png [new file with mode: 0644]
icons/range-48d24.png [new file with mode: 0644]
icons/range-48d4.png [new file with mode: 0644]
icons/range-48d8.png [new file with mode: 0644]
icons/range-base.png [new file with mode: 0644]
icons/range-ibase.png [new file with mode: 0644]
icons/range-ibase4.png [new file with mode: 0644]
icons/range-icon.c [new file with mode: 0644]
icons/range-web.png [new file with mode: 0644]
icons/range.ico [new file with mode: 0644]
icons/range.rc [new file with mode: 0644]
icons/rect-16d24.png [new file with mode: 0644]
icons/rect-16d4.png [new file with mode: 0644]
icons/rect-16d8.png [new file with mode: 0644]
icons/rect-32d24.png [new file with mode: 0644]
icons/rect-32d4.png [new file with mode: 0644]
icons/rect-32d8.png [new file with mode: 0644]
icons/rect-48d24.png [new file with mode: 0644]
icons/rect-48d4.png [new file with mode: 0644]
icons/rect-48d8.png [new file with mode: 0644]
icons/rect-base.png [new file with mode: 0644]
icons/rect-ibase.png [new file with mode: 0644]
icons/rect-ibase4.png [new file with mode: 0644]
icons/rect-icon.c [new file with mode: 0644]
icons/rect-web.png [new file with mode: 0644]
icons/rect.ico [new file with mode: 0644]
icons/rect.rc [new file with mode: 0644]
icons/samegame-16d24.png [new file with mode: 0644]
icons/samegame-16d4.png [new file with mode: 0644]
icons/samegame-16d8.png [new file with mode: 0644]
icons/samegame-32d24.png [new file with mode: 0644]
icons/samegame-32d4.png [new file with mode: 0644]
icons/samegame-32d8.png [new file with mode: 0644]
icons/samegame-48d24.png [new file with mode: 0644]
icons/samegame-48d4.png [new file with mode: 0644]
icons/samegame-48d8.png [new file with mode: 0644]
icons/samegame-base.png [new file with mode: 0644]
icons/samegame-ibase.png [new file with mode: 0644]
icons/samegame-ibase4.png [new file with mode: 0644]
icons/samegame-icon.c [new file with mode: 0644]
icons/samegame-web.png [new file with mode: 0644]
icons/samegame.ico [new file with mode: 0644]
icons/samegame.rc [new file with mode: 0644]
icons/signpost-16d24.png [new file with mode: 0644]
icons/signpost-16d4.png [new file with mode: 0644]
icons/signpost-16d8.png [new file with mode: 0644]
icons/signpost-32d24.png [new file with mode: 0644]
icons/signpost-32d4.png [new file with mode: 0644]
icons/signpost-32d8.png [new file with mode: 0644]
icons/signpost-48d24.png [new file with mode: 0644]
icons/signpost-48d4.png [new file with mode: 0644]
icons/signpost-48d8.png [new file with mode: 0644]
icons/signpost-base.png [new file with mode: 0644]
icons/signpost-ibase.png [new file with mode: 0644]
icons/signpost-ibase4.png [new file with mode: 0644]
icons/signpost-icon.c [new file with mode: 0644]
icons/signpost-web.png [new file with mode: 0644]
icons/signpost.ico [new file with mode: 0644]
icons/signpost.rc [new file with mode: 0644]
icons/singles-16d24.png [new file with mode: 0644]
icons/singles-16d4.png [new file with mode: 0644]
icons/singles-16d8.png [new file with mode: 0644]
icons/singles-32d24.png [new file with mode: 0644]
icons/singles-32d4.png [new file with mode: 0644]
icons/singles-32d8.png [new file with mode: 0644]
icons/singles-48d24.png [new file with mode: 0644]
icons/singles-48d4.png [new file with mode: 0644]
icons/singles-48d8.png [new file with mode: 0644]
icons/singles-base.png [new file with mode: 0644]
icons/singles-ibase.png [new file with mode: 0644]
icons/singles-ibase4.png [new file with mode: 0644]
icons/singles-icon.c [new file with mode: 0644]
icons/singles-web.png [new file with mode: 0644]
icons/singles.ico [new file with mode: 0644]
icons/singles.rc [new file with mode: 0644]
icons/sixteen-16d24.png [new file with mode: 0644]
icons/sixteen-16d4.png [new file with mode: 0644]
icons/sixteen-16d8.png [new file with mode: 0644]
icons/sixteen-32d24.png [new file with mode: 0644]
icons/sixteen-32d4.png [new file with mode: 0644]
icons/sixteen-32d8.png [new file with mode: 0644]
icons/sixteen-48d24.png [new file with mode: 0644]
icons/sixteen-48d4.png [new file with mode: 0644]
icons/sixteen-48d8.png [new file with mode: 0644]
icons/sixteen-base.png [new file with mode: 0644]
icons/sixteen-ibase.png [new file with mode: 0644]
icons/sixteen-ibase4.png [new file with mode: 0644]
icons/sixteen-icon.c [new file with mode: 0644]
icons/sixteen-web.png [new file with mode: 0644]
icons/sixteen.ico [new file with mode: 0644]
icons/sixteen.rc [new file with mode: 0644]
icons/slant-16d24.png [new file with mode: 0644]
icons/slant-16d4.png [new file with mode: 0644]
icons/slant-16d8.png [new file with mode: 0644]
icons/slant-32d24.png [new file with mode: 0644]
icons/slant-32d4.png [new file with mode: 0644]
icons/slant-32d8.png [new file with mode: 0644]
icons/slant-48d24.png [new file with mode: 0644]
icons/slant-48d4.png [new file with mode: 0644]
icons/slant-48d8.png [new file with mode: 0644]
icons/slant-base.png [new file with mode: 0644]
icons/slant-ibase.png [new file with mode: 0644]
icons/slant-ibase4.png [new file with mode: 0644]
icons/slant-icon.c [new file with mode: 0644]
icons/slant-web.png [new file with mode: 0644]
icons/slant.ico [new file with mode: 0644]
icons/slant.rc [new file with mode: 0644]
icons/solo-16d24.png [new file with mode: 0644]
icons/solo-16d4.png [new file with mode: 0644]
icons/solo-16d8.png [new file with mode: 0644]
icons/solo-32d24.png [new file with mode: 0644]
icons/solo-32d4.png [new file with mode: 0644]
icons/solo-32d8.png [new file with mode: 0644]
icons/solo-48d24.png [new file with mode: 0644]
icons/solo-48d4.png [new file with mode: 0644]
icons/solo-48d8.png [new file with mode: 0644]
icons/solo-base.png [new file with mode: 0644]
icons/solo-ibase.png [new file with mode: 0644]
icons/solo-ibase4.png [new file with mode: 0644]
icons/solo-icon.c [new file with mode: 0644]
icons/solo-web.png [new file with mode: 0644]
icons/solo.ico [new file with mode: 0644]
icons/solo.rc [new file with mode: 0644]
icons/tents-16d24.png [new file with mode: 0644]
icons/tents-16d4.png [new file with mode: 0644]
icons/tents-16d8.png [new file with mode: 0644]
icons/tents-32d24.png [new file with mode: 0644]
icons/tents-32d4.png [new file with mode: 0644]
icons/tents-32d8.png [new file with mode: 0644]
icons/tents-48d24.png [new file with mode: 0644]
icons/tents-48d4.png [new file with mode: 0644]
icons/tents-48d8.png [new file with mode: 0644]
icons/tents-base.png [new file with mode: 0644]
icons/tents-ibase.png [new file with mode: 0644]
icons/tents-ibase4.png [new file with mode: 0644]
icons/tents-icon.c [new file with mode: 0644]
icons/tents-web.png [new file with mode: 0644]
icons/tents.ico [new file with mode: 0644]
icons/tents.rc [new file with mode: 0644]
icons/towers-16d24.png [new file with mode: 0644]
icons/towers-16d4.png [new file with mode: 0644]
icons/towers-16d8.png [new file with mode: 0644]
icons/towers-32d24.png [new file with mode: 0644]
icons/towers-32d4.png [new file with mode: 0644]
icons/towers-32d8.png [new file with mode: 0644]
icons/towers-48d24.png [new file with mode: 0644]
icons/towers-48d4.png [new file with mode: 0644]
icons/towers-48d8.png [new file with mode: 0644]
icons/towers-base.png [new file with mode: 0644]
icons/towers-ibase.png [new file with mode: 0644]
icons/towers-ibase4.png [new file with mode: 0644]
icons/towers-icon.c [new file with mode: 0644]
icons/towers-web.png [new file with mode: 0644]
icons/towers.ico [new file with mode: 0644]
icons/towers.rc [new file with mode: 0644]
icons/tracks-16d24.png [new file with mode: 0644]
icons/tracks-16d4.png [new file with mode: 0644]
icons/tracks-16d8.png [new file with mode: 0644]
icons/tracks-32d24.png [new file with mode: 0644]
icons/tracks-32d4.png [new file with mode: 0644]
icons/tracks-32d8.png [new file with mode: 0644]
icons/tracks-48d24.png [new file with mode: 0644]
icons/tracks-48d4.png [new file with mode: 0644]
icons/tracks-48d8.png [new file with mode: 0644]
icons/tracks-base.png [new file with mode: 0644]
icons/tracks-ibase.png [new file with mode: 0644]
icons/tracks-ibase4.png [new file with mode: 0644]
icons/tracks-icon.c [new file with mode: 0644]
icons/tracks-web.png [new file with mode: 0644]
icons/tracks.ico [new file with mode: 0644]
icons/tracks.rc [new file with mode: 0644]
icons/twiddle-16d24.png [new file with mode: 0644]
icons/twiddle-16d4.png [new file with mode: 0644]
icons/twiddle-16d8.png [new file with mode: 0644]
icons/twiddle-32d24.png [new file with mode: 0644]
icons/twiddle-32d4.png [new file with mode: 0644]
icons/twiddle-32d8.png [new file with mode: 0644]
icons/twiddle-48d24.png [new file with mode: 0644]
icons/twiddle-48d4.png [new file with mode: 0644]
icons/twiddle-48d8.png [new file with mode: 0644]
icons/twiddle-base.png [new file with mode: 0644]
icons/twiddle-ibase.png [new file with mode: 0644]
icons/twiddle-ibase4.png [new file with mode: 0644]
icons/twiddle-icon.c [new file with mode: 0644]
icons/twiddle-web.png [new file with mode: 0644]
icons/twiddle.ico [new file with mode: 0644]
icons/twiddle.rc [new file with mode: 0644]
icons/undead-16d24.png [new file with mode: 0644]
icons/undead-16d4.png [new file with mode: 0644]
icons/undead-16d8.png [new file with mode: 0644]
icons/undead-32d24.png [new file with mode: 0644]
icons/undead-32d4.png [new file with mode: 0644]
icons/undead-32d8.png [new file with mode: 0644]
icons/undead-48d24.png [new file with mode: 0644]
icons/undead-48d4.png [new file with mode: 0644]
icons/undead-48d8.png [new file with mode: 0644]
icons/undead-base.png [new file with mode: 0644]
icons/undead-ibase.png [new file with mode: 0644]
icons/undead-ibase4.png [new file with mode: 0644]
icons/undead-icon.c [new file with mode: 0644]
icons/undead-web.png [new file with mode: 0644]
icons/undead.ico [new file with mode: 0644]
icons/undead.rc [new file with mode: 0644]
icons/unequal-16d24.png [new file with mode: 0644]
icons/unequal-16d4.png [new file with mode: 0644]
icons/unequal-16d8.png [new file with mode: 0644]
icons/unequal-32d24.png [new file with mode: 0644]
icons/unequal-32d4.png [new file with mode: 0644]
icons/unequal-32d8.png [new file with mode: 0644]
icons/unequal-48d24.png [new file with mode: 0644]
icons/unequal-48d4.png [new file with mode: 0644]
icons/unequal-48d8.png [new file with mode: 0644]
icons/unequal-base.png [new file with mode: 0644]
icons/unequal-ibase.png [new file with mode: 0644]
icons/unequal-ibase4.png [new file with mode: 0644]
icons/unequal-icon.c [new file with mode: 0644]
icons/unequal-web.png [new file with mode: 0644]
icons/unequal.ico [new file with mode: 0644]
icons/unequal.rc [new file with mode: 0644]
icons/unruly-16d24.png [new file with mode: 0644]
icons/unruly-16d4.png [new file with mode: 0644]
icons/unruly-16d8.png [new file with mode: 0644]
icons/unruly-32d24.png [new file with mode: 0644]
icons/unruly-32d4.png [new file with mode: 0644]
icons/unruly-32d8.png [new file with mode: 0644]
icons/unruly-48d24.png [new file with mode: 0644]
icons/unruly-48d4.png [new file with mode: 0644]
icons/unruly-48d8.png [new file with mode: 0644]
icons/unruly-base.png [new file with mode: 0644]
icons/unruly-ibase.png [new file with mode: 0644]
icons/unruly-ibase4.png [new file with mode: 0644]
icons/unruly-icon.c [new file with mode: 0644]
icons/unruly-web.png [new file with mode: 0644]
icons/unruly.ico [new file with mode: 0644]
icons/unruly.rc [new file with mode: 0644]
icons/untangle-16d24.png [new file with mode: 0644]
icons/untangle-16d4.png [new file with mode: 0644]
icons/untangle-16d8.png [new file with mode: 0644]
icons/untangle-32d24.png [new file with mode: 0644]
icons/untangle-32d4.png [new file with mode: 0644]
icons/untangle-32d8.png [new file with mode: 0644]
icons/untangle-48d24.png [new file with mode: 0644]
icons/untangle-48d4.png [new file with mode: 0644]
icons/untangle-48d8.png [new file with mode: 0644]
icons/untangle-base.png [new file with mode: 0644]
icons/untangle-ibase.png [new file with mode: 0644]
icons/untangle-ibase4.png [new file with mode: 0644]
icons/untangle-icon.c [new file with mode: 0644]
icons/untangle-web.png [new file with mode: 0644]
icons/untangle.ico [new file with mode: 0644]
icons/untangle.rc [new file with mode: 0644]
install-sh [new file with mode: 0755]
list.c [new file with mode: 0644]
makedist.sh [deleted file]
missing [new file with mode: 0755]
mkfiles.pl
mkmanpages.pl [new file with mode: 0644]
osx-info.plist
padtoolbar.bmp [deleted file]
pearl.c
preprocessed.but [new file with mode: 0644]
puzzles.but
puzzles.cnt [new file with mode: 0644]
puzzles.hlp [new file with mode: 0644]
puzzles.txt [new file with mode: 0644]
slant.c
towers.c
version.c
version.h
wceinf.pl [deleted file]
webpage.pl [deleted file]
website.url [deleted file]
winiss.pl [deleted file]
winwix.mc [deleted file]

diff --git a/.gitignore b/.gitignore
deleted file mode 100644 (file)
index bc2d8cc..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-*.o
-/Makefile*
-/blackbox
-/bridges
-/cube
-/dominosa
-/fifteen
-/fifteensolver
-/filling
-/fillingsolver
-/flip
-/flood
-/galaxies
-/galaxiespicture
-/galaxiessolver
-/guess
-/inertia
-/keen
-/keensolver
-/latincheck
-/lightup
-/lightupsolver
-/loopy
-/loopysolver
-/magnets
-/magnetssolver
-/map
-/mapsolver
-/mines
-/mineobfusc
-/net
-/netslide
-/nullgame
-/numgame
-/obfusc
-/palisade
-/path
-/pattern
-/patternpicture
-/patternsolver
-/pearl
-/pearlbench
-/pegs
-/range
-/rect
-/samegame
-/separate
-/signpost
-/signpostsolver
-/singles
-/singlessolver
-/sixteen
-/slant
-/slantsolver
-/slide
-/slidesolver
-/sokoban
-/solo
-/solosolver
-/tents
-/tentssolver
-/tracks
-/towers
-/towerssolver
-/twiddle
-/undead
-/unequal
-/unequalsolver
-/unruly
-/unrulysolver
-/untangle
-/*.exe
-/*.obj
-/*.map
-/*.rsp
-/*notes
-/HACKING
-/*.hlp
-/*.cnt
-/*.chm
-/*.gid
-/*.GID
-/*.html
-/*.mips
-/*.class
-/*.jar
-/applet.manifest
-/puzzles.txt
-/*.app
-/*.dmg
-/*.res
-/*.inf
-/list.c
-/gamedesc.txt
-/build.log
-/build.out
-/org
-/*.ppc
-/*.i386
-/Puzzles.ppc.bin
-/Puzzles.i386.bin
-/version2.def
-/preprocessed.but
-/*.a
-/aclocal.m4
-/config.log
-/config.status
-/configure
-/depcomp
-/empty.h
-/install-sh
-/missing
-/compile
-/.deps
-/.dirstamp
-/icons/*.png
-/icons/*.ico
-/icons/*.rc
-/icons/*-icon.c
-/icons/.deps
-/icons/.dirstamp
-/unfinished/divvy
-/unfinished/group
-/unfinished/numgame
-/unfinished/path
-/unfinished/pearl
-/unfinished/separate
-/unfinished/slide
-/unfinished/sokoban
diff --git a/Buildscr b/Buildscr
deleted file mode 100644 (file)
index 4a54d27..0000000
--- a/Buildscr
+++ /dev/null
@@ -1,202 +0,0 @@
-# -*- sh -*-
-# Build script to build Puzzles.
-
-module puzzles
-
-set Version $(!builddate).$(vcsid)
-
-# Start by substituting the right version number in configure.ac.
-in puzzles do perl -i~ -pe 's/6.66/$(Version)/' configure.ac
-in puzzles do rm configure.ac~
-
-# And put it into the documentation as a versionid.
-# use perl to avoid inconsistent behaviour of echo '\v'
-in puzzles do perl -e 'print "\n\\versionid Simon Tatham'\''s Portable Puzzle Collection, version $$ARGV[0]\n"' $(Version) >> puzzles.but
-in puzzles do perl -e 'print "\n\\versionid Simon Tatham'\''s Portable Puzzle Collection, version $$ARGV[0]\n"' $(Version) >> devel.but
-
-# Write out a version.h that contains the real version number.
-in puzzles do echo '/* Generated by automated build script */' > version.h
-in puzzles do echo '$#define VER "Version $(Version)"' >> version.h
-
-# And do the same substitution in the OS X metadata. (This is a bit
-# icky in principle because it presumes that my version numbers don't
-# need XML escaping, but frankly, if they ever do then I should fix
-# them!)
-in puzzles do perl -i -pe 's/Unidentified build/$(Version)/' osx-info.plist
-
-# First build some local binaries, to run the icon build.
-in puzzles do perl mkfiles.pl -U CFLAGS='-Wwrite-strings -Werror'
-in puzzles do make
-
-# Now build the screenshots and icons.
-in puzzles/icons do xvfb-run -s "-screen 0 1024x768x24" make web winicons gtkicons
-
-# Destroy the local binaries and autoconf detritus, mostly to avoid
-# wasting network bandwidth by transferring them to the delegate
-# servers.
-in puzzles do make distclean
-
-# Re-run mkfiles.pl now that it knows the icons are there.
-in puzzles do perl mkfiles.pl
-
-# Rebuild the configure script.
-in puzzles do ./mkauto.sh
-
-# Build the OS X .dmg archive.
-delegate osx
-  in puzzles do make -f Makefile.osx clean
-  in puzzles do make -f Makefile.osx release VER=-DVER=$(Version) XFLAGS='-Wwrite-strings -Werror'
-  return puzzles/Puzzles.dmg
-enddelegate
-
-# Build the Windows binaries and installer, and the CHM file.
-in puzzles do make -f Makefile.doc clean
-in puzzles do make -f Makefile.doc # build help files for installer
-in puzzles do mason.pl --args '{"version":"$(Version)","descfile":"gamedesc.txt"}' winwix.mc > puzzles.wxs
-in puzzles do perl winiss.pl $(Version) gamedesc.txt > puzzles.iss
-ifneq "$(VISUAL_STUDIO)" "yes" then
-  in puzzles with clangcl64 do Platform=x64 make -f Makefile.clangcl clean
-  in puzzles with clangcl64 do Platform=x64 make -f Makefile.clangcl VER=-DVER=$(Version) XFLAGS='-Wwrite-strings -Werror'
-  # Code-sign the binaries, if the local bob config provides a script
-  # to do so. We assume here that the script accepts an -i option to
-  # provide a 'more info' URL, and an optional -n option to provide a
-  # program name, and that it can take multiple .exe filename
-  # arguments and sign them all in place.
-  ifneq "$(cross_winsigncode)" "" in puzzles do $(cross_winsigncode) -i https://www.chiark.greenend.org.uk/~sgtatham/puzzles/ *.exe
-  # Build installers.
-  in puzzles with wixonlinux do candle -arch x64 puzzles.wxs && light -ext WixUIExtension -sval puzzles.wixobj
-  ifneq "$(cross_winsigncode)" "" in puzzles do $(cross_winsigncode) -i https://www.chiark.greenend.org.uk/~sgtatham/puzzles/ -n "Simon Tatham's Portable Puzzle Collection Installer" puzzles.msi
-else
-  delegate windows
-    in puzzles with visualstudio do/win nmake -f Makefile.vc clean
-    in puzzles with visualstudio do/win nmake -f Makefile.vc VER=-DVER=$(Version)
-    ifneq "$(winsigncode)" "" in puzzles do $(winsigncode) -i https://www.chiark.greenend.org.uk/~sgtatham/puzzles/ *.exe
-    # Build installers.
-    in puzzles with wix do/win candle puzzles.wxs && light -ext WixUIExtension -sval puzzles.wixobj
-    in puzzles with innosetup do/win iscc puzzles.iss
-    return puzzles/*.exe
-    return puzzles/puzzles.msi
-  enddelegate
-endif
-in puzzles do chmod +x *.exe
-
-# Build the Pocket PC binaries and CAB.
-#
-# NOTE: This part of the build script requires the Windows delegate
-# server to have the cabwiz program on its PATH. This will
-# typically be at
-#
-#   C:\Program Files\Windows CE Tools\WCE420\POCKET PC 2003\Tools
-#
-# but it might not be if you've installed it somewhere else, or
-# have a different version.
-#
-# NOTE ALSO: This part of the build is commented out, for the
-# moment, because cabwiz does unhelpful things when run from within
-# a bob delegate process (or, more generally, when run from any
-# terminal-based remote login to a Windows machine, including
-# Cygwin opensshd and Windows Telnet). The symptom is that cabwiz
-# just beeps and sits there. Until I figure out how to build the
-# .cab from an automated process (and I'm willing to consider silly
-# approaches such as a third-party CAB generator), I don't think I
-# can sensibly enable this build.
-
-#in puzzles do perl wceinf.pl gamedesc.txt > puzzles.inf
-#delegate windows
-#  in puzzles do cmd /c 'wcearmv4 & nmake -f Makefile.wce clean'
-#  in puzzles do cmd /c 'wcearmv4 & nmake -f Makefile.wce VER=-DVER=$(Version)'
-#  # Nasty piece of sh here which saves the return code from cabwiz,
-#  # outputs its errors and/or warnings, and then propagates the
-#  # return code back to bob. If only cabwiz could output to
-#  # standard error LIKE EVERY OTHER COMMAND-LINE UTILITY IN THE
-#  # WORLD, I wouldn't have to do this.
-#  in puzzles do cat puzzles.inf
-#  in puzzles do cmd /c 'wcearmv4 & bash -c cabwiz puzzles.inf /err cabwiz.err /cpu ARMV4'; a=$$?; cat cabwiz.err; exit $$a
-#  return puzzles/puzzles.armv4.cab
-#enddelegate
-
-# Build the HTML docs.
-in puzzles do mkdir doc
-in puzzles do mkdir devel
-in puzzles/doc do halibut --html -Chtml-contents-filename:index.html -Chtml-index-filename:indexpage.html -Chtml-template-filename:%k.html -Chtml-template-fragment:%k ../puzzles.but
-in puzzles/devel do halibut --html -Chtml-contents-filename:index.html -Chtml-index-filename:indexpage.html -Chtml-template-filename:%k.html -Chtml-template-fragment:%k ../devel.but
-
-# Move the deliver-worthy Windows binaries (those specified in
-# gamedesc.txt, which is generated by mkfiles.pl and helpfully
-# excludes the command-line auxiliary utilities such as solosolver,
-# and nullgame.exe) into a subdirectory for easy access.
-in puzzles do mkdir winbin
-in puzzles do mv `cut -f2 -d: gamedesc.txt` winbin
-
-# Make a zip file of the Windows binaries and help files.
-in puzzles do zip -j puzzles.zip winbin/*.exe puzzles.chm puzzles.hlp puzzles.cnt
-
-# Create the source archive. (That writes the archive into the
-# _parent_ directory, so be careful when we deliver it.)
-in puzzles do ./makedist.sh $(Version)
-
-# Build the autogenerated pieces of the main web page.
-in puzzles do perl webpage.pl
-
-ifneq "$(JAVA_UNFINISHED)" "" in puzzles do perl -i~ -pe 'print "!srcdir unfinished/\n" if /!srcdir icons/' Recipe
-ifneq "$(JAVA_UNFINISHED)" "" in puzzles do ln -s unfinished/group.R .
-ifneq "$(JAVA_UNFINISHED)" "" in puzzles do perl mkfiles.pl
-
-# Build the Java applets.
-delegate nestedvm
-  in puzzles do make -f Makefile.nestedvm NESTEDVM="$$NESTEDVM" VER=-DVER=$(Version) XFLAGS="-Wwrite-strings -Werror"
-  return puzzles/*.jar
-enddelegate
-
-# Build the Javascript applets. Since my master build machine doesn't
-# have the right dependencies installed for Emscripten, I do this by a
-# delegation.
-in puzzles do mkdir js # so we can tell output .js files from emcc*.js
-delegate emscripten
-  in puzzles do make -f Makefile.emcc OUTPREFIX=js/ clean
-  in puzzles do make -f Makefile.emcc OUTPREFIX=js/ XFLAGS="-Wwrite-strings -Werror"
-  return puzzles/js/*.js
-enddelegate
-
-# Build a set of wrapping HTML pages for easy testing of the
-# Javascript puzzles. These aren't quite the same as the versions that
-# will go on my live website, because those ones will substitute in a
-# different footer, and not have to link to the .js files with the
-# ../js/ prefix. But these ones should be good enough to just open
-# using a file:// URL in a browser after running a build, and make
-# sure the main functionality works.
-in puzzles do mkdir jstest
-in puzzles/jstest do ../html/jspage.pl --jspath=../js/ /dev/null ../html/*.html
-
-# Set up .htaccess containing a redirect for the archive filename.
-in puzzles do echo "AddType application/octet-stream .chm" > .htaccess
-in puzzles do echo "AddType application/octet-stream .hlp" >> .htaccess
-in puzzles do echo "AddType application/octet-stream .cnt" >> .htaccess
-in . do set -- puzzles*.tar.gz; echo RedirectMatch temp '(.*/)'puzzles.tar.gz '$$1'"$$1" >> puzzles/.htaccess
-in puzzles do echo RedirectMatch temp '(.*/)'puzzles-installer.msi '$$1'puzzles-$(Version)-installer.msi >> .htaccess
-
-# Phew, we're done. Deliver everything!
-deliver puzzles/icons/*-web.png $@
-deliver puzzles/winbin/*.exe $@
-deliver puzzles/.htaccess $@
-deliver puzzles/doc/*.html doc/$@
-deliver puzzles/devel/*.html devel/$@
-deliver puzzles/Puzzles.dmg $@
-deliver puzzles/puzzles.chm $@
-deliver puzzles/puzzles.hlp $@
-deliver puzzles/puzzles.cnt $@
-deliver puzzles/puzzles.zip $@
-deliver puzzles/puzzles.msi puzzles-$(Version)-installer.msi
-deliver puzzles/*.jar java/$@
-deliver puzzles/js/*.js js/$@
-deliver puzzles/jstest/*.html jstest/$@
-deliver puzzles/html/*.html html/$@
-deliver puzzles/html/*.pl html/$@
-deliver puzzles/wwwspans.html $@
-deliver puzzles/wwwlinks.html $@
-
-# deliver puzzles/puzzles.armv4.cab $@ # (not built at the moment)
-
-# This one isn't in the puzzles subdir, because makedist.sh left it
-# one level up.
-deliver puzzles*.tar.gz $@
diff --git a/CHECKLST.txt b/CHECKLST.txt
deleted file mode 100644 (file)
index 2bef909..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-Useful checklists
-=================
-
-Things to remember when adding a new puzzle
--------------------------------------------
-
-Write the source file for the new puzzle (duhh).
-
-Create a .R file for it which:
- - defines a <puzzle>_EXTRA symbol for it if it requires auxiliary
-   object files (make sure that symbol doesn't contain the icon)
- - adds it to the `ALL' definition, to ensure it is compiled into
-   the OS X binary
- - adds it as a GTK build target, with the optional GTK icon
- - adds it as a Windows build target, with the optional resource
-   file
- - adds auxiliary solver binaries if any
- - adds it to $(GAMES) in both the automake and GTK makefiles, for
-   `make install'
- - adds it to list.c for the OS X binary
- - adds it to gamedesc.txt, with its Windows executable name, display
-   name, and slightly longer description.
-
-If the puzzle is by a new author, modify the copyright notice in
-LICENCE and in puzzles.but. (Also in index.html, but that's listed
-below under website changes.)
-
-Double-check that the game structure name in the source file has
-been renamed from `nullgame', so that it'll work on OS X. Actually
-compiling it on OS X would be a good way to check this, if
-convenient.
-
-Add a documentation section in puzzles.but.
-
-Make sure there's a Windows help topic name defined in puzzles.but,
-and that it's referenced by the help topic field in the game
-structure in the source file.
-
-Check that REQUIRE_RBUTTON and/or REQUIRE_NUMPAD are set as
-appropriate.
-
-Add the new Unix binary name, and the names of any auxiliary solver
-binaries, to .gitignore.
-
-Write an instructions fragment for the webified puzzle pages, as
-html/<puzzlename>.html .
-
-Make a screenshot:
- - create an appropriate save file in `icons'
- - add the puzzle name to icons/Makefile
- - set up a REDO property in icons/Makefile if the screenshot wants
-   to display a move halfway through an animation
- - set up a CROP property in icons/Makefile if the icon wants to be
-   a sub-rectangle of the whole screenshot
-
-Don't forget to `git add' the new source file, the new .R file and the
-save file in `icons', the new .html file, and any other new files that
-might have been involved.
-
-Check in!
-
-Put the puzzle on the web:
- - run puzzlesnap.sh
- - adjust the copyright in index-mid.html if the puzzle is by a new
-   author
- - check that the new puzzle has appeared on the staging web page
- - test both Windows binary links, the docs link, the Javascript
-   version and the Java version
- - run webupdate
- - test all those things once more on the live website
diff --git a/HACKING b/HACKING
new file mode 100644 (file)
index 0000000..91defd4
--- /dev/null
+++ b/HACKING
@@ -0,0 +1,4749 @@
+Developer documentation for Simon Tatham's puzzle collection
+============================================================
+
+This is a guide to the internal structure of Simon Tatham's Portable
+Puzzle Collection (henceforth referred to simply as `Puzzles'), for
+use by anyone attempting to implement a new puzzle or port to a new
+platform.
+
+This guide is believed correct as of r6190. Hopefully it will be updated
+along with the code in future, but if not, I've at least left this
+version number in here so you can figure out what's changed by tracking
+commit comments from there onwards.
+
+1. Introduction
+---------------
+
+The Puzzles code base is divided into four parts: a set of
+interchangeable front ends, a set of interchangeable back ends, a
+universal `middle end' which acts as a buffer between the two, and a
+bunch of miscellaneous utility functions. In the following sections I
+give some general discussion of each of these parts.
+
+1.1. Front end
+--------------
+
+The front end is the non-portable part of the code: it's the bit that
+you replace completely when you port to a different platform. So it's
+responsible for all system calls, all GUI interaction, and anything else
+platform-specific.
+
+The current front ends in the main code base are for Windows, GTK and
+MacOS X; I also know of a third-party front end for PalmOS.
+
+The front end contains main() or the local platform's equivalent. Top-
+level control over the application's execution flow belongs to the front
+end (it isn't, for example, a set of functions called by a universal
+main() somewhere else).
+
+The front end has complete freedom to design the GUI for any given
+port of Puzzles. There is no centralised mechanism for maintaining the
+menu layout, for example. This has a cost in consistency (when I _do_
+want the same menu layout on more than one platform, I have to edit
+two pieces of code in parallel every time I make a change), but the
+advantage is that local GUI conventions can be conformed to and local
+constraints adapted to. For example, MacOS X has strict human interface
+guidelines which specify a different menu layout from the one I've used
+on Windows and GTK; there's nothing stopping the OS X front end from
+providing a menu layout consistent with those guidelines.
+
+Although the front end is mostly caller rather than the callee in its
+interactions with other parts of the code, it is required to implement
+a small API for other modules to call, mostly of drawing functions for
+games to use when drawing their graphics. The drawing API is documented
+in chapter 3; the other miscellaneous front end API functions are
+documented in section 4.35.
+
+1.2. Back end
+-------------
+
+A `back end', in this collection, is synonymous with a `puzzle'. Each
+back end implements a different game.
+
+At the top level, a back end is simply a data structure, containing a
+few constants (flag words, preferred pixel size) and a large number of
+function pointers. Back ends are almost invariably callee rather than
+caller, which means there's a limitation on what a back end can do on
+its own initiative.
+
+The persistent state in a back end is divided into a number of data
+structures, which are used for different purposes and therefore likely
+to be switched around, changed without notice, and otherwise updated by
+the rest of the code. It is important when designing a back end to put
+the right pieces of data into the right structures, or standard midend-
+provided features (such as Undo) may fail to work.
+
+The functions and variables provided in the back end data structure are
+documented in chapter 2.
+
+1.3. Middle end
+---------------
+
+Puzzles has a single and universal `middle end'. This code is common to
+all platforms and all games; it sits in between the front end and the
+back end and provides standard functionality everywhere.
+
+People adding new back ends or new front ends should generally not need
+to edit the middle end. On rare occasions there might be a change that
+can be made to the middle end to permit a new game to do something not
+currently anticipated by the middle end's present design; however, this
+is terribly easy to get wrong and should probably not be undertaken
+without consulting the primary maintainer (me). Patch submissions
+containing unannounced mid-end changes will be treated on their merits
+like any other patch; this is just a friendly warning that mid-end
+changes will need quite a lot of merits to make them acceptable.
+
+Functionality provided by the mid-end includes:
+
+ -  Maintaining a list of game state structures and moving back and
+    forth along that list to provide Undo and Redo.
+
+ -  Handling timers (for move animations, flashes on completion, and in
+    some cases actually timing the game).
+
+ -  Handling the container format of game IDs: receiving them, picking
+    them apart into parameters, description and/or random seed, and
+    so on. The game back end need only handle the individual parts
+    of a game ID (encoded parameters and encoded game description);
+    everything else is handled centrally by the mid-end.
+
+ -  Handling standard keystrokes and menu commands, such as `New Game',
+    `Restart Game' and `Quit'.
+
+ -  Pre-processing mouse events so that the game back ends can rely on
+    them arriving in a sensible order (no missing button-release events,
+    no sudden changes of which button is currently pressed, etc).
+
+ -  Handling the dialog boxes which ask the user for a game ID.
+
+ -  Handling serialisation of entire games (for loading and saving a
+    half-finished game to a disk file, or for handling application
+    shutdown and restart on platforms such as PalmOS where state is
+    expected to be saved).
+
+Thus, there's a lot of work done once by the mid-end so that individual
+back ends don't have to worry about it. All the back end has to do is
+cooperate in ensuring the mid-end can do its work properly.
+
+The API of functions provided by the mid-end to be called by the front
+end is documented in chapter 4.
+
+1.4. Miscellaneous utilities
+----------------------------
+
+In addition to these three major structural components, the Puzzles code
+also contains a variety of utility modules usable by all of the above
+components. There is a set of functions to provide platform-independent
+random number generation; functions to make memory allocation easier;
+functions which implement a balanced tree structure to be used as
+necessary in complex algorithms; and a few other miscellaneous
+functions. All of these are documented in chapter 5.
+
+1.5. Structure of this guide
+----------------------------
+
+There are a number of function call interfaces within Puzzles, and this
+guide will discuss each one in a chapter of its own. After that, chapter
+6 discusses how to design new games, with some general design thoughts
+and tips.
+
+2. Interface to the back end
+----------------------------
+
+This chapter gives a detailed discussion of the interface that each back
+end must implement.
+
+At the top level, each back end source file exports a single global
+symbol, which is a `const struct game' containing a large number of
+function pointers and a small amount of constant data. This structure is
+called by different names depending on what kind of platform the puzzle
+set is being compiled on:
+
+ -  On platforms such as Windows and GTK, which build a separate binary
+    for each puzzle, the game structure in every back end has the same
+    name, `thegame'; the front end refers directly to this name, so that
+    compiling the same front end module against a different back end
+    module builds a different puzzle.
+
+ -  On platforms such as MacOS X and PalmOS, which build all the puzzles
+    into a single monolithic binary, the game structure in each back end
+    must have a different name, and there's a helper module `list.c'
+    (constructed automatically by the same Perl script that builds the
+    Makefiles) which contains a complete list of those game structures.
+
+On the latter type of platform, source files may assume that the
+preprocessor symbol `COMBINED' has been defined. Thus, the usual code to
+declare the game structure looks something like this:
+
+  #ifdef COMBINED
+  #define thegame net    /* or whatever this game is called */
+  #endif
+  
+  const struct game thegame = {
+      /* lots of structure initialisation in here */
+  };
+
+Game back ends must also internally define a number of data structures,
+for storing their various persistent state. This chapter will first
+discuss the nature and use of those structures, and then go on to give
+details of every element of the game structure.
+
+2.1. Data structures
+--------------------
+
+Each game is required to define four separate data structures. This
+section discusses each one and suggests what sorts of things need to be
+put in it.
+
+2.1.1. `game_params'
+--------------------
+
+The `game_params' structure contains anything which affects the
+automatic generation of new puzzles. So if puzzle generation is
+parametrised in any way, those parameters need to be stored in
+`game_params'.
+
+Most puzzles currently in this collection are played on a grid of
+squares, meaning that the most obvious parameter is the grid size. Many
+puzzles have additional parameters; for example, Mines allows you to
+control the number of mines in the grid independently of its size, Net
+can be wrapping or non-wrapping, Solo has difficulty levels and symmetry
+settings, and so on.
+
+A simple rule for deciding whether a data item needs to go in
+`game_params' is: would the user expect to be able to control this data
+item from either the preset-game-types menu or the `Custom' game type
+configuration? If so, it's part of `game_params'.
+
+`game_params' structures are permitted to contain pointers to subsidiary
+data if they need to. The back end is required to provide functions to
+create and destroy `game_params', and those functions can allocate and
+free additional memory if necessary. (It has not yet been necessary to
+do this in any puzzle so far, but the capability is there just in case.)
+
+`game_params' is also the only structure which the game's compute_size()
+function may refer to; this means that any aspect of the game which
+affects the size of the window it needs to be drawn in must be stored in
+`game_params'. In particular, this imposes the fundamental limitation
+that random game generation may not have a random effect on the window
+size: game generation algorithms are constrained to work by starting
+from the grid size rather than generating it as an emergent phenomenon.
+(Although this is a restriction in theory, it has not yet seemed to be a
+problem.)
+
+2.1.2. `game_state'
+-------------------
+
+While the user is actually playing a puzzle, the `game_state' structure
+stores all the data corresponding to the current state of play.
+
+The mid-end keeps `game_state's in a list, and adds to the list every
+time the player makes a move; the Undo and Redo functions step back and
+forth through that list.
+
+Therefore, a good means of deciding whether a data item needs to go in
+`game_state' is: would a player expect that data item to be restored on
+undo? If so, put it in `game_state', and this will automatically happen
+without you having to lift a finger. If not - for example, the deaths
+counter in Mines is precisely something that does _not_ want to be reset
+to its previous state on an undo - then you might have found a data item
+that needs to go in `game_ui' instead.
+
+During play, `game_state's are often passed around without an
+accompanying `game_params' structure. Therefore, any information in
+`game_params' which is important during play (such as the grid size)
+must be duplicated within the `game_state'. One simple method of doing
+this is to have the `game_state' structure _contain_ a `game_params'
+structure as one of its members, although this isn't obligatory if you
+prefer to do it another way.
+
+2.1.3. `game_drawstate'
+-----------------------
+
+`game_drawstate' carries persistent state relating to the current
+graphical contents of the puzzle window. The same `game_drawstate'
+is passed to every call to the game redraw function, so that it can
+remember what it has already drawn and what needs redrawing.
+
+A typical use for a `game_drawstate' is to have an array mirroring the
+array of grid squares in the `game_state'; then every time the redraw
+function was passed a `game_state', it would loop over all the squares,
+and physically redraw any whose description in the `game_state' (i.e.
+what the square needs to look like when the redraw is completed) did
+not match its description in the `game_drawstate' (i.e. what the square
+currently looks like).
+
+`game_drawstate' is occasionally completely torn down and reconstructed
+by the mid-end, if the user somehow forces a full redraw. Therefore, no
+data should be stored in `game_drawstate' which is _not_ related to the
+state of the puzzle window, because it might be unexpectedly destroyed.
+
+The back end provides functions to create and destroy `game_drawstate',
+which means it can contain pointers to subsidiary allocated data if it
+needs to. A common thing to want to allocate in a `game_drawstate' is a
+`blitter'; see section 3.1.13 for more on this subject.
+
+2.1.4. `game_ui'
+----------------
+
+`game_ui' contains whatever doesn't fit into the above three structures!
+
+A new `game_ui' is created when the user begins playing a new instance
+of a puzzle (i.e. during `New Game' or after entering a game ID etc). It
+persists until the user finishes playing that game and begins another
+one (or closes the window); in particular, `Restart Game' does _not_
+destroy the `game_ui'.
+
+`game_ui' is useful for implementing user-interface state which is not
+part of `game_state'. Common examples are keyboard control (you wouldn't
+want to have to separately Undo through every cursor motion) and mouse
+dragging. See section 6.3.2 and section 6.3.3, respectively, for more
+details.
+
+Another use for `game_ui' is to store highly persistent data such as
+the Mines death counter. This is conceptually rather different: where
+the Net cursor position was _not important enough_ to preserve for the
+player to restore by Undo, the Mines death counter is _too important_ to
+permit the player to revert by Undo!
+
+A final use for `game_ui' is to pass information to the redraw function
+about recent changes to the game state. This is used in Mines, for
+example, to indicate whether a requested `flash' should be a white flash
+for victory or a red flash for defeat; see section 6.3.5.
+
+2.2. Simple data in the back end
+--------------------------------
+
+In this section I begin to discuss each individual element in the back
+end structure. To begin with, here are some simple self-contained data
+elements.
+
+2.2.1. `name'
+-------------
+
+  const char *name;
+
+This is a simple ASCII string giving the name of the puzzle. This name
+will be used in window titles, in game selection menus on monolithic
+platforms, and anywhere else that the front end needs to know the name
+of a game.
+
+2.2.2. `winhelp_topic'
+----------------------
+
+  const char *winhelp_topic;
+
+This member is used on Windows only, to provide online help. Although
+the Windows front end provides a separate binary for each puzzle, it has
+a single monolithic help file; so when a user selects `Help' from the
+menu, the program needs to open the help file and jump to the chapter
+describing that particular puzzle.
+
+Therefore, each chapter in `puzzles.but' is labelled with a _help topic_
+name, similar to this:
+
+  \cfg{winhelp-topic}{games.net}
+
+And then the corresponding game back end encodes the topic string (here
+`games.net') in the `winhelp_topic' element of the game structure.
+
+2.3. Handling game parameter sets
+---------------------------------
+
+In this section I present the various functions which handle the
+`game_params' structure.
+
+2.3.1. default_params()
+-----------------------
+
+  game_params *(*default_params)(void);
+
+This function allocates a new `game_params' structure, fills it with the
+default values, and returns a pointer to it.
+
+2.3.2. fetch_preset()
+---------------------
+
+  int (*fetch_preset)(int i, char **name, game_params **params);
+
+This function is used to populate the `Type' menu, which provides a list
+of conveniently accessible preset parameters for most games.
+
+The function is called with `i' equal to the index of the preset
+required (numbering from zero). It returns FALSE if that preset does
+not exist (if `i' is less than zero or greater than the largest preset
+index). Otherwise, it sets `*params' to point at a newly allocated
+`game_params' structure containing the preset information, sets `*name'
+to point at a newly allocated C string containing the preset title (to
+go on the `Type' menu), and returns TRUE.
+
+If the game does not wish to support any presets at all, this function
+is permitted to return FALSE always.
+
+2.3.3. encode_params()
+----------------------
+
+  char *(*encode_params)(const game_params *params, int full);
+
+The job of this function is to take a `game_params', and encode it in
+a string form for use in game IDs. The return value must be a newly
+allocated C string, and _must_ not contain a colon or a hash (since
+those characters are used to mark the end of the parameter section in a
+game ID).
+
+Ideally, it should also not contain any other potentially controversial
+punctuation; bear in mind when designing a string parameter format
+that it will probably be used on both Windows and Unix command lines
+under a variety of exciting shell quoting and metacharacter rules.
+Sticking entirely to alphanumerics is the safest thing; if you really
+need punctuation, you can probably get away with commas, periods or
+underscores without causing anybody any major inconvenience. If you
+venture far beyond that, you're likely to irritate _somebody_.
+
+(At the time of writing this, all existing games have purely
+alphanumeric string parameter formats. Usually these involve a letter
+denoting a parameter, followed optionally by a number giving the value
+of that parameter, with a few mandatory parts at the beginning such as
+numeric width and height separated by `x'.)
+
+If the `full' parameter is TRUE, this function should encode absolutely
+everything in the `game_params', such that a subsequent call to
+decode_params() (section 2.3.4) will yield an identical structure.
+If `full' is FALSE, however, you should leave out anything which
+is not necessary to describe a _specific puzzle instance_, i.e.
+anything which only takes effect when a new puzzle is _generated_.
+For example, the Solo `game_params' includes a difficulty rating used
+when constructing new puzzles; but a Solo game ID need not explicitly
+include the difficulty, since to describe a puzzle once generated it's
+sufficient to give the grid dimensions and the location and contents
+of the clue squares. (Indeed, one might very easily type in a puzzle
+out of a newspaper without _knowing_ what its difficulty level is in
+Solo's terminology.) Therefore, Solo's encode_params() only encodes the
+difficulty level if `full' is set.
+
+2.3.4. decode_params()
+----------------------
+
+  void (*decode_params)(game_params *params, char const *string);
+
+This function is the inverse of encode_params() (section 2.3.3). It
+parses the supplied string and fills in the supplied `game_params'
+structure. Note that the structure will _already_ have been allocated:
+this function is not expected to create a _new_ `game_params', but to
+modify an existing one.
+
+This function can receive a string which only encodes a subset of the
+parameters. The most obvious way in which this can happen is if the
+string was constructed by encode_params() with its `full' parameter set
+to FALSE; however, it could also happen if the user typed in a parameter
+set manually and missed something out. Be prepared to deal with a wide
+range of possibilities.
+
+When dealing with a parameter which is not specified in the input
+string, what to do requires a judgment call on the part of the
+programmer. Sometimes it makes sense to adjust other parameters to bring
+them into line with the new ones. In Mines, for example, you would
+probably not want to keep the same mine count if the user dropped the
+grid size and didn't specify one, since you might easily end up with
+more mines than would actually fit in the grid! On the other hand,
+sometimes it makes sense to leave the parameter alone: a Solo player
+might reasonably expect to be able to configure size and difficulty
+independently of one another.
+
+This function currently has no direct means of returning an error if the
+string cannot be parsed at all. However, the returned `game_params' is
+almost always subsequently passed to validate_params() (section 2.3.10),
+so if you really want to signal parse errors, you could always have a
+`char *' in your parameters structure which stored an error message, and
+have validate_params() return it if it is non-NULL.
+
+2.3.5. free_params()
+--------------------
+
+  void (*free_params)(game_params *params);
+
+This function frees a `game_params' structure, and any subsidiary
+allocations contained within it.
+
+2.3.6. dup_params()
+-------------------
+
+  game_params *(*dup_params)(const game_params *params);
+
+This function allocates a new `game_params' structure and initialises it
+with an exact copy of the information in the one provided as input. It
+returns a pointer to the new duplicate.
+
+2.3.7. `can_configure'
+----------------------
+
+  int can_configure;
+
+This boolean data element is set to TRUE if the back end supports
+custom parameter configuration via a dialog box. If it is TRUE, then
+the functions configure() and custom_params() are expected to work. See
+section 2.3.8 and section 2.3.9 for more details.
+
+2.3.8. configure()
+------------------
+
+  config_item *(*configure)(const game_params *params);
+
+This function is called when the user requests a dialog box for
+custom parameter configuration. It returns a newly allocated array of
+config_item structures, describing the GUI elements required in the
+dialog box. The array should have one more element than the number of
+controls, since it is terminated with a C_END marker (see below). Each
+array element describes the control together with its initial value; the
+front end will modify the value fields and return the updated array to
+custom_params() (see section 2.3.9).
+
+The config_item structure contains the following elements:
+
+  char *name;
+  int type;
+  char *sval;
+  int ival;
+
+`name' is an ASCII string giving the textual label for a GUI control. It
+is _not_ expected to be dynamically allocated.
+
+`type' contains one of a small number of `enum' values defining what
+type of control is being described. The meaning of the `sval' and `ival'
+fields depends on the value in `type'. The valid values are:
+
+`C_STRING'
+
+    Describes a text input box. (This is also used for numeric input.
+    The back end does not bother informing the front end that the box is
+    numeric rather than textual; some front ends do have the capacity
+    to take this into account, but I decided it wasn't worth the extra
+    complexity in the interface.) For this type, `ival' is unused, and
+    `sval' contains a dynamically allocated string representing the
+    contents of the input box.
+
+`C_BOOLEAN'
+
+    Describes a simple checkbox. For this type, `sval' is unused, and
+    `ival' is TRUE or FALSE.
+
+`C_CHOICES'
+
+    Describes a drop-down list presenting one of a small number of
+    fixed choices. For this type, `sval' contains a list of strings
+    describing the choices; the very first character of `sval' is
+    used as a delimiter when processing the rest (so that the strings
+    `:zero:one:two', `!zero!one!two' and `xzeroxonextwo' all define
+    a three-element list containing `zero', `one' and `two'). `ival'
+    contains the index of the currently selected element, numbering from
+    zero (so that in the above example, 0 would mean `zero' and 2 would
+    mean `two').
+
+    Note that for this control type, `sval' is _not_ dynamically
+    allocated, whereas it was for `C_STRING'.
+
+`C_END'
+
+    Marks the end of the array of `config_item's. All other fields are
+    unused.
+
+The array returned from this function is expected to have filled in the
+initial values of all the controls according to the input `game_params'
+structure.
+
+If the game's `can_configure' flag is set to FALSE, this function is
+never called and need not do anything at all.
+
+2.3.9. custom_params()
+----------------------
+
+  game_params *(*custom_params)(const config_item *cfg);
+
+This function is the counterpart to configure() (section 2.3.8). It
+receives as input an array of `config_item's which was originally
+created by configure(), but in which the control values have since been
+changed in accordance with user input. Its function is to read the new
+values out of the controls and return a newly allocated `game_params'
+structure representing the user's chosen parameter set.
+
+(The front end will have modified the controls' _values_, but there will
+still always be the same set of controls, in the same order, as provided
+by configure(). It is not necessary to check the `name' and `type'
+fields, although you could use assert() if you were feeling energetic.)
+
+This function is not expected to (and indeed _must not_) free the input
+`config_item' array. (If the parameters fail to validate, the dialog box
+will stay open.)
+
+If the game's `can_configure' flag is set to FALSE, this function is
+never called and need not do anything at all.
+
+2.3.10. validate_params()
+-------------------------
+
+  char *(*validate_params)(const game_params *params, int full);
+
+This function takes a `game_params' structure as input, and checks that
+the parameters described in it fall within sensible limits. (At the very
+least, grid dimensions should almost certainly be strictly positive, for
+example.)
+
+Return value is NULL if no problems were found, or alternatively a (non-
+dynamically-allocated) ASCII string describing the error in human-
+readable form.
+
+If the `full' parameter is set, full validation should be performed: any
+set of parameters which would not permit generation of a sensible puzzle
+should be faulted. If `full' is _not_ set, the implication is that
+these parameters are not going to be used for _generating_ a puzzle; so
+parameters which can't even sensibly _describe_ a valid puzzle should
+still be faulted, but parameters which only affect puzzle generation
+should not be.
+
+(The `full' option makes a difference when parameter combinations are
+non-orthogonal. For example, Net has a boolean option controlling
+whether it enforces a unique solution; it turns out that it's impossible
+to generate a uniquely soluble puzzle with wrapping walls and width
+2, so validate_params() will complain if you ask for one. However,
+if the user had just been playing a unique wrapping puzzle of a more
+sensible width, and then pastes in a game ID acquired from somebody else
+which happens to describe a _non_-unique wrapping width-2 puzzle, then
+validate_params() will be passed a `game_params' containing the width
+and wrapping settings from the new game ID and the uniqueness setting
+from the old one. This would be faulted, if it weren't for the fact that
+`full' is not set during this call, so Net ignores the inconsistency.
+The resulting `game_params' is never subsequently used to generate a
+puzzle; this is a promise made by the mid-end when it asks for a non-
+full validation.)
+
+2.4. Handling game descriptions
+-------------------------------
+
+In this section I present the functions that deal with a textual
+description of a puzzle, i.e. the part that comes after the colon in a
+descriptive-format game ID.
+
+2.4.1. new_desc()
+-----------------
+
+  char *(*new_desc)(const game_params *params, random_state *rs,
+                    char **aux, int interactive);
+
+This function is where all the really hard work gets done. This is
+the function whose job is to randomly generate a new puzzle, ensuring
+solubility and uniqueness as appropriate.
+
+As input it is given a `game_params' structure and a random state
+(see section 5.1 for the random number API). It must invent a puzzle
+instance, encode it in string form, and return a dynamically allocated C
+string containing that encoding.
+
+Additionally, it may return a second dynamically allocated string
+in `*aux'. (If it doesn't want to, then it can leave that parameter
+completely alone; it isn't required to set it to NULL, although doing
+so is harmless.) That string, if present, will be passed to solve()
+(section 2.7.4) later on; so if the puzzle is generated in such a way
+that a solution is known, then information about that solution can be
+saved in `*aux' for solve() to use.
+
+The `interactive' parameter should be ignored by almost all puzzles.
+Its purpose is to distinguish between generating a puzzle within a GUI
+context for immediate play, and generating a puzzle in a command-line
+context for saving to be played later. The only puzzle that currently
+uses this distinction (and, I fervently hope, the only one which will
+_ever_ need to use it) is Mines, which chooses a random first-click
+location when generating puzzles non-interactively, but which waits
+for the user to place the first click when interactive. If you think
+you have come up with another puzzle which needs to make use of this
+parameter, please think for at least ten minutes about whether there is
+_any_ alternative!
+
+Note that game description strings are not required to contain an
+encoding of parameters such as grid size; a game description is
+never separated from the `game_params' it was generated with, so any
+information contained in that structure need not be encoded again in the
+game description.
+
+2.4.2. validate_desc()
+----------------------
+
+  char *(*validate_desc)(const game_params *params, const char *desc);
+
+This function is given a game description, and its job is to validate
+that it describes a puzzle which makes sense.
+
+To some extent it's up to the user exactly how far they take the phrase
+`makes sense'; there are no particularly strict rules about how hard the
+user is permitted to shoot themself in the foot when typing in a bogus
+game description by hand. (For example, Rectangles will not verify that
+the sum of all the numbers in the grid equals the grid's area. So a user
+could enter a puzzle which was provably not soluble, and the program
+wouldn't complain; there just wouldn't happen to be any sequence of
+moves which solved it.)
+
+The one non-negotiable criterion is that any game description which
+makes it through validate_desc() _must not_ subsequently cause a crash
+or an assertion failure when fed to new_game() and thence to the rest of
+the back end.
+
+The return value is NULL on success, or a non-dynamically-allocated C
+string containing an error message.
+
+2.4.3. new_game()
+-----------------
+
+  game_state *(*new_game)(midend *me, const game_params *params,
+                          const char *desc);
+
+This function takes a game description as input, together with its
+accompanying `game_params', and constructs a `game_state' describing the
+initial state of the puzzle. It returns a newly allocated `game_state'
+structure.
+
+Almost all puzzles should ignore the `me' parameter. It is required by
+Mines, which needs it for later passing to midend_supersede_game_desc()
+(see section 2.11.2) once the user has placed the first click. I
+fervently hope that no other puzzle will be awkward enough to require
+it, so everybody else should ignore it. As with the `interactive'
+parameter in new_desc() (section 2.4.1), if you think you have a reason
+to need this parameter, please try very hard to think of an alternative
+approach!
+
+2.5. Handling game states
+-------------------------
+
+This section describes the functions which create and destroy
+`game_state' structures.
+
+(Well, except new_game(), which is in section 2.4.3 instead of under
+here; but it deals with game descriptions _and_ game states and it had
+to go in one section or the other.)
+
+2.5.1. dup_game()
+-----------------
+
+  game_state *(*dup_game)(const game_state *state);
+
+This function allocates a new `game_state' structure and initialises it
+with an exact copy of the information in the one provided as input. It
+returns a pointer to the new duplicate.
+
+2.5.2. free_game()
+------------------
+
+  void (*free_game)(game_state *state);
+
+This function frees a `game_state' structure, and any subsidiary
+allocations contained within it.
+
+2.6. Handling `game_ui'
+-----------------------
+
+2.6.1. new_ui()
+---------------
+
+  game_ui *(*new_ui)(const game_state *state);
+
+This function allocates and returns a new `game_ui' structure for
+playing a particular puzzle. It is passed a pointer to the initial
+`game_state', in case it needs to refer to that when setting up the
+initial values for the new game.
+
+2.6.2. free_ui()
+----------------
+
+  void (*free_ui)(game_ui *ui);
+
+This function frees a `game_ui' structure, and any subsidiary
+allocations contained within it.
+
+2.6.3. encode_ui()
+------------------
+
+  char *(*encode_ui)(const game_ui *ui);
+
+This function encodes any _important_ data in a `game_ui' structure in
+string form. It is only called when saving a half-finished game to a
+file.
+
+It should be used sparingly. Almost all data in a `game_ui' is not
+important enough to save. The location of the keyboard-controlled
+cursor, for example, can be reset to a default position on reloading
+the game without impacting the user experience. If the user should
+somehow manage to save a game while a mouse drag was in progress, then
+discarding that mouse drag would be an outright _feature_.
+
+A typical thing that _would_ be worth encoding in this function is the
+Mines death counter: it's in the `game_ui' rather than the `game_state'
+because it's too important to allow the user to revert it by using Undo,
+and therefore it's also too important to allow the user to revert it by
+saving and reloading. (Of course, the user could edit the save file by
+hand... But if the user is _that_ determined to cheat, they could just
+as easily modify the game's source.)
+
+2.6.4. decode_ui()
+------------------
+
+  void (*decode_ui)(game_ui *ui, const char *encoding);
+
+This function parses a string previously output by encode_ui(), and
+writes the decoded data back into the provided `game_ui' structure.
+
+2.6.5. changed_state()
+----------------------
+
+  void (*changed_state)(game_ui *ui, const game_state *oldstate,
+                        const game_state *newstate);
+
+This function is called by the mid-end whenever the current game state
+changes, for any reason. Those reasons include:
+
+ -  a fresh move being made by interpret_move() and execute_move()
+
+ -  a solve operation being performed by solve() and execute_move()
+
+ -  the user moving back and forth along the undo list by means of the
+    Undo and Redo operations
+
+ -  the user selecting Restart to go back to the initial game state.
+
+The job of changed_state() is to update the `game_ui' for consistency
+with the new game state, if any update is necessary. For example,
+Same Game stores data about the currently selected tile group in its
+`game_ui', and this data is intrinsically related to the game state it
+was derived from. So it's very likely to become invalid when the game
+state changes; thus, Same Game's changed_state() function clears the
+current selection whenever it is called.
+
+When anim_length() or flash_length() are called, you can be sure that
+there has been a previous call to changed_state(). So changed_state()
+can set up data in the `game_ui' which will be read by anim_length() and
+flash_length(), and those functions will not have to worry about being
+called without the data having been initialised.
+
+2.7. Making moves
+-----------------
+
+This section describes the functions which actually make moves in
+the game: that is, the functions which process user input and end up
+producing new `game_state's.
+
+2.7.1. interpret_move()
+-----------------------
+
+  char *(*interpret_move)(const game_state *state, game_ui *ui,
+                          const game_drawstate *ds,
+                          int x, int y, int button);
+
+This function receives user input and processes it. Its input parameters
+are the current `game_state', the current `game_ui' and the current
+`game_drawstate', plus details of the input event. `button' is either
+an ASCII value or a special code (listed below) indicating an arrow or
+function key or a mouse event; when `button' is a mouse event, `x' and
+`y' contain the pixel coordinates of the mouse pointer relative to the
+top left of the puzzle's drawing area.
+
+(The pointer to the `game_drawstate' is marked `const', because
+`interpret_move' should not write to it. The normal use of that pointer
+will be to read the game's tile size parameter in order to divide mouse
+coordinates by it.)
+
+interpret_move() may return in three different ways:
+
+ -  Returning NULL indicates that no action whatsoever occurred in
+    response to the input event; the puzzle was not interested in it at
+    all.
+
+ -  Returning the empty string ("") indicates that the input event has
+    resulted in a change being made to the `game_ui' which will require
+    a redraw of the game window, but that no actual _move_ was made
+    (i.e. no new `game_state' needs to be created).
+
+ -  Returning anything else indicates that a move was made and that
+    a new `game_state' must be created. However, instead of actually
+    constructing a new `game_state' itself, this function is required to
+    return a string description of the details of the move. This string
+    will be passed to execute_move() (section 2.7.2) to actually create
+    the new `game_state'. (Encoding moves as strings in this way means
+    that the mid-end can keep the strings as well as the game states,
+    and the strings can be written to disk when saving the game and fed
+    to execute_move() again on reloading.)
+
+The return value from interpret_move() is expected to be dynamically
+allocated if and only if it is not either NULL _or_ the empty string.
+
+After this function is called, the back end is permitted to rely on some
+subsequent operations happening in sequence:
+
+ -  execute_move() will be called to convert this move description into
+    a new `game_state'
+
+ -  changed_state() will be called with the new `game_state'.
+
+This means that if interpret_move() needs to do updates to the `game_ui'
+which are easier to perform by referring to the new `game_state', it can
+safely leave them to be done in changed_state() and not worry about them
+failing to happen.
+
+(Note, however, that execute_move() may _also_ be called in other
+circumstances. It is only interpret_move() which can rely on a
+subsequent call to changed_state().)
+
+The special key codes supported by this function are:
+
+LEFT_BUTTON, MIDDLE_BUTTON, RIGHT_BUTTON
+
+    Indicate that one of the mouse buttons was pressed down.
+
+LEFT_DRAG, MIDDLE_DRAG, RIGHT_DRAG
+
+    Indicate that the mouse was moved while one of the mouse buttons was
+    still down. The mid-end guarantees that when one of these events is
+    received, it will always have been preceded by a button-down event
+    (and possibly other drag events) for the same mouse button, and no
+    event involving another mouse button will have appeared in between.
+
+LEFT_RELEASE, MIDDLE_RELEASE, RIGHT_RELEASE
+
+    Indicate that a mouse button was released. The mid-end guarantees
+    that when one of these events is received, it will always have been
+    preceded by a button-down event (and possibly some drag events) for
+    the same mouse button, and no event involving another mouse button
+    will have appeared in between.
+
+CURSOR_UP, CURSOR_DOWN, CURSOR_LEFT, CURSOR_RIGHT
+
+    Indicate that an arrow key was pressed.
+
+CURSOR_SELECT
+
+    On platforms which have a prominent `select' button alongside their
+    cursor keys, indicates that that button was pressed.
+
+In addition, there are some modifiers which can be bitwise-ORed into the
+`button' parameter:
+
+MOD_CTRL, MOD_SHFT
+
+    These indicate that the Control or Shift key was pressed alongside
+    the key. They only apply to the cursor keys, not to mouse buttons or
+    anything else.
+
+MOD_NUM_KEYPAD
+
+    This applies to some ASCII values, and indicates that the key code
+    was input via the numeric keypad rather than the main keyboard. Some
+    puzzles may wish to treat this differently (for example, a puzzle
+    might want to use the numeric keypad as an eight-way directional
+    pad), whereas others might not (a game involving numeric input
+    probably just wants to treat the numeric keypad as numbers).
+
+MOD_MASK
+
+    This mask is the bitwise OR of all the available modifiers; you can
+    bitwise-AND with ~MOD_MASK to strip all the modifiers off any input
+    value.
+
+2.7.2. execute_move()
+---------------------
+
+  game_state *(*execute_move)(const game_state *state, char *move);
+
+This function takes an input `game_state' and a move string as output
+from interpret_move(). It returns a newly allocated `game_state' which
+contains the result of applying the specified move to the input game
+state.
+
+This function may return NULL if it cannot parse the move string (and
+this is definitely preferable to crashing or failing an assertion, since
+one way this can happen is if loading a corrupt save file). However, it
+must not return NULL for any move string that really was output from
+interpret_move(): this is punishable by assertion failure in the mid-
+end.
+
+2.7.3. `can_solve'
+------------------
+
+  int can_solve;
+
+This boolean field is set to TRUE if the game's solve() function does
+something. If it's set to FALSE, the game will not even offer the
+`Solve' menu option.
+
+2.7.4. solve()
+--------------
+
+  char *(*solve)(const game_state *orig, const game_state *curr,
+                 const char *aux, char **error);
+
+This function is called when the user selects the `Solve' option from
+the menu.
+
+It is passed two input game states: `orig' is the game state from the
+very start of the puzzle, and `curr' is the current one. (Different
+games find one or other or both of these convenient.) It is also passed
+the `aux' string saved by new_desc() (section 2.4.1), in case that
+encodes important information needed to provide the solution.
+
+If this function is unable to produce a solution (perhaps, for example,
+the game has no in-built solver so it can only solve puzzles it invented
+internally and has an `aux' string for) then it may return NULL. If it
+does this, it must also set `*error' to an error message to be presented
+to the user (such as `Solution not known for this puzzle'); that error
+message is not expected to be dynamically allocated.
+
+If this function _does_ produce a solution, it returns a move string
+suitable for feeding to execute_move() (section 2.7.2). Like a (non-
+empty) string returned from interpret_move(), the returned string should
+be dynamically allocated.
+
+2.8. Drawing the game graphics
+------------------------------
+
+This section discusses the back end functions that deal with drawing.
+
+2.8.1. new_drawstate()
+----------------------
+
+  game_drawstate *(*new_drawstate)(drawing *dr,
+                                   const game_state *state);
+
+This function allocates and returns a new `game_drawstate' structure for
+drawing a particular puzzle. It is passed a pointer to a `game_state',
+in case it needs to refer to that when setting up any initial data.
+
+This function may not rely on the puzzle having been newly started; a
+new draw state can be constructed at any time if the front end requests
+a forced redraw. For games like Pattern, in which initial game states
+are much simpler than general ones, this might be important to keep in
+mind.
+
+The parameter `dr' is a drawing object (see chapter 3) which the
+function might need to use to allocate blitters. (However, this isn't
+recommended; it's usually more sensible to wait to allocate a blitter
+until set_size() is called, because that way you can tailor it to the
+scale at which the puzzle is being drawn.)
+
+2.8.2. free_drawstate()
+-----------------------
+
+  void (*free_drawstate)(drawing *dr, game_drawstate *ds);
+
+This function frees a `game_drawstate' structure, and any subsidiary
+allocations contained within it.
+
+The parameter `dr' is a drawing object (see chapter 3), which might be
+required if you are freeing a blitter.
+
+2.8.3. `preferred_tilesize'
+---------------------------
+
+  int preferred_tilesize;
+
+Each game is required to define a single integer parameter which
+expresses, in some sense, the scale at which it is drawn. This is
+described in the APIs as `tilesize', since most puzzles are on a
+square (or possibly triangular or hexagonal) grid and hence a sensible
+interpretation of this parameter is to define it as the size of one grid
+tile in pixels; however, there's no actual requirement that the `tile
+size' be proportional to the game window size. Window size is required
+to increase monotonically with `tile size', however.
+
+The data element `preferred_tilesize' indicates the tile size which
+should be used in the absence of a good reason to do otherwise (such as
+the screen being too small, or the user explicitly requesting a resize
+if that ever gets implemented).
+
+2.8.4. compute_size()
+---------------------
+
+  void (*compute_size)(const game_params *params, int tilesize,
+                       int *x, int *y);
+
+This function is passed a `game_params' structure and a tile size. It
+returns, in `*x' and `*y', the size in pixels of the drawing area that
+would be required to render a puzzle with those parameters at that tile
+size.
+
+2.8.5. set_size()
+-----------------
+
+  void (*set_size)(drawing *dr, game_drawstate *ds,
+                   const game_params *params, int tilesize);
+
+This function is responsible for setting up a `game_drawstate' to draw
+at a given tile size. Typically this will simply involve copying the
+supplied `tilesize' parameter into a `tilesize' field inside the draw
+state; for some more complex games it might also involve setting up
+other dimension fields, or possibly allocating a blitter (see section
+3.1.13).
+
+The parameter `dr' is a drawing object (see chapter 3), which is
+required if a blitter needs to be allocated.
+
+Back ends may assume (and may enforce by assertion) that this function
+will be called at most once for any `game_drawstate'. If a puzzle needs
+to be redrawn at a different size, the mid-end will create a fresh
+drawstate.
+
+2.8.6. colours()
+----------------
+
+  float *(*colours)(frontend *fe, int *ncolours);
+
+This function is responsible for telling the front end what colours the
+puzzle will need to draw itself.
+
+It returns the number of colours required in `*ncolours', and the return
+value from the function itself is a dynamically allocated array of three
+times that many `float's, containing the red, green and blue components
+of each colour respectively as numbers in the range [0,1].
+
+The second parameter passed to this function is a front end handle.
+The only things it is permitted to do with this handle are to call the
+front-end function called frontend_default_colour() (see section 4.40)
+or the utility function called game_mkhighlight() (see section 5.4.7).
+(The latter is a wrapper on the former, so front end implementors only
+need to provide frontend_default_colour().) This allows colours() to
+take local configuration into account when deciding on its own colour
+allocations. Most games use the front end's default colour as their
+background, apart from a few which depend on drawing relief highlights
+so they adjust the background colour if it's too light for highlights to
+show up against it.
+
+Note that the colours returned from this function are for _drawing_,
+not for printing. Printing has an entirely different colour allocation
+policy.
+
+2.8.7. anim_length()
+--------------------
+
+  float (*anim_length)(const game_state *oldstate,
+                       const game_state *newstate,
+                       int dir, game_ui *ui);
+
+This function is called when a move is made, undone or redone. It is
+given the old and the new `game_state', and its job is to decide whether
+the transition between the two needs to be animated or can be instant.
+
+`oldstate' is the state that was current until this call; `newstate'
+is the state that will be current after it. `dir' specifies the
+chronological order of those states: if it is positive, then the
+transition is the result of a move or a redo (and so `newstate' is the
+later of the two moves), whereas if it is negative then the transition
+is the result of an undo (so that `newstate' is the _earlier_ move).
+
+If this function decides the transition should be animated, it returns
+the desired length of the animation in seconds. If not, it returns zero.
+
+State changes as a result of a Restart operation are never animated; the
+mid-end will handle them internally and never consult this function at
+all. State changes as a result of Solve operations are also not animated
+by default, although you can change this for a particular game by
+setting a flag in `flags' (section 2.10.7).
+
+The function is also passed a pointer to the local `game_ui'. It may
+refer to information in here to help with its decision (see section
+6.3.7 for an example of this), and/or it may _write_ information about
+the nature of the animation which will be read later by redraw().
+
+When this function is called, it may rely on changed_state() having been
+called previously, so if anim_length() needs to refer to information in
+the `game_ui', then changed_state() is a reliable place to have set that
+information up.
+
+Move animations do not inhibit further input events. If the user
+continues playing before a move animation is complete, the animation
+will be abandoned and the display will jump straight to the final state.
+
+2.8.8. flash_length()
+---------------------
+
+  float (*flash_length)(const game_state *oldstate,
+                        const game_state *newstate,
+                        int dir, game_ui *ui);
+
+This function is called when a move is completed. (`Completed'
+means that not only has the move been made, but any animation which
+accompanied it has finished.) It decides whether the transition from
+`oldstate' to `newstate' merits a `flash'.
+
+A flash is much like a move animation, but it is _not_ interrupted by
+further user interface activity; it runs to completion in parallel with
+whatever else might be going on on the display. The only thing which
+will rush a flash to completion is another flash.
+
+The purpose of flashes is to indicate that the game has been completed.
+They were introduced as a separate concept from move animations because
+of Net: the habit of most Net players (and certainly me) is to rotate a
+tile into place and immediately lock it, then move on to another tile.
+When you make your last move, at the instant the final tile is rotated
+into place the screen starts to flash to indicate victory - but if you
+then press the lock button out of habit, then the move animation is
+cancelled, and the victory flash does not complete. (And if you _don't_
+press the lock button, the completed grid will look untidy because there
+will be one unlocked square.) Therefore, I introduced a specific concept
+of a `flash' which is separate from a move animation and can proceed in
+parallel with move animations and any other display activity, so that
+the victory flash in Net is not cancelled by that final locking move.
+
+The input parameters to flash_length() are exactly the same as the ones
+to anim_length().
+
+Just like anim_length(), when this function is called, it may rely on
+changed_state() having been called previously, so if it needs to refer
+to information in the `game_ui' then changed_state() is a reliable place
+to have set that information up.
+
+(Some games use flashes to indicate defeat as well as victory; Mines,
+for example, flashes in a different colour when you tread on a mine from
+the colour it uses when you complete the game. In order to achieve this,
+its flash_length() function has to store a flag in the `game_ui' to
+indicate which flash type is required.)
+
+2.8.9. status()
+---------------
+
+  int (*status)(const game_state *state);
+
+This function returns a status value indicating whether the current game
+is still in play, or has been won, or has been conclusively lost. The
+mid-end uses this to implement midend_status() (section 4.27).
+
+The return value should be +1 if the game has been successfully solved.
+If the game has been lost in a situation where further play is unlikely,
+the return value should be -1. If neither is true (so play is still
+ongoing), return zero.
+
+Front ends may wish to use a non-zero status as a cue to proactively
+offer the option of starting a new game. Therefore, back ends should
+not return -1 if the game has been _technically_ lost but undoing and
+continuing is still a realistic possibility.
+
+(For instance, games with hidden information such as Guess or Mines
+might well return a non-zero status whenever they reveal the solution,
+whether or not the player guessed it correctly, on the grounds that a
+player would be unlikely to hide the solution and continue playing after
+the answer was spoiled. On the other hand, games where you can merely
+get into a dead end such as Same Game or Inertia might choose to return
+0 in that situation, on the grounds that the player would quite likely
+press Undo and carry on playing.)
+
+2.8.10. redraw()
+----------------
+
+  void (*redraw)(drawing *dr, game_drawstate *ds,
+                 const game_state *oldstate,
+                 const game_state *newstate,
+                 int dir, const game_ui *ui,
+                 float anim_time, float flash_time);
+
+This function is responsible for actually drawing the contents of
+the game window, and for redrawing every time the game state or the
+`game_ui' changes.
+
+The parameter `dr' is a drawing object which may be passed to the
+drawing API functions (see chapter 3 for documentation of the drawing
+API). This function may not save `dr' and use it elsewhere; it must only
+use it for calling back to the drawing API functions within its own
+lifetime.
+
+`ds' is the local `game_drawstate', of course, and `ui' is the local
+`game_ui'.
+
+`newstate' is the semantically-current game state, and is always non-
+NULL. If `oldstate' is also non-NULL, it means that a move has recently
+been made and the game is still in the process of displaying an
+animation linking the old and new states; in this situation, `anim_time'
+will give the length of time (in seconds) that the animation has already
+been running. If `oldstate' is NULL, then `anim_time' is unused (and
+will hopefully be set to zero to avoid confusion).
+
+`flash_time', if it is is non-zero, denotes that the game is in the
+middle of a flash, and gives the time since the start of the flash. See
+section 2.8.8 for general discussion of flashes.
+
+The very first time this function is called for a new `game_drawstate',
+it is expected to redraw the _entire_ drawing area. Since this often
+involves drawing visual furniture which is never subsequently altered,
+it is often simplest to arrange this by having a special `first time'
+flag in the draw state, and resetting it after the first redraw.
+
+When this function (or any subfunction) calls the drawing API, it is
+expected to pass colour indices which were previously defined by the
+colours() function.
+
+2.9. Printing functions
+-----------------------
+
+This section discusses the back end functions that deal with printing
+puzzles out on paper.
+
+2.9.1. `can_print'
+------------------
+
+  int can_print;
+
+This flag is set to TRUE if the puzzle is capable of printing itself
+on paper. (This makes sense for some puzzles, such as Solo, which can
+be filled in with a pencil. Other puzzles, such as Twiddle, inherently
+involve moving things around and so would not make sense to print.)
+
+If this flag is FALSE, then the functions print_size() and print() will
+never be called.
+
+2.9.2. `can_print_in_colour'
+----------------------------
+
+  int can_print_in_colour;
+
+This flag is set to TRUE if the puzzle is capable of printing itself
+differently when colour is available. For example, Map can actually
+print coloured regions in different _colours_ rather than resorting to
+cross-hatching.
+
+If the `can_print' flag is FALSE, then this flag will be ignored.
+
+2.9.3. print_size()
+-------------------
+
+  void (*print_size)(const game_params *params, float *x, float *y);
+
+This function is passed a `game_params' structure and a tile size. It
+returns, in `*x' and `*y', the preferred size in _millimetres_ of that
+puzzle if it were to be printed out on paper.
+
+If the `can_print' flag is FALSE, this function will never be called.
+
+2.9.4. print()
+--------------
+
+  void (*print)(drawing *dr, const game_state *state, int tilesize);
+
+This function is called when a puzzle is to be printed out on paper. It
+should use the drawing API functions (see chapter 3) to print itself.
+
+This function is separate from redraw() because it is often very
+different:
+
+ -  The printing function may not depend on pixel accuracy, since
+    printer resolution is variable. Draw as if your canvas had infinite
+    resolution.
+
+ -  The printing function sometimes needs to display things in a
+    completely different style. Net, for example, is very different as
+    an on-screen puzzle and as a printed one.
+
+ -  The printing function is often much simpler since it has no need to
+    deal with repeated partial redraws.
+
+However, there's no reason the printing and redraw functions can't share
+some code if they want to.
+
+When this function (or any subfunction) calls the drawing API, the
+colour indices it passes should be colours which have been allocated by
+the print_*_colour() functions within this execution of print(). This is
+very different from the fixed small number of colours used in redraw(),
+because printers do not have a limitation on the total number of colours
+that may be used. Some puzzles' printing functions might wish to
+allocate only one `ink' colour and use it for all drawing; others might
+wish to allocate _more_ colours than are used on screen.
+
+One possible colour policy worth mentioning specifically is that a
+puzzle's printing function might want to allocate the _same_ colour
+indices as are used by the redraw function, so that code shared between
+drawing and printing does not have to keep switching its colour indices.
+In order to do this, the simplest thing is to make use of the fact that
+colour indices returned from print_*_colour() are guaranteed to be in
+increasing order from zero. So if you have declared an `enum' defining
+three colours COL_BACKGROUND, COL_THIS and COL_THAT, you might then
+write
+
+  int c;
+  c = print_mono_colour(dr, 1); assert(c == COL_BACKGROUND);
+  c = print_mono_colour(dr, 0); assert(c == COL_THIS);
+  c = print_mono_colour(dr, 0); assert(c == COL_THAT);
+
+If the `can_print' flag is FALSE, this function will never be called.
+
+2.10. Miscellaneous
+-------------------
+
+2.10.1. `can_format_as_text_ever'
+---------------------------------
+
+  int can_format_as_text_ever;
+
+This boolean field is TRUE if the game supports formatting a game state
+as ASCII text (typically ASCII art) for copying to the clipboard and
+pasting into other applications. If it is FALSE, front ends will not
+offer the `Copy' command at all.
+
+If this field is TRUE, the game does not necessarily have to support
+text formatting for _all_ games: e.g. a game which can be played on
+a square grid or a triangular one might only support copy and paste
+for the former, because triangular grids in ASCII art are just too
+difficult.
+
+If this field is FALSE, the functions can_format_as_text_now() (section
+2.10.2) and text_format() (section 2.10.3) are never called.
+
+2.10.2. `can_format_as_text_now()'
+----------------------------------
+
+  int (*can_format_as_text_now)(const game_params *params);
+
+This function is passed a `game_params' and returns a boolean, which is
+TRUE if the game can support ASCII text output for this particular game
+type. If it returns FALSE, front ends will grey out or otherwise disable
+the `Copy' command.
+
+Games may enable and disable the copy-and-paste function for different
+game _parameters_, but are currently constrained to return the same
+answer from this function for all game _states_ sharing the same
+parameters. In other words, the `Copy' function may enable or disable
+itself when the player changes game preset, but will never change during
+play of a single game or when another game of exactly the same type is
+generated.
+
+This function should not take into account aspects of the game
+parameters which are not encoded by encode_params() (section 2.3.3)
+when the `full' parameter is set to FALSE. Such parameters will not
+necessarily match up between a call to this function and a subsequent
+call to text_format() itself. (For instance, game _difficulty_ should
+not affect whether the game can be copied to the clipboard. Only the
+actual visible _shape_ of the game can affect that.)
+
+2.10.3. text_format()
+---------------------
+
+  char *(*text_format)(const game_state *state);
+
+This function is passed a `game_state', and returns a newly allocated C
+string containing an ASCII representation of that game state. It is used
+to implement the `Copy' operation in many front ends.
+
+This function will only ever be called if the back end field
+`can_format_as_text_ever' (section 2.10.1) is TRUE _and_ the function
+can_format_as_text_now() (section 2.10.2) has returned TRUE for the
+currently selected game parameters.
+
+The returned string may contain line endings (and will probably want
+to), using the normal C internal `\n' convention. For consistency
+between puzzles, all multi-line textual puzzle representations should
+_end_ with a newline as well as containing them internally. (There are
+currently no puzzles which have a one-line ASCII representation, so
+there's no precedent yet for whether that should come with a newline or
+not.)
+
+2.10.4. wants_statusbar
+-----------------------
+
+  int wants_statusbar;
+
+This boolean field is set to TRUE if the puzzle has a use for a textual
+status line (to display score, completion status, currently active
+tiles, etc).
+
+2.10.5. `is_timed'
+------------------
+
+  int is_timed;
+
+This boolean field is TRUE if the puzzle is time-critical. If so, the
+mid-end will maintain a game timer while the user plays.
+
+If this field is FALSE, then timing_state() will never be called and
+need not do anything.
+
+2.10.6. timing_state()
+----------------------
+
+  int (*timing_state)(const game_state *state, game_ui *ui);
+
+This function is passed the current `game_state' and the local
+`game_ui'; it returns TRUE if the game timer should currently be
+running.
+
+A typical use for the `game_ui' in this function is to note when the
+game was first completed (by setting a flag in changed_state() - see
+section 2.6.5), and freeze the timer thereafter so that the user can
+undo back through their solution process without altering their time.
+
+2.10.7. `flags'
+---------------
+
+  int flags;
+
+This field contains miscellaneous per-backend flags. It consists of the
+bitwise OR of some combination of the following:
+
+BUTTON_BEATS(x,y)
+
+    Given any x and y from the set {LEFT_BUTTON, MIDDLE_BUTTON,
+    RIGHT_BUTTON}, this macro evaluates to a bit flag which indicates
+    that when buttons x and y are both pressed simultaneously, the mid-
+    end should consider x to have priority. (In the absence of any such
+    flags, the mid-end will always consider the most recently pressed
+    button to have priority.)
+
+SOLVE_ANIMATES
+
+    This flag indicates that moves generated by solve() (section 2.7.4)
+    are candidates for animation just like any other move. For most
+    games, solve moves should not be animated, so the mid-end doesn't
+    even bother calling anim_length() (section 2.8.7), thus saving some
+    special-case code in each game. On the rare occasion that animated
+    solve moves are actually required, you can set this flag.
+
+REQUIRE_RBUTTON
+
+    This flag indicates that the puzzle cannot be usefully played
+    without the use of mouse buttons other than the left one. On some
+    PDA platforms, this flag is used by the front end to enable right-
+    button emulation through an appropriate gesture. Note that a puzzle
+    is not required to set this just because it _uses_ the right button,
+    but only if its use of the right button is critical to playing the
+    game. (Slant, for example, uses the right button to cycle through
+    the three square states in the opposite order from the left button,
+    and hence can manage fine without it.)
+
+REQUIRE_NUMPAD
+
+    This flag indicates that the puzzle cannot be usefully played
+    without the use of number-key input. On some PDA platforms it
+    causes an emulated number pad to appear on the screen. Similarly to
+    REQUIRE_RBUTTON, a puzzle need not specify this simply if its use of
+    the number keys is not critical.
+
+2.11. Things a back end may do on its own initiative
+----------------------------------------------------
+
+This section describes a couple of things that a back end may choose
+to do by calling functions elsewhere in the program, which would not
+otherwise be obvious.
+
+2.11.1. Create a random state
+-----------------------------
+
+If a back end needs random numbers at some point during normal play, it
+can create a fresh `random_state' by first calling `get_random_seed'
+(section 4.36) and then passing the returned seed data to random_new().
+
+This is likely not to be what you want. If a puzzle needs randomness in
+the middle of play, it's likely to be more sensible to store some sort
+of random state within the `game_state', so that the random numbers are
+tied to the particular game state and hence the player can't simply keep
+undoing their move until they get numbers they like better.
+
+This facility is currently used only in Net, to implement the `jumble'
+command, which sets every unlocked tile to a new random orientation.
+This randomness _is_ a reasonable use of the feature, because it's non-
+adversarial - there's no advantage to the user in getting different
+random numbers.
+
+2.11.2. Supersede its own game description
+------------------------------------------
+
+In response to a move, a back end is (reluctantly) permitted to call
+midend_supersede_game_desc():
+
+  void midend_supersede_game_desc(midend *me,
+                                  char *desc, char *privdesc);
+
+When the user selects `New Game', the mid-end calls new_desc()
+(section 2.4.1) to get a new game description, and (as well as using
+that to generate an initial game state) stores it for the save file
+and for telling to the user. The function above overwrites that
+game description, and also splits it in two. `desc' becomes the new
+game description which is provided to the user on request, and is
+also the one used to construct a new initial game state if the user
+selects `Restart'. `privdesc' is a `private' game description, used to
+reconstruct the game's initial state when reloading.
+
+The distinction between the two, as well as the need for this function
+at all, comes from Mines. Mines begins with a blank grid and no
+idea of where the mines actually are; new_desc() does almost no
+work in interactive mode, and simply returns a string encoding the
+`random_state'. When the user first clicks to open a tile, _then_ Mines
+generates the mine positions, in such a way that the game is soluble
+from that starting point. Then it uses this function to supersede the
+random-state game description with a proper one. But it needs two: one
+containing the initial click location (because that's what you want to
+happen if you restart the game, and also what you want to send to a
+friend so that they play _the same game_ as you), and one without the
+initial click location (because when you save and reload the game, you
+expect to see the same blank initial state as you had before saving).
+
+I should stress again that this function is a horrid hack. Nobody should
+use it if they're not Mines; if you think you need to use it, think
+again repeatedly in the hope of finding a better way to do whatever it
+was you needed to do.
+
+3. The drawing API
+------------------
+
+The back end function redraw() (section 2.8.10) is required to draw
+the puzzle's graphics on the window's drawing area, or on paper if the
+puzzle is printable. To do this portably, it is provided with a drawing
+API allowing it to talk directly to the front end. In this chapter I
+document that API, both for the benefit of back end authors trying to
+use it and for front end authors trying to implement it.
+
+The drawing API as seen by the back end is a collection of global
+functions, each of which takes a pointer to a `drawing' structure (a
+`drawing object'). These objects are supplied as parameters to the back
+end's redraw() and print() functions.
+
+In fact these global functions are not implemented directly by the front
+end; instead, they are implemented centrally in `drawing.c' and form a
+small piece of middleware. The drawing API as supplied by the front end
+is a structure containing a set of function pointers, plus a `void *'
+handle which is passed to each of those functions. This enables a single
+front end to switch between multiple implementations of the drawing API
+if necessary. For example, the Windows API supplies a printing mechanism
+integrated into the same GDI which deals with drawing in windows, and
+therefore the same API implementation can handle both drawing and
+printing; but on Unix, the most common way for applications to print
+is by producing PostScript output directly, and although it would be
+_possible_ to write a single (say) draw_rect() function which checked
+a global flag to decide whether to do GTK drawing operations or output
+PostScript to a file, it's much nicer to have two separate functions and
+switch between them as appropriate.
+
+When drawing, the puzzle window is indexed by pixel coordinates, with
+the top left pixel defined as (0,0) and the bottom right pixel (w-1,h-
+1), where `w' and `h' are the width and height values returned by the
+back end function compute_size() (section 2.8.4).
+
+When printing, the puzzle's print area is indexed in exactly the same
+way (with an arbitrary tile size provided by the printing module
+`printing.c'), to facilitate sharing of code between the drawing and
+printing routines. However, when printing, puzzles may no longer assume
+that the coordinate unit has any relationship to a pixel; the printer's
+actual resolution might very well not even be known at print time, so
+the coordinate unit might be smaller or larger than a pixel. Puzzles'
+print functions should restrict themselves to drawing geometric shapes
+rather than fiddly pixel manipulation.
+
+_Puzzles' redraw functions may assume that the surface they draw on is
+persistent_. It is the responsibility of every front end to preserve
+the puzzle's window contents in the face of GUI window expose issues
+and similar. It is not permissible to request that the back end redraw
+any part of a window that it has already drawn, unless something has
+actually changed as a result of making moves in the puzzle.
+
+Most front ends accomplish this by having the drawing routines draw on a
+stored bitmap rather than directly on the window, and copying the bitmap
+to the window every time a part of the window needs to be redrawn.
+Therefore, it is vitally important that whenever the back end does any
+drawing it informs the front end of which parts of the window it has
+accessed, and hence which parts need repainting. This is done by calling
+draw_update() (section 3.1.11).
+
+Persistence of old drawing is convenient. However, a puzzle should be
+very careful about how it updates its drawing area. The problem is that
+some front ends do anti-aliased drawing: rather than simply choosing
+between leaving each pixel untouched or painting it a specified colour,
+an antialiased drawing function will _blend_ the original and new
+colours in pixels at a figure's boundary according to the proportion of
+the pixel occupied by the figure (probably modified by some heuristic
+fudge factors). All of this produces a smoother appearance for curves
+and diagonal lines.
+
+An unfortunate effect of drawing an anti-aliased figure repeatedly
+is that the pixels around the figure's boundary come steadily more
+saturated with `ink' and the boundary appears to `spread out'. Worse,
+redrawing a figure in a different colour won't fully paint over the old
+boundary pixels, so the end result is a rather ugly smudge.
+
+A good strategy to avoid unpleasant anti-aliasing artifacts is to
+identify a number of rectangular areas which need to be redrawn, clear
+them to the background colour, and then redraw their contents from
+scratch, being careful all the while not to stray beyond the boundaries
+of the original rectangles. The clip() function (section 3.1.9) comes in
+very handy here. Games based on a square grid can often do this fairly
+easily. Other games may need to be somewhat more careful. For example,
+Loopy's redraw function first identifies portions of the display which
+need to be updated. Then, if the changes are fairly well localised, it
+clears and redraws a rectangle containing each changed area. Otherwise,
+it gives up and redraws the entire grid from scratch.
+
+It is possible to avoid clearing to background and redrawing from
+scratch if one is very careful about which drawing functions one
+uses: if a function is documented as not anti-aliasing under some
+circumstances, you can rely on each pixel in a drawing either being left
+entirely alone or being set to the requested colour, with no blending
+being performed.
+
+In the following sections I first discuss the drawing API as seen by the
+back end, and then the _almost_ identical function-pointer form seen by
+the front end.
+
+3.1. Drawing API as seen by the back end
+----------------------------------------
+
+This section documents the back-end drawing API, in the form of
+functions which take a `drawing' object as an argument.
+
+3.1.1. draw_rect()
+------------------
+
+  void draw_rect(drawing *dr, int x, int y, int w, int h,
+                 int colour);
+
+Draws a filled rectangle in the puzzle window.
+
+`x' and `y' give the coordinates of the top left pixel of the rectangle.
+`w' and `h' give its width and height. Thus, the horizontal extent of
+the rectangle runs from `x' to `x+w-1' inclusive, and the vertical
+extent from `y' to `y+h-1' inclusive.
+
+`colour' is an integer index into the colours array returned by the back
+end function colours() (section 2.8.6).
+
+There is no separate pixel-plotting function. If you want to plot a
+single pixel, the approved method is to use draw_rect() with width and
+height set to 1.
+
+Unlike many of the other drawing functions, this function is guaranteed
+to be pixel-perfect: the rectangle will be sharply defined and not anti-
+aliased or anything like that.
+
+This function may be used for both drawing and printing.
+
+3.1.2. draw_rect_outline()
+--------------------------
+
+  void draw_rect_outline(drawing *dr, int x, int y, int w, int h,
+                         int colour);
+
+Draws an outline rectangle in the puzzle window.
+
+`x' and `y' give the coordinates of the top left pixel of the rectangle.
+`w' and `h' give its width and height. Thus, the horizontal extent of
+the rectangle runs from `x' to `x+w-1' inclusive, and the vertical
+extent from `y' to `y+h-1' inclusive.
+
+`colour' is an integer index into the colours array returned by the back
+end function colours() (section 2.8.6).
+
+From a back end perspective, this function may be considered to be part
+of the drawing API. However, front ends are not required to implement
+it, since it is actually implemented centrally (in misc.c) as a wrapper
+on draw_polygon().
+
+This function may be used for both drawing and printing.
+
+3.1.3. draw_line()
+------------------
+
+  void draw_line(drawing *dr, int x1, int y1, int x2, int y2,
+                 int colour);
+
+Draws a straight line in the puzzle window.
+
+`x1' and `y1' give the coordinates of one end of the line. `x2' and `y2'
+give the coordinates of the other end. The line drawn includes both
+those points.
+
+`colour' is an integer index into the colours array returned by the back
+end function colours() (section 2.8.6).
+
+Some platforms may perform anti-aliasing on this function. Therefore,
+do not assume that you can erase a line by drawing the same line over
+it in the background colour; anti-aliasing might lead to perceptible
+ghost artefacts around the vanished line. Horizontal and vertical lines,
+however, are pixel-perfect and not anti-aliased.
+
+This function may be used for both drawing and printing.
+
+3.1.4. draw_polygon()
+---------------------
+
+  void draw_polygon(drawing *dr, int *coords, int npoints,
+                    int fillcolour, int outlinecolour);
+
+Draws an outlined or filled polygon in the puzzle window.
+
+`coords' is an array of (2*npoints) integers, containing the `x' and `y'
+coordinates of `npoints' vertices.
+
+`fillcolour' and `outlinecolour' are integer indices into the colours
+array returned by the back end function colours() (section 2.8.6).
+`fillcolour' may also be -1 to indicate that the polygon should be
+outlined only.
+
+The polygon defined by the specified list of vertices is first filled in
+`fillcolour', if specified, and then outlined in `outlinecolour'.
+
+`outlinecolour' may _not_ be -1; it must be a valid colour (and front
+ends are permitted to enforce this by assertion). This is because
+different platforms disagree on whether a filled polygon should include
+its boundary line or not, so drawing _only_ a filled polygon would
+have non-portable effects. If you want your filled polygon not to
+have a visible outline, you must set `outlinecolour' to the same as
+`fillcolour'.
+
+Some platforms may perform anti-aliasing on this function. Therefore, do
+not assume that you can erase a polygon by drawing the same polygon over
+it in the background colour. Also, be prepared for the polygon to extend
+a pixel beyond its obvious bounding box as a result of this; if you
+really need it not to do this to avoid interfering with other delicate
+graphics, you should probably use clip() (section 3.1.9). You can rely
+on horizontal and vertical lines not being anti-aliased.
+
+This function may be used for both drawing and printing.
+
+3.1.5. draw_circle()
+--------------------
+
+  void draw_circle(drawing *dr, int cx, int cy, int radius,
+                   int fillcolour, int outlinecolour);
+
+Draws an outlined or filled circle in the puzzle window.
+
+`cx' and `cy' give the coordinates of the centre of the circle. `radius'
+gives its radius. The total horizontal pixel extent of the circle is
+from `cx-radius+1' to `cx+radius-1' inclusive, and the vertical extent
+similarly around `cy'.
+
+`fillcolour' and `outlinecolour' are integer indices into the colours
+array returned by the back end function colours() (section 2.8.6).
+`fillcolour' may also be -1 to indicate that the circle should be
+outlined only.
+
+The circle is first filled in `fillcolour', if specified, and then
+outlined in `outlinecolour'.
+
+`outlinecolour' may _not_ be -1; it must be a valid colour (and front
+ends are permitted to enforce this by assertion). This is because
+different platforms disagree on whether a filled circle should include
+its boundary line or not, so drawing _only_ a filled circle would
+have non-portable effects. If you want your filled circle not to
+have a visible outline, you must set `outlinecolour' to the same as
+`fillcolour'.
+
+Some platforms may perform anti-aliasing on this function. Therefore, do
+not assume that you can erase a circle by drawing the same circle over
+it in the background colour. Also, be prepared for the circle to extend
+a pixel beyond its obvious bounding box as a result of this; if you
+really need it not to do this to avoid interfering with other delicate
+graphics, you should probably use clip() (section 3.1.9).
+
+This function may be used for both drawing and printing.
+
+3.1.6. draw_thick_line()
+------------------------
+
+  void draw_thick_line(drawing *dr, float thickness,
+                       float x1, float y1, float x2, float y2,
+                       int colour)
+
+Draws a line in the puzzle window, giving control over the line's
+thickness.
+
+`x1' and `y1' give the coordinates of one end of the line. `x2' and `y2'
+give the coordinates of the other end. `thickness' gives the thickness
+of the line, in pixels.
+
+Note that the coordinates and thickness are floating-point: the
+continuous coordinate system is in effect here. It's important to be
+able to address points with better-than-pixel precision in this case,
+because one can't otherwise properly express the endpoints of lines with
+both odd and even thicknesses.
+
+Some platforms may perform anti-aliasing on this function. The precise
+pixels affected by a thick-line drawing operation may vary between
+platforms, and no particular guarantees are provided. Indeed, even
+horizontal or vertical lines may be anti-aliased.
+
+This function may be used for both drawing and printing.
+
+3.1.7. draw_text()
+------------------
+
+  void draw_text(drawing *dr, int x, int y, int fonttype,
+                 int fontsize, int align, int colour, char *text);
+
+Draws text in the puzzle window.
+
+`x' and `y' give the coordinates of a point. The relation of this point
+to the location of the text is specified by `align', which is a bitwise
+OR of horizontal and vertical alignment flags:
+
+ALIGN_VNORMAL
+
+    Indicates that `y' is aligned with the baseline of the text.
+
+ALIGN_VCENTRE
+
+    Indicates that `y' is aligned with the vertical centre of the
+    text. (In fact, it's aligned with the vertical centre of normal
+    _capitalised_ text: displaying two pieces of text with ALIGN_VCENTRE
+    at the same y-coordinate will cause their baselines to be aligned
+    with one another, even if one is an ascender and the other a
+    descender.)
+
+ALIGN_HLEFT
+
+    Indicates that `x' is aligned with the left-hand end of the text.
+
+ALIGN_HCENTRE
+
+    Indicates that `x' is aligned with the horizontal centre of the
+    text.
+
+ALIGN_HRIGHT
+
+    Indicates that `x' is aligned with the right-hand end of the text.
+
+`fonttype' is either FONT_FIXED or FONT_VARIABLE, for a monospaced
+or proportional font respectively. (No more detail than that may be
+specified; it would only lead to portability issues between different
+platforms.)
+
+`fontsize' is the desired size, in pixels, of the text. This size
+corresponds to the overall point size of the text, not to any internal
+dimension such as the cap-height.
+
+`colour' is an integer index into the colours array returned by the back
+end function colours() (section 2.8.6).
+
+This function may be used for both drawing and printing.
+
+The character set used to encode the text passed to this function is
+specified _by the drawing object_, although it must be a superset of
+ASCII. If a puzzle wants to display text that is not contained in ASCII,
+it should use the text_fallback() function (section 3.1.8) to query the
+drawing object for an appropriate representation of the characters it
+wants.
+
+3.1.8. text_fallback()
+----------------------
+
+  char *text_fallback(drawing *dr, const char *const *strings,
+                      int nstrings);
+
+This function is used to request a translation of UTF-8 text into
+whatever character encoding is expected by the drawing object's
+implementation of draw_text().
+
+The input is a list of strings encoded in UTF-8: nstrings gives the
+number of strings in the list, and strings[0], strings[1], ...,
+strings[nstrings-1] are the strings themselves.
+
+The returned string (which is dynamically allocated and must be freed
+when finished with) is derived from the first string in the list that
+the drawing object expects to be able to display reliably; it will
+consist of that string translated into the character set expected by
+draw_text().
+
+Drawing implementations are not required to handle anything outside
+ASCII, but are permitted to assume that _some_ string will be
+successfully translated. So every call to this function must include
+a string somewhere in the list (presumably the last element) which
+consists of nothing but ASCII, to be used by any front end which cannot
+handle anything else.
+
+For example, if a puzzle wished to display a string including a
+multiplication sign (U+00D7 in Unicode, represented by the bytes C3 97
+in UTF-8), it might do something like this:
+
+  static const char *const times_signs[] = { "\xC3\x97", "x" };
+  char *times_sign = text_fallback(dr, times_signs, 2);
+  sprintf(buffer, "%d%s%d", width, times_sign, height);
+  draw_text(dr, x, y, font, size, align, colour, buffer);
+  sfree(buffer);
+
+which would draw a string with a times sign in the middle on platforms
+that support it, and fall back to a simple ASCII `x' where there was no
+alternative.
+
+3.1.9. clip()
+-------------
+
+  void clip(drawing *dr, int x, int y, int w, int h);
+
+Establishes a clipping rectangle in the puzzle window.
+
+`x' and `y' give the coordinates of the top left pixel of the clipping
+rectangle. `w' and `h' give its width and height. Thus, the horizontal
+extent of the rectangle runs from `x' to `x+w-1' inclusive, and the
+vertical extent from `y' to `y+h-1' inclusive. (These are exactly the
+same semantics as draw_rect().)
+
+After this call, no drawing operation will affect anything outside the
+specified rectangle. The effect can be reversed by calling unclip()
+(section 3.1.10). The clipping rectangle is pixel-perfect: pixels within
+the rectangle are affected as usual by drawing functions; pixels outside
+are completely untouched.
+
+Back ends should not assume that a clipping rectangle will be
+automatically cleared up by the front end if it's left lying around;
+that might work on current front ends, but shouldn't be relied upon.
+Always explicitly call unclip().
+
+This function may be used for both drawing and printing.
+
+3.1.10. unclip()
+----------------
+
+  void unclip(drawing *dr);
+
+Reverts the effect of a previous call to clip(). After this call, all
+drawing operations will be able to affect the entire puzzle window
+again.
+
+This function may be used for both drawing and printing.
+
+3.1.11. draw_update()
+---------------------
+
+  void draw_update(drawing *dr, int x, int y, int w, int h);
+
+Informs the front end that a rectangular portion of the puzzle window
+has been drawn on and needs to be updated.
+
+`x' and `y' give the coordinates of the top left pixel of the update
+rectangle. `w' and `h' give its width and height. Thus, the horizontal
+extent of the rectangle runs from `x' to `x+w-1' inclusive, and the
+vertical extent from `y' to `y+h-1' inclusive. (These are exactly the
+same semantics as draw_rect().)
+
+The back end redraw function _must_ call this function to report any
+changes it has made to the window. Otherwise, those changes may not
+become immediately visible, and may then appear at an unpredictable
+subsequent time such as the next time the window is covered and re-
+exposed.
+
+This function is only important when drawing. It may be called when
+printing as well, but doing so is not compulsory, and has no effect.
+(So if you have a shared piece of code between the drawing and printing
+routines, that code may safely call draw_update().)
+
+3.1.12. status_bar()
+--------------------
+
+  void status_bar(drawing *dr, char *text);
+
+Sets the text in the game's status bar to `text'. The text is copied
+from the supplied buffer, so the caller is free to deallocate or modify
+the buffer after use.
+
+(This function is not exactly a _drawing_ function, but it shares with
+the drawing API the property that it may only be called from within the
+back end redraw function, so this is as good a place as any to document
+it.)
+
+The supplied text is filtered through the mid-end for optional rewriting
+before being passed on to the front end; the mid-end will prepend the
+current game time if the game is timed (and may in future perform other
+rewriting if it seems like a good idea).
+
+This function is for drawing only; it must never be called during
+printing.
+
+3.1.13. Blitter functions
+-------------------------
+
+This section describes a group of related functions which save and
+restore a section of the puzzle window. This is most commonly used to
+implement user interfaces involving dragging a puzzle element around the
+window: at the end of each call to redraw(), if an object is currently
+being dragged, the back end saves the window contents under that
+location and then draws the dragged object, and at the start of the next
+redraw() the first thing it does is to restore the background.
+
+The front end defines an opaque type called a `blitter', which is
+capable of storing a rectangular area of a specified size.
+
+Blitter functions are for drawing only; they must never be called during
+printing.
+
+3.1.13.1. blitter_new()
+-----------------------
+
+  blitter *blitter_new(drawing *dr, int w, int h);
+
+Creates a new blitter object which stores a rectangle of size `w' by `h'
+pixels. Returns a pointer to the blitter object.
+
+Blitter objects are best stored in the `game_drawstate'. A good time to
+create them is in the set_size() function (section 2.8.5), since it is
+at this point that you first know how big a rectangle they will need to
+save.
+
+3.1.13.2. blitter_free()
+------------------------
+
+  void blitter_free(drawing *dr, blitter *bl);
+
+Disposes of a blitter object. Best called in free_drawstate(). (However,
+check that the blitter object is not NULL before attempting to free it;
+it is possible that a draw state might be created and freed without ever
+having set_size() called on it in between.)
+
+3.1.13.3. blitter_save()
+------------------------
+
+  void blitter_save(drawing *dr, blitter *bl, int x, int y);
+
+This is a true drawing API function, in that it may only be called from
+within the game redraw routine. It saves a rectangular portion of the
+puzzle window into the specified blitter object.
+
+`x' and `y' give the coordinates of the top left corner of the saved
+rectangle. The rectangle's width and height are the ones specified when
+the blitter object was created.
+
+This function is required to cope and do the right thing if `x' and `y'
+are out of range. (The right thing probably means saving whatever part
+of the blitter rectangle overlaps with the visible area of the puzzle
+window.)
+
+3.1.13.4. blitter_load()
+------------------------
+
+  void blitter_load(drawing *dr, blitter *bl, int x, int y);
+
+This is a true drawing API function, in that it may only be called from
+within the game redraw routine. It restores a rectangular portion of the
+puzzle window from the specified blitter object.
+
+`x' and `y' give the coordinates of the top left corner of the rectangle
+to be restored. The rectangle's width and height are the ones specified
+when the blitter object was created.
+
+Alternatively, you can specify both `x' and `y' as the special value
+BLITTER_FROMSAVED, in which case the rectangle will be restored to
+exactly where it was saved from. (This is probably what you want to do
+almost all the time, if you're using blitters to implement draggable
+puzzle elements.)
+
+This function is required to cope and do the right thing if `x' and
+`y' (or the equivalent ones saved in the blitter) are out of range.
+(The right thing probably means restoring whatever part of the blitter
+rectangle overlaps with the visible area of the puzzle window.)
+
+If this function is called on a blitter which had previously been saved
+from a partially out-of-range rectangle, then the parts of the saved
+bitmap which were not visible at save time are undefined. If the blitter
+is restored to a different position so as to make those parts visible,
+the effect on the drawing area is undefined.
+
+3.1.14. print_mono_colour()
+---------------------------
+
+  int print_mono_colour(drawing *dr, int grey);
+
+This function allocates a colour index for a simple monochrome colour
+during printing.
+
+`grey' must be 0 or 1. If `grey' is 0, the colour returned is black; if
+`grey' is 1, the colour is white.
+
+3.1.15. print_grey_colour()
+---------------------------
+
+  int print_grey_colour(drawing *dr, float grey);
+
+This function allocates a colour index for a grey-scale colour during
+printing.
+
+`grey' may be any number between 0 (black) and 1 (white); for example,
+0.5 indicates a medium grey.
+
+The chosen colour will be rendered to the limits of the printer's
+halftoning capability.
+
+3.1.16. print_hatched_colour()
+------------------------------
+
+  int print_hatched_colour(drawing *dr, int hatch);
+
+This function allocates a colour index which does not represent a
+literal _colour_. Instead, regions shaded in this colour will be hatched
+with parallel lines. The `hatch' parameter defines what type of hatching
+should be used in place of this colour:
+
+HATCH_SLASH
+
+    This colour will be hatched by lines slanting to the right at 45
+    degrees.
+
+HATCH_BACKSLASH
+
+    This colour will be hatched by lines slanting to the left at 45
+    degrees.
+
+HATCH_HORIZ
+
+    This colour will be hatched by horizontal lines.
+
+HATCH_VERT
+
+    This colour will be hatched by vertical lines.
+
+HATCH_PLUS
+
+    This colour will be hatched by criss-crossing horizontal and
+    vertical lines.
+
+HATCH_X
+
+    This colour will be hatched by criss-crossing diagonal lines.
+
+Colours defined to use hatching may not be used for drawing lines or
+text; they may only be used for filling areas. That is, they may be
+used as the `fillcolour' parameter to draw_circle() and draw_polygon(),
+and as the colour parameter to draw_rect(), but may not be used as the
+`outlinecolour' parameter to draw_circle() or draw_polygon(), or with
+draw_line() or draw_text().
+
+3.1.17. print_rgb_mono_colour()
+-------------------------------
+
+  int print_rgb_mono_colour(drawing *dr, float r, float g,
+                            float b, float grey);
+
+This function allocates a colour index for a fully specified RGB colour
+during printing.
+
+`r', `g' and `b' may each be anywhere in the range from 0 to 1.
+
+If printing in black and white only, these values will be ignored, and
+either pure black or pure white will be used instead, according to the
+`grey' parameter. (The fallback colour is the same as the one which
+would be allocated by print_mono_colour(grey).)
+
+3.1.18. print_rgb_grey_colour()
+-------------------------------
+
+  int print_rgb_grey_colour(drawing *dr, float r, float g,
+                            float b, float grey);
+
+This function allocates a colour index for a fully specified RGB colour
+during printing.
+
+`r', `g' and `b' may each be anywhere in the range from 0 to 1.
+
+If printing in black and white only, these values will be ignored, and
+a shade of grey given by the `grey' parameter will be used instead.
+(The fallback colour is the same as the one which would be allocated by
+print_grey_colour(grey).)
+
+3.1.19. print_rgb_hatched_colour()
+----------------------------------
+
+  int print_rgb_hatched_colour(drawing *dr, float r, float g,
+                               float b, float hatched);
+
+This function allocates a colour index for a fully specified RGB colour
+during printing.
+
+`r', `g' and `b' may each be anywhere in the range from 0 to 1.
+
+If printing in black and white only, these values will be ignored, and
+a form of cross-hatching given by the `hatch' parameter will be used
+instead; see section 3.1.16 for the possible values of this parameter.
+(The fallback colour is the same as the one which would be allocated by
+print_hatched_colour(hatch).)
+
+3.1.20. print_line_width()
+--------------------------
+
+  void print_line_width(drawing *dr, int width);
+
+This function is called to set the thickness of lines drawn during
+printing. It is meaningless in drawing: all lines drawn by draw_line(),
+draw_circle and draw_polygon() are one pixel in thickness. However, in
+printing there is no clear definition of a pixel and so line widths must
+be explicitly specified.
+
+The line width is specified in the usual coordinate system. Note,
+however, that it is a hint only: the central printing system may choose
+to vary line thicknesses at user request or due to printer capabilities.
+
+3.1.21. print_line_dotted()
+---------------------------
+
+  void print_line_dotted(drawing *dr, int dotted);
+
+This function is called to toggle the drawing of dotted lines during
+printing. It is not supported during drawing.
+
+The parameter `dotted' is a boolean; TRUE means that future lines drawn
+by draw_line(), draw_circle and draw_polygon() will be dotted, and FALSE
+means that they will be solid.
+
+Some front ends may impose restrictions on the width of dotted lines.
+Asking for a dotted line via this front end will override any line width
+request if the front end requires it.
+
+3.2. The drawing API as implemented by the front end
+----------------------------------------------------
+
+This section describes the drawing API in the function-pointer form in
+which it is implemented by a front end.
+
+(It isn't only platform-specific front ends which implement this API;
+the platform-independent module `ps.c' also provides an implementation
+of it which outputs PostScript. Thus, any platform which wants to do PS
+printing can do so with minimum fuss.)
+
+The following entries all describe function pointer fields in a
+structure called `drawing_api'. Each of the functions takes a `void *'
+context pointer, which it should internally cast back to a more useful
+type. Thus, a drawing _object_ (`drawing *)' suitable for passing to
+the back end redraw or printing functions is constructed by passing a
+`drawing_api' and a `void *' to the function drawing_new() (see section
+3.3.1).
+
+3.2.1. draw_text()
+------------------
+
+  void (*draw_text)(void *handle, int x, int y, int fonttype,
+                    int fontsize, int align, int colour, char *text);
+
+This function behaves exactly like the back end draw_text() function;
+see section 3.1.7.
+
+3.2.2. draw_rect()
+------------------
+
+  void (*draw_rect)(void *handle, int x, int y, int w, int h,
+                    int colour);
+
+This function behaves exactly like the back end draw_rect() function;
+see section 3.1.1.
+
+3.2.3. draw_line()
+------------------
+
+  void (*draw_line)(void *handle, int x1, int y1, int x2, int y2,
+                    int colour);
+
+This function behaves exactly like the back end draw_line() function;
+see section 3.1.3.
+
+3.2.4. draw_polygon()
+---------------------
+
+  void (*draw_polygon)(void *handle, int *coords, int npoints,
+                       int fillcolour, int outlinecolour);
+
+This function behaves exactly like the back end draw_polygon() function;
+see section 3.1.4.
+
+3.2.5. draw_circle()
+--------------------
+
+  void (*draw_circle)(void *handle, int cx, int cy, int radius,
+                      int fillcolour, int outlinecolour);
+
+This function behaves exactly like the back end draw_circle() function;
+see section 3.1.5.
+
+3.2.6. draw_thick_line()
+------------------------
+
+  void draw_thick_line(drawing *dr, float thickness,
+                       float x1, float y1, float x2, float y2,
+                       int colour)
+
+This function behaves exactly like the back end draw_thick_line()
+function; see section 3.1.6.
+
+An implementation of this API which doesn't provide high-quality
+rendering of thick lines is permitted to define this function pointer
+to be NULL. The middleware in drawing.c will notice and provide a low-
+quality alternative using draw_polygon().
+
+3.2.7. draw_update()
+--------------------
+
+  void (*draw_update)(void *handle, int x, int y, int w, int h);
+
+This function behaves exactly like the back end draw_update() function;
+see section 3.1.11.
+
+An implementation of this API which only supports printing is permitted
+to define this function pointer to be NULL rather than bothering to
+define an empty function. The middleware in drawing.c will notice and
+avoid calling it.
+
+3.2.8. clip()
+-------------
+
+  void (*clip)(void *handle, int x, int y, int w, int h);
+
+This function behaves exactly like the back end clip() function; see
+section 3.1.9.
+
+3.2.9. unclip()
+---------------
+
+  void (*unclip)(void *handle);
+
+This function behaves exactly like the back end unclip() function; see
+section 3.1.10.
+
+3.2.10. start_draw()
+--------------------
+
+  void (*start_draw)(void *handle);
+
+This function is called at the start of drawing. It allows the front end
+to initialise any temporary data required to draw with, such as device
+contexts.
+
+Implementations of this API which do not provide drawing services may
+define this function pointer to be NULL; it will never be called unless
+drawing is attempted.
+
+3.2.11. end_draw()
+------------------
+
+  void (*end_draw)(void *handle);
+
+This function is called at the end of drawing. It allows the front end
+to do cleanup tasks such as deallocating device contexts and scheduling
+appropriate GUI redraw events.
+
+Implementations of this API which do not provide drawing services may
+define this function pointer to be NULL; it will never be called unless
+drawing is attempted.
+
+3.2.12. status_bar()
+--------------------
+
+  void (*status_bar)(void *handle, char *text);
+
+This function behaves exactly like the back end status_bar() function;
+see section 3.1.12.
+
+Front ends implementing this function need not worry about it
+being called repeatedly with the same text; the middleware code in
+status_bar() will take care of this.
+
+Implementations of this API which do not provide drawing services may
+define this function pointer to be NULL; it will never be called unless
+drawing is attempted.
+
+3.2.13. blitter_new()
+---------------------
+
+  blitter *(*blitter_new)(void *handle, int w, int h);
+
+This function behaves exactly like the back end blitter_new() function;
+see section 3.1.13.1.
+
+Implementations of this API which do not provide drawing services may
+define this function pointer to be NULL; it will never be called unless
+drawing is attempted.
+
+3.2.14. blitter_free()
+----------------------
+
+  void (*blitter_free)(void *handle, blitter *bl);
+
+This function behaves exactly like the back end blitter_free() function;
+see section 3.1.13.2.
+
+Implementations of this API which do not provide drawing services may
+define this function pointer to be NULL; it will never be called unless
+drawing is attempted.
+
+3.2.15. blitter_save()
+----------------------
+
+  void (*blitter_save)(void *handle, blitter *bl, int x, int y);
+
+This function behaves exactly like the back end blitter_save() function;
+see section 3.1.13.3.
+
+Implementations of this API which do not provide drawing services may
+define this function pointer to be NULL; it will never be called unless
+drawing is attempted.
+
+3.2.16. blitter_load()
+----------------------
+
+  void (*blitter_load)(void *handle, blitter *bl, int x, int y);
+
+This function behaves exactly like the back end blitter_load() function;
+see section 3.1.13.4.
+
+Implementations of this API which do not provide drawing services may
+define this function pointer to be NULL; it will never be called unless
+drawing is attempted.
+
+3.2.17. begin_doc()
+-------------------
+
+  void (*begin_doc)(void *handle, int pages);
+
+This function is called at the beginning of a printing run. It gives the
+front end an opportunity to initialise any required printing subsystem.
+It also provides the number of pages in advance.
+
+Implementations of this API which do not provide printing services may
+define this function pointer to be NULL; it will never be called unless
+printing is attempted.
+
+3.2.18. begin_page()
+--------------------
+
+  void (*begin_page)(void *handle, int number);
+
+This function is called during printing, at the beginning of each page.
+It gives the page number (numbered from 1 rather than 0, so suitable for
+use in user-visible contexts).
+
+Implementations of this API which do not provide printing services may
+define this function pointer to be NULL; it will never be called unless
+printing is attempted.
+
+3.2.19. begin_puzzle()
+----------------------
+
+  void (*begin_puzzle)(void *handle, float xm, float xc,
+                       float ym, float yc, int pw, int ph, float wmm);
+
+This function is called during printing, just before printing a single
+puzzle on a page. It specifies the size and location of the puzzle on
+the page.
+
+`xm' and `xc' specify the horizontal position of the puzzle on the page,
+as a linear function of the page width. The front end is expected to
+multiply the page width by `xm', add `xc' (measured in millimetres), and
+use the resulting x-coordinate as the left edge of the puzzle.
+
+Similarly, `ym' and `yc' specify the vertical position of the puzzle as
+a function of the page height: the page height times `ym', plus `yc'
+millimetres, equals the desired distance from the top of the page to the
+top of the puzzle.
+
+(This unwieldy mechanism is required because not all printing systems
+can communicate the page size back to the software. The PostScript back
+end, for example, writes out PS which determines the page size at print
+time by means of calling `clippath', and centres the puzzles within
+that. Thus, exactly the same PS file works on A4 or on US Letter paper
+without needing local configuration, which simplifies matters.)
+
+pw and ph give the size of the puzzle in drawing API coordinates. The
+printing system will subsequently call the puzzle's own print function,
+which will in turn call drawing API functions in the expectation that an
+area pw by ph units is available to draw the puzzle on.
+
+Finally, wmm gives the desired width of the puzzle in millimetres. (The
+aspect ratio is expected to be preserved, so if the desired puzzle
+height is also needed then it can be computed as wmm*ph/pw.)
+
+Implementations of this API which do not provide printing services may
+define this function pointer to be NULL; it will never be called unless
+printing is attempted.
+
+3.2.20. end_puzzle()
+--------------------
+
+  void (*end_puzzle)(void *handle);
+
+This function is called after the printing of a specific puzzle is
+complete.
+
+Implementations of this API which do not provide printing services may
+define this function pointer to be NULL; it will never be called unless
+printing is attempted.
+
+3.2.21. end_page()
+------------------
+
+  void (*end_page)(void *handle, int number);
+
+This function is called after the printing of a page is finished.
+
+Implementations of this API which do not provide printing services may
+define this function pointer to be NULL; it will never be called unless
+printing is attempted.
+
+3.2.22. end_doc()
+-----------------
+
+  void (*end_doc)(void *handle);
+
+This function is called after the printing of the entire document is
+finished. This is the moment to close files, send things to the print
+spooler, or whatever the local convention is.
+
+Implementations of this API which do not provide printing services may
+define this function pointer to be NULL; it will never be called unless
+printing is attempted.
+
+3.2.23. line_width()
+--------------------
+
+  void (*line_width)(void *handle, float width);
+
+This function is called to set the line thickness, during printing only.
+Note that the width is a float here, where it was an int as seen by the
+back end. This is because drawing.c may have scaled it on the way past.
+
+However, the width is still specified in the same coordinate system as
+the rest of the drawing.
+
+Implementations of this API which do not provide printing services may
+define this function pointer to be NULL; it will never be called unless
+printing is attempted.
+
+3.2.24. text_fallback()
+-----------------------
+
+  char *(*text_fallback)(void *handle, const char *const *strings,
+                         int nstrings);
+
+This function behaves exactly like the back end text_fallback()
+function; see section 3.1.8.
+
+Implementations of this API which do not support any characters outside
+ASCII may define this function pointer to be NULL, in which case the
+central code in drawing.c will provide a default implementation.
+
+3.3. The drawing API as called by the front end
+-----------------------------------------------
+
+There are a small number of functions provided in drawing.c which the
+front end needs to _call_, rather than helping to implement. They are
+described in this section.
+
+3.3.1. drawing_new()
+--------------------
+
+  drawing *drawing_new(const drawing_api *api, midend *me,
+                       void *handle);
+
+This function creates a drawing object. It is passed a `drawing_api',
+which is a structure containing nothing but function pointers; and also
+a `void *' handle. The handle is passed back to each function pointer
+when it is called.
+
+The `midend' parameter is used for rewriting the status bar contents:
+status_bar() (see section 3.1.12) has to call a function in the mid-
+end which might rewrite the status bar text. If the drawing object
+is to be used only for printing, or if the game is known not to call
+status_bar(), this parameter may be NULL.
+
+3.3.2. drawing_free()
+---------------------
+
+  void drawing_free(drawing *dr);
+
+This function frees a drawing object. Note that the `void *' handle is
+not freed; if that needs cleaning up it must be done by the front end.
+
+3.3.3. print_get_colour()
+-------------------------
+
+  void print_get_colour(drawing *dr, int colour, int printincolour,
+                        int *hatch, float *r, float *g, float *b)
+
+This function is called by the implementations of the drawing API
+functions when they are called in a printing context. It takes a colour
+index as input, and returns the description of the colour as requested
+by the back end.
+
+`printincolour' is TRUE iff the implementation is printing in colour.
+This will alter the results returned if the colour in question was
+specified with a black-and-white fallback value.
+
+If the colour should be rendered by hatching, `*hatch' is filled with
+the type of hatching desired. See section 3.1.15 for details of the
+values this integer can take.
+
+If the colour should be rendered as solid colour, `*hatch' is given a
+negative value, and `*r', `*g' and `*b' are filled with the RGB values
+of the desired colour (if printing in colour), or all filled with the
+grey-scale value (if printing in black and white).
+
+4. The API provided by the mid-end
+----------------------------------
+
+This chapter documents the API provided by the mid-end to be called by
+the front end. You probably only need to read this if you are a front
+end implementor, i.e. you are porting Puzzles to a new platform. If
+you're only interested in writing new puzzles, you can safely skip this
+chapter.
+
+All the persistent state in the mid-end is encapsulated within a
+`midend' structure, to facilitate having multiple mid-ends in any
+port which supports multiple puzzle windows open simultaneously. Each
+`midend' is intended to handle the contents of a single puzzle window.
+
+4.1. midend_new()
+-----------------
+
+  midend *midend_new(frontend *fe, const game *ourgame,
+                     const drawing_api *drapi, void *drhandle)
+
+Allocates and returns a new mid-end structure.
+
+The `fe' argument is stored in the mid-end. It will be used when calling
+back to functions such as activate_timer() (section 4.37), and will be
+passed on to the back end function colours() (section 2.8.6).
+
+The parameters `drapi' and `drhandle' are passed to drawing_new()
+(section 3.3.1) to construct a drawing object which will be passed to
+the back end function redraw() (section 2.8.10). Hence, all drawing-
+related function pointers defined in `drapi' can expect to be called
+with `drhandle' as their first argument.
+
+The `ourgame' argument points to a container structure describing a game
+back end. The mid-end thus created will only be capable of handling that
+one game. (So even in a monolithic front end containing all the games,
+this imposes the constraint that any individual puzzle window is tied to
+a single game. Unless, of course, you feel brave enough to change the
+mid-end for the window without closing the window...)
+
+4.2. midend_free()
+------------------
+
+  void midend_free(midend *me);
+
+Frees a mid-end structure and all its associated data.
+
+4.3. midend_tilesize()
+----------------------
+
+  int midend_tilesize(midend *me);
+
+Returns the `tilesize' parameter being used to display the current
+puzzle (section 2.8.3).
+
+4.4. midend_set_params()
+------------------------
+
+  void midend_set_params(midend *me, game_params *params);
+
+Sets the current game parameters for a mid-end. Subsequent games
+generated by midend_new_game() (section 4.8) will use these parameters
+until further notice.
+
+The usual way in which the front end will have an actual `game_params'
+structure to pass to this function is if it had previously got it from
+midend_fetch_preset() (section 4.16). Thus, this function is usually
+called in response to the user making a selection from the presets menu.
+
+4.5. midend_get_params()
+------------------------
+
+  game_params *midend_get_params(midend *me);
+
+Returns the current game parameters stored in this mid-end.
+
+The returned value is dynamically allocated, and should be freed when
+finished with by passing it to the game's own free_params() function
+(see section 2.3.5).
+
+4.6. midend_size()
+------------------
+
+  void midend_size(midend *me, int *x, int *y, int user_size);
+
+Tells the mid-end to figure out its window size.
+
+On input, `*x' and `*y' should contain the maximum or requested size
+for the window. (Typically this will be the size of the screen that the
+window has to fit on, or similar.) The mid-end will repeatedly call the
+back end function compute_size() (section 2.8.4), searching for a tile
+size that best satisfies the requirements. On exit, `*x' and `*y' will
+contain the size needed for the puzzle window's drawing area. (It is
+of course up to the front end to adjust this for any additional window
+furniture such as menu bars and window borders, if necessary. The status
+bar is also not included in this size.)
+
+Use `user_size' to indicate whether `*x' and `*y' are a requested size,
+or just a maximum size.
+
+If `user_size' is set to TRUE, the mid-end will treat the input size as
+a request, and will pick a tile size which approximates it _as closely
+as possible_, going over the game's preferred tile size if necessary to
+achieve this. The mid-end will also use the resulting tile size as its
+preferred one until further notice, on the assumption that this size was
+explicitly requested by the user. Use this option if you want your front
+end to support dynamic resizing of the puzzle window with automatic
+scaling of the puzzle to fit.
+
+If `user_size' is set to FALSE, then the game's tile size will never go
+over its preferred one, although it may go under in order to fit within
+the maximum bounds specified by `*x' and `*y'. This is the recommended
+approach when opening a new window at default size: the game will use
+its preferred size unless it has to use a smaller one to fit on the
+screen. If the tile size is shrunk for this reason, the change will not
+persist; if a smaller grid is subsequently chosen, the tile size will
+recover.
+
+The mid-end will try as hard as it can to return a size which is
+less than or equal to the input size, in both dimensions. In extreme
+circumstances it may fail (if even the lowest possible tile size gives
+window dimensions greater than the input), in which case it will return
+a size greater than the input size. Front ends should be prepared
+for this to happen (i.e. don't crash or fail an assertion), but may
+handle it in any way they see fit: by rejecting the game parameters
+which caused the problem, by opening a window larger than the screen
+regardless of inconvenience, by introducing scroll bars on the window,
+by drawing on a large bitmap and scaling it into a smaller window, or by
+any other means you can think of. It is likely that when the tile size
+is that small the game will be unplayable anyway, so don't put _too_
+much effort into handling it creatively.
+
+If your platform has no limit on window size (or if you're planning to
+use scroll bars for large puzzles), you can pass dimensions of INT_MAX
+as input to this function. You should probably not do that _and_ set the
+`user_size' flag, though!
+
+The midend relies on the frontend calling midend_new_game() (section
+4.8) before calling midend_size().
+
+4.7. midend_reset_tilesize()
+----------------------------
+
+  void midend_reset_tilesize(midend *me);
+
+This function resets the midend's preferred tile size to that of the
+standard puzzle.
+
+As discussed in section 4.6, puzzle resizes are typically 'sticky',
+in that once the user has dragged the puzzle to a different window
+size, the resulting tile size will be remembered and used when the
+puzzle configuration changes. If you _don't_ want that, e.g. if you
+want to provide a command to explicitly reset the puzzle size back to
+its default, then you can call this just before calling midend_size()
+(which, in turn, you would probably call with `user_size' set to FALSE).
+
+4.8. midend_new_game()
+----------------------
+
+  void midend_new_game(midend *me);
+
+Causes the mid-end to begin a new game. Normally the game will be a
+new randomly generated puzzle. However, if you have previously called
+midend_game_id() or midend_set_config(), the game generated might be
+dictated by the results of those functions. (In particular, you _must_
+call midend_new_game() after calling either of those functions, or else
+no immediate effect will be visible.)
+
+You will probably need to call midend_size() after calling this
+function, because if the game parameters have been changed since the
+last new game then the window size might need to change. (If you know
+the parameters _haven't_ changed, you don't need to do this.)
+
+This function will create a new `game_drawstate', but does not actually
+perform a redraw (since you often need to call midend_size() before
+the redraw can be done). So after calling this function and after
+calling midend_size(), you should then call midend_redraw(). (It is not
+necessary to call midend_force_redraw(); that will discard the draw
+state and create a fresh one, which is unnecessary in this case since
+there's a fresh one already. It would work, but it's usually excessive.)
+
+4.9. midend_restart_game()
+--------------------------
+
+  void midend_restart_game(midend *me);
+
+This function causes the current game to be restarted. This is done by
+placing a new copy of the original game state on the end of the undo
+list (so that an accidental restart can be undone).
+
+This function automatically causes a redraw, i.e. the front end can
+expect its drawing API to be called from _within_ a call to this
+function. Some back ends require that midend_size() (section 4.6) is
+called before midend_restart_game().
+
+4.10. midend_force_redraw()
+---------------------------
+
+  void midend_force_redraw(midend *me);
+
+Forces a complete redraw of the puzzle window, by means of discarding
+the current `game_drawstate' and creating a new one from scratch before
+calling the game's redraw() function.
+
+The front end can expect its drawing API to be called from within a call
+to this function. Some back ends require that midend_size() (section
+4.6) is called before midend_force_redraw().
+
+4.11. midend_redraw()
+---------------------
+
+  void midend_redraw(midend *me);
+
+Causes a partial redraw of the puzzle window, by means of simply calling
+the game's redraw() function. (That is, the only things redrawn will be
+things that have changed since the last redraw.)
+
+The front end can expect its drawing API to be called from within a call
+to this function. Some back ends require that midend_size() (section
+4.6) is called before midend_redraw().
+
+4.12. midend_process_key()
+--------------------------
+
+  int midend_process_key(midend *me, int x, int y, int button);
+
+The front end calls this function to report a mouse or keyboard event.
+The parameters `x', `y' and `button' are almost identical to the ones
+passed to the back end function interpret_move() (section 2.7.1), except
+that the front end is _not_ required to provide the guarantees about
+mouse event ordering. The mid-end will sort out multiple simultaneous
+button presses and changes of button; the front end's responsibility
+is simply to pass on the mouse events it receives as accurately as
+possible.
+
+(Some platforms may need to emulate absent mouse buttons by means of
+using a modifier key such as Shift with another mouse button. This tends
+to mean that if Shift is pressed or released in the middle of a mouse
+drag, the mid-end will suddenly stop receiving, say, LEFT_DRAG events
+and start receiving RIGHT_DRAGs, with no intervening button release or
+press events. This too is something which the mid-end will sort out for
+you; the front end has no obligation to maintain sanity in this area.)
+
+The front end _should_, however, always eventually send some kind of
+button release. On some platforms this requires special effort: Windows,
+for example, requires a call to the system API function SetCapture() in
+order to ensure that your window receives a mouse-up event even if the
+pointer has left the window by the time the mouse button is released.
+On any platform that requires this sort of thing, the front end _is_
+responsible for doing it.
+
+Calling this function is very likely to result in calls back to the
+front end's drawing API and/or activate_timer() (section 4.37).
+
+The return value from midend_process_key() is non-zero, unless the
+effect of the keypress was to request termination of the program. A
+front end should shut down the puzzle in response to a zero return.
+
+4.13. midend_colours()
+----------------------
+
+  float *midend_colours(midend *me, int *ncolours);
+
+Returns an array of the colours required by the game, in exactly
+the same format as that returned by the back end function colours()
+(section 2.8.6). Front ends should call this function rather than
+calling the back end's version directly, since the mid-end adds standard
+customisation facilities. (At the time of writing, those customisation
+facilities are implemented hackily by means of environment variables,
+but it's not impossible that they may become more full and formal in
+future.)
+
+4.14. midend_timer()
+--------------------
+
+  void midend_timer(midend *me, float tplus);
+
+If the mid-end has called activate_timer() (section 4.37) to request
+regular callbacks for purposes of animation or timing, this is the
+function the front end should call on a regular basis. The argument
+`tplus' gives the time, in seconds, since the last time either this
+function was called or activate_timer() was invoked.
+
+One of the major purposes of timing in the mid-end is to perform move
+animation. Therefore, calling this function is very likely to result in
+calls back to the front end's drawing API.
+
+4.15. midend_num_presets()
+--------------------------
+
+  int midend_num_presets(midend *me);
+
+Returns the number of game parameter presets supplied by this game.
+Front ends should use this function and midend_fetch_preset() to
+configure their presets menu rather than calling the back end directly,
+since the mid-end adds standard customisation facilities. (At the time
+of writing, those customisation facilities are implemented hackily by
+means of environment variables, but it's not impossible that they may
+become more full and formal in future.)
+
+4.16. midend_fetch_preset()
+---------------------------
+
+  void midend_fetch_preset(midend *me, int n,
+                           char **name, game_params **params);
+
+Returns one of the preset game parameter structures for the game.
+On input `n' must be a non-negative integer and less than the value
+returned from midend_num_presets(). On output, `*name' is set to an
+ASCII string suitable for entering in the game's presets menu, and
+`*params' is set to the corresponding `game_params' structure.
+
+Both of the two output values are dynamically allocated, but they are
+owned by the mid-end structure: the front end should not ever free them
+directly, because they will be freed automatically during midend_free().
+
+4.17. midend_which_preset()
+---------------------------
+
+  int midend_which_preset(midend *me);
+
+Returns the numeric index of the preset game parameter structure which
+matches the current game parameters, or a negative number if no preset
+matches. Front ends could use this to maintain a tick beside one of the
+items in the menu (or tick the `Custom' option if the return value is
+less than zero).
+
+4.18. midend_wants_statusbar()
+------------------------------
+
+  int midend_wants_statusbar(midend *me);
+
+This function returns TRUE if the puzzle has a use for a textual status
+line (to display score, completion status, currently active tiles, time,
+or anything else).
+
+Front ends should call this function rather than talking directly to the
+back end.
+
+4.19. midend_get_config()
+-------------------------
+
+  config_item *midend_get_config(midend *me, int which,
+                                 char **wintitle);
+
+Returns a dialog box description for user configuration.
+
+On input, which should be set to one of three values, which select which
+of the various dialog box descriptions is returned:
+
+CFG_SETTINGS
+
+    Requests the GUI parameter configuration box generated by the puzzle
+    itself. This should be used when the user selects `Custom' from the
+    game types menu (or equivalent). The mid-end passes this request on
+    to the back end function configure() (section 2.3.8).
+
+CFG_DESC
+
+    Requests a box suitable for entering a descriptive game ID (and
+    viewing the existing one). The mid-end generates this dialog box
+    description itself. This should be used when the user selects
+    `Specific' from the game menu (or equivalent).
+
+CFG_SEED
+
+    Requests a box suitable for entering a random-seed game ID (and
+    viewing the existing one). The mid-end generates this dialog box
+    description itself. This should be used when the user selects
+    `Random Seed' from the game menu (or equivalent).
+
+The returned value is an array of config_items, exactly as described
+in section 2.3.8. Another returned value is an ASCII string giving a
+suitable title for the configuration window, in `*wintitle'.
+
+Both returned values are dynamically allocated and will need to be
+freed. The window title can be freed in the obvious way; the config_item
+array is a slightly complex structure, so a utility function free_cfg()
+is provided to free it for you. See section 5.2.6.
+
+(Of course, you will probably not want to free the config_item array
+until the dialog box is dismissed, because before then you will probably
+need to pass it to midend_set_config.)
+
+4.20. midend_set_config()
+-------------------------
+
+  char *midend_set_config(midend *me, int which,
+                          config_item *cfg);
+
+Passes the mid-end the results of a configuration dialog box. `which'
+should have the same value which it had when midend_get_config() was
+called; `cfg' should be the array of `config_item's returned from
+midend_get_config(), modified to contain the results of the user's
+editing operations.
+
+This function returns NULL on success, or otherwise (if the
+configuration data was in some way invalid) an ASCII string containing
+an error message suitable for showing to the user.
+
+If the function succeeds, it is likely that the game parameters will
+have been changed and it is certain that a new game will be requested.
+The front end should therefore call midend_new_game(), and probably also
+re-think the window size using midend_size() and eventually perform a
+refresh using midend_redraw().
+
+4.21. midend_game_id()
+----------------------
+
+  char *midend_game_id(midend *me, char *id);
+
+Passes the mid-end a string game ID (of any of the valid forms `params',
+`params:description' or `params#seed') which the mid-end will process
+and use for the next generated game.
+
+This function returns NULL on success, or otherwise (if the
+configuration data was in some way invalid) an ASCII string containing
+an error message (not dynamically allocated) suitable for showing to the
+user. In the event of an error, the mid-end's internal state will be
+left exactly as it was before the call.
+
+If the function succeeds, it is likely that the game parameters will
+have been changed and it is certain that a new game will be requested.
+The front end should therefore call midend_new_game(), and probably
+also re-think the window size using midend_size() and eventually case a
+refresh using midend_redraw().
+
+4.22. midend_get_game_id()
+--------------------------
+
+  char *midend_get_game_id(midend *me)
+
+Returns a descriptive game ID (i.e. one in the form
+`params:description') describing the game currently active in the mid-
+end. The returned string is dynamically allocated.
+
+4.23. midend_get_random_seed()
+------------------------------
+
+  char *midend_get_random_seed(midend *me)
+
+Returns a random game ID (i.e. one in the form `params#seedstring')
+describing the game currently active in the mid-end, if there is one.
+If the game was created by entering a description, no random seed will
+currently exist and this function will return NULL.
+
+The returned string, if it is non-NULL, is dynamically allocated.
+
+4.24. midend_can_format_as_text_now()
+-------------------------------------
+
+  int midend_can_format_as_text_now(midend *me);
+
+Returns TRUE if the game code is capable of formatting puzzles of the
+currently selected game type as ASCII.
+
+If this returns FALSE, then midend_text_format() (section 4.25) will
+return NULL.
+
+4.25. midend_text_format()
+--------------------------
+
+  char *midend_text_format(midend *me);
+
+Formats the current game's current state as ASCII text suitable for
+copying to the clipboard. The returned string is dynamically allocated.
+
+If the game's `can_format_as_text_ever' flag is FALSE, or if its
+can_format_as_text_now() function returns FALSE, then this function will
+return NULL.
+
+If the returned string contains multiple lines (which is likely), it
+will use the normal C line ending convention (\n only). On platforms
+which use a different line ending convention for data in the clipboard,
+it is the front end's responsibility to perform the conversion.
+
+4.26. midend_solve()
+--------------------
+
+  char *midend_solve(midend *me);
+
+Requests the mid-end to perform a Solve operation.
+
+On success, NULL is returned. On failure, an error message (not
+dynamically allocated) is returned, suitable for showing to the user.
+
+The front end can expect its drawing API and/or activate_timer() to be
+called from within a call to this function. Some back ends require that
+midend_size() (section 4.6) is called before midend_solve().
+
+4.27. midend_status()
+---------------------
+
+  int midend_status(midend *me);
+
+This function returns +1 if the midend is currently displaying a game
+in a solved state, -1 if the game is in a permanently lost state, or 0
+otherwise. This function just calls the back end's status() function.
+Front ends may wish to use this as a cue to proactively offer the option
+of starting a new game.
+
+(See section 2.8.9 for more detail about the back end's status()
+function and discussion of what should count as which status code.)
+
+4.28. midend_can_undo()
+-----------------------
+
+  int midend_can_undo(midend *me);
+
+Returns TRUE if the midend is currently in a state where the undo
+operation is meaningful (i.e. at least one position exists on the undo
+chain before the present one). Front ends may wish to use this to
+visually activate and deactivate an undo button.
+
+4.29. midend_can_redo()
+-----------------------
+
+  int midend_can_redo(midend *me);
+
+Returns TRUE if the midend is currently in a state where the redo
+operation is meaningful (i.e. at least one position exists on the
+redo chain after the present one). Front ends may wish to use this to
+visually activate and deactivate a redo button.
+
+4.30. midend_serialise()
+------------------------
+
+  void midend_serialise(midend *me,
+                        void (*write)(void *ctx, void *buf, int len),
+                        void *wctx);
+
+Calling this function causes the mid-end to convert its entire internal
+state into a long ASCII text string, and to pass that string (piece by
+piece) to the supplied `write' function.
+
+Desktop implementations can use this function to save a game in any
+state (including half-finished) to a disk file, by supplying a `write'
+function which is a wrapper on fwrite() (or local equivalent). Other
+implementations may find other uses for it, such as compressing the
+large and sprawling mid-end state into a manageable amount of memory
+when a palmtop application is suspended so that another one can run; in
+this case write might want to write to a memory buffer rather than a
+file. There may be other uses for it as well.
+
+This function will call back to the supplied `write' function a number
+of times, with the first parameter (`ctx') equal to `wctx', and the
+other two parameters pointing at a piece of the output string.
+
+4.31. midend_deserialise()
+--------------------------
+
+  char *midend_deserialise(midend *me,
+                           int (*read)(void *ctx, void *buf, int len),
+                           void *rctx);
+
+This function is the counterpart to midend_serialise(). It calls the
+supplied read function repeatedly to read a quantity of data, and
+attempts to interpret that data as a serialised mid-end as output by
+midend_serialise().
+
+The read function is called with the first parameter (`ctx') equal
+to `rctx', and should attempt to read `len' bytes of data into the
+buffer pointed to by `buf'. It should return FALSE on failure or TRUE
+on success. It should not report success unless it has filled the
+entire buffer; on platforms which might be reading from a pipe or other
+blocking data source, `read' is responsible for looping until the whole
+buffer has been filled.
+
+If the de-serialisation operation is successful, the mid-end's internal
+data structures will be replaced by the results of the load, and NULL
+will be returned. Otherwise, the mid-end's state will be completely
+unchanged and an error message (typically some variation on `save file
+is corrupt') will be returned. As usual, the error message string is not
+dynamically allocated.
+
+If this function succeeds, it is likely that the game parameters will
+have been changed. The front end should therefore probably re-think the
+window size using midend_size(), and probably cause a refresh using
+midend_redraw().
+
+Because each mid-end is tied to a specific game back end, this function
+will fail if you attempt to read in a save file generated by a different
+game from the one configured in this mid-end, even if your application
+is a monolithic one containing all the puzzles. See section 4.32 for a
+helper function which will allow you to identify a save file before you
+instantiate your mid-end in the first place.
+
+4.32. identify_game()
+---------------------
+
+  char *identify_game(char **name,
+                      int (*read)(void *ctx, void *buf, int len),
+                      void *rctx);
+
+This function examines a serialised midend stream, of the same kind used
+by midend_serialise() and midend_deserialise(), and returns the name
+field of the game back end from which it was saved.
+
+You might want this if your front end was a monolithic one containing
+all the puzzles, and you wanted to be able to load an arbitrary save
+file and automatically switch to the right game. Probably your next step
+would be to iterate through gamelist (section 4.34) looking for a game
+structure whose name field matched the returned string, and give an
+error if you didn't find one.
+
+On success, the return value of this function is NULL, and the game name
+string is written into *name. The caller should free that string after
+using it.
+
+On failure, *name is NULL, and the return value is an error message
+(which does not need freeing at all).
+
+(This isn't strictly speaking a midend function, since it doesn't accept
+or return a pointer to a midend. You'd probably call it just _before_
+deciding what kind of midend you wanted to instantiate.)
+
+4.33. midend_request_id_changes()
+---------------------------------
+
+  void midend_request_id_changes(midend *me,
+                                 void (*notify)(void *), void *ctx);
+
+This function is called by the front end to request notification by the
+mid-end when the current game IDs (either descriptive or random-seed)
+change. This can occur as a result of keypresses ('n' for New Game, for
+example) or when a puzzle supersedes its game description (see section
+2.11.2). After this function is called, any change of the game ids will
+cause the mid-end to call notify(ctx) after the change.
+
+This is for use by puzzles which want to present the game description to
+the user constantly (e.g. as an HTML hyperlink) instead of only showing
+it when the user explicitly requests it.
+
+This is a function I anticipate few front ends needing to implement, so
+I make it a callback rather than a static function in order to relieve
+most front ends of the need to provide an empty implementation.
+
+4.34. Direct reference to the back end structure by the front end
+-----------------------------------------------------------------
+
+Although _most_ things the front end needs done should be done by
+calling the mid-end, there are a few situations in which the front end
+needs to refer directly to the game back end structure.
+
+The most obvious of these is
+
+ -  passing the game back end as a parameter to midend_new().
+
+There are a few other back end features which are not wrapped by the
+mid-end because there didn't seem much point in doing so:
+
+ -  fetching the `name' field to use in window titles and similar
+
+ -  reading the `can_configure', `can_solve' and
+    `can_format_as_text_ever' fields to decide whether to add those
+    items to the menu bar or equivalent
+
+ -  reading the `winhelp_topic' field (Windows only)
+
+ -  the GTK front end provides a `--generate' command-line option which
+    directly calls the back end to do most of its work. This is not
+    really part of the main front end code, though, and I'm not sure it
+    counts.
+
+In order to find the game back end structure, the front end does one of
+two things:
+
+ -  If the particular front end is compiling a separate binary per game,
+    then the back end structure is a global variable with the standard
+    name `thegame':
+
+      extern const game thegame;
+
+ -  If the front end is compiled as a monolithic application containing
+    all the puzzles together (in which case the preprocessor symbol
+    COMBINED must be defined when compiling most of the code base), then
+    there will be two global variables defined:
+
+      extern const game *gamelist[];
+      extern const int gamecount;
+
+    `gamelist' will be an array of `gamecount' game structures, declared
+    in the automatically constructed source module `list.c'. The
+    application should search that array for the game it wants, probably
+    by reaching into each game structure and looking at its `name'
+    field.
+
+4.35. Mid-end to front-end calls
+--------------------------------
+
+This section describes the small number of functions which a front end
+must provide to be called by the mid-end or other standard utility
+modules.
+
+4.36. get_random_seed()
+-----------------------
+
+  void get_random_seed(void **randseed, int *randseedsize);
+
+This function is called by a new mid-end, and also occasionally by game
+back ends. Its job is to return a piece of data suitable for using as a
+seed for initialisation of a new `random_state'.
+
+On exit, `*randseed' should be set to point at a newly allocated piece
+of memory containing some seed data, and `*randseedsize' should be set
+to the length of that data.
+
+A simple and entirely adequate implementation is to return a piece of
+data containing the current system time at the highest conveniently
+available resolution.
+
+4.37. activate_timer()
+----------------------
+
+  void activate_timer(frontend *fe);
+
+This is called by the mid-end to request that the front end begin
+calling it back at regular intervals.
+
+The timeout interval is left up to the front end; the finer it is, the
+smoother move animations will be, but the more CPU time will be used.
+Current front ends use values around 20ms (i.e. 50Hz).
+
+After this function is called, the mid-end will expect to receive calls
+to midend_timer() on a regular basis.
+
+4.38. deactivate_timer()
+------------------------
+
+  void deactivate_timer(frontend *fe);
+
+This is called by the mid-end to request that the front end stop calling
+midend_timer().
+
+4.39. fatal()
+-------------
+
+  void fatal(char *fmt, ...);
+
+This is called by some utility functions if they encounter a genuinely
+fatal error such as running out of memory. It is a variadic function
+in the style of printf(), and is expected to show the formatted error
+message to the user any way it can and then terminate the application.
+It must not return.
+
+4.40. frontend_default_colour()
+-------------------------------
+
+  void frontend_default_colour(frontend *fe, float *output);
+
+This function expects to be passed a pointer to an array of three
+floats. It returns the platform's local preferred background colour
+in those three floats, as red, green and blue values (in that order)
+ranging from 0.0 to 1.0.
+
+This function should only ever be called by the back end function
+colours() (section 2.8.6). (Thus, it isn't a _midend_-to-frontend
+function as such, but there didn't seem to be anywhere else particularly
+good to put it. Sorry.)
+
+5. Utility APIs
+---------------
+
+This chapter documents a variety of utility APIs provided for the
+general use of the rest of the Puzzles code.
+
+5.1. Random number generation
+-----------------------------
+
+Platforms' local random number generators vary widely in quality and
+seed size. Puzzles therefore supplies its own high-quality random number
+generator, with the additional advantage of giving the same results if
+fed the same seed data on different platforms. This allows game random
+seeds to be exchanged between different ports of Puzzles and still
+generate the same games.
+
+Unlike the ANSI C rand() function, the Puzzles random number generator
+has an _explicit_ state object called a `random_state'. One of these
+is managed by each mid-end, for example, and passed to the back end to
+generate a game with.
+
+5.1.1. random_new()
+-------------------
+
+  random_state *random_new(char *seed, int len);
+
+Allocates, initialises and returns a new `random_state'. The input data
+is used as the seed for the random number stream (i.e. using the same
+seed at a later time will generate the same stream).
+
+The seed data can be any data at all; there is no requirement to use
+printable ASCII, or NUL-terminated strings, or anything like that.
+
+5.1.2. random_copy()
+--------------------
+
+  random_state *random_copy(random_state *tocopy);
+
+Allocates a new `random_state', copies the contents of another
+`random_state' into it, and returns the new state. If exactly the
+same sequence of functions is subseqently called on both the copy and
+the original, the results will be identical. This may be useful for
+speculatively performing some operation using a given random state, and
+later replaying that operation precisely.
+
+5.1.3. random_free()
+--------------------
+
+  void random_free(random_state *state);
+
+Frees a `random_state'.
+
+5.1.4. random_bits()
+--------------------
+
+  unsigned long random_bits(random_state *state, int bits);
+
+Returns a random number from 0 to 2^bits-1 inclusive. `bits' should be
+between 1 and 32 inclusive.
+
+5.1.5. random_upto()
+--------------------
+
+  unsigned long random_upto(random_state *state, unsigned long limit);
+
+Returns a random number from 0 to limit-1 inclusive.
+
+5.1.6. random_state_encode()
+----------------------------
+
+  char *random_state_encode(random_state *state);
+
+Encodes the entire contents of a `random_state' in printable ASCII.
+Returns a dynamically allocated string containing that encoding. This
+can subsequently be passed to random_state_decode() to reconstruct the
+same `random_state'.
+
+5.1.7. random_state_decode()
+----------------------------
+
+  random_state *random_state_decode(char *input);
+
+Decodes a string generated by random_state_encode() and reconstructs an
+equivalent `random_state' to the one encoded, i.e. it should produce the
+same stream of random numbers.
+
+This function has no error reporting; if you pass it an invalid string
+it will simply generate an arbitrary random state, which may turn out to
+be noticeably non-random.
+
+5.1.8. shuffle()
+----------------
+
+  void shuffle(void *array, int nelts, int eltsize, random_state *rs);
+
+Shuffles an array into a random order. The interface is much like ANSI C
+qsort(), except that there's no need for a compare function.
+
+`array' is a pointer to the first element of the array. `nelts' is the
+number of elements in the array; `eltsize' is the size of a single
+element (typically measured using `sizeof'). `rs' is a `random_state'
+used to generate all the random numbers for the shuffling process.
+
+5.2. Memory allocation
+----------------------
+
+Puzzles has some central wrappers on the standard memory allocation
+functions, which provide compile-time type checking, and run-time error
+checking by means of quitting the application if it runs out of memory.
+This doesn't provide the best possible recovery from memory shortage,
+but on the other hand it greatly simplifies the rest of the code,
+because nothing else anywhere needs to worry about NULL returns from
+allocation.
+
+5.2.1. snew()
+-------------
+
+  var = snew(type);
+
+This macro takes a single argument which is a _type name_. It allocates
+space for one object of that type. If allocation fails it will call
+fatal() and not return; so if it does return, you can be confident that
+its return value is non-NULL.
+
+The return value is cast to the specified type, so that the compiler
+will type-check it against the variable you assign it into. Thus, this
+ensures you don't accidentally allocate memory the size of the wrong
+type and assign it into a variable of the right one (or vice versa!).
+
+5.2.2. snewn()
+--------------
+
+  var = snewn(n, type);
+
+This macro is the array form of snew(). It takes two arguments; the
+first is a number, and the second is a type name. It allocates space
+for that many objects of that type, and returns a type-checked non-NULL
+pointer just as snew() does.
+
+5.2.3. sresize()
+----------------
+
+  var = sresize(var, n, type);
+
+This macro is a type-checked form of realloc(). It takes three
+arguments: an input memory block, a new size in elements, and a type.
+It re-sizes the input memory block to a size sufficient to contain that
+many elements of that type. It returns a type-checked non-NULL pointer,
+like snew() and snewn().
+
+The input memory block can be NULL, in which case this function will
+behave exactly like snewn(). (In principle any ANSI-compliant realloc()
+implementation ought to cope with this, but I've never quite trusted it
+to work everywhere.)
+
+5.2.4. sfree()
+--------------
+
+  void sfree(void *p);
+
+This function is pretty much equivalent to free(). It is provided with a
+dynamically allocated block, and frees it.
+
+The input memory block can be NULL, in which case this function will do
+nothing. (In principle any ANSI-compliant free() implementation ought to
+cope with this, but I've never quite trusted it to work everywhere.)
+
+5.2.5. dupstr()
+---------------
+
+  char *dupstr(const char *s);
+
+This function dynamically allocates a duplicate of a C string. Like the
+snew() functions, it guarantees to return non-NULL or not return at all.
+
+(Many platforms provide the function strdup(). As well as guaranteeing
+never to return NULL, my version has the advantage of being defined
+_everywhere_, rather than inconveniently not quite everywhere.)
+
+5.2.6. free_cfg()
+-----------------
+
+  void free_cfg(config_item *cfg);
+
+This function correctly frees an array of `config_item's, including
+walking the array until it gets to the end and freeing precisely those
+`sval' fields which are expected to be dynamically allocated.
+
+(See section 2.3.8 for details of the `config_item' structure.)
+
+5.3. Sorted and counted tree functions
+--------------------------------------
+
+Many games require complex algorithms for generating random puzzles, and
+some require moderately complex algorithms even during play. A common
+requirement during these algorithms is for a means of maintaining sorted
+or unsorted lists of items, such that items can be removed and added
+conveniently.
+
+For general use, Puzzles provides the following set of functions which
+maintain 2-3-4 trees in memory. (A 2-3-4 tree is a balanced tree
+structure, with the property that all lookups, insertions, deletions,
+splits and joins can be done in O(log N) time.)
+
+All these functions expect you to be storing a tree of `void *'
+pointers. You can put anything you like in those pointers.
+
+By the use of per-node element counts, these tree structures have the
+slightly unusual ability to look elements up by their numeric index
+within the list represented by the tree. This means that they can be
+used to store an unsorted list (in which case, every time you insert a
+new element, you must explicitly specify the position where you wish to
+insert it). They can also do numeric lookups in a sorted tree, which
+might be useful for (for example) tracking the median of a changing data
+set.
+
+As well as storing sorted lists, these functions can be used for storing
+`maps' (associative arrays), by defining each element of a tree to be a
+(key, value) pair.
+
+5.3.1. newtree234()
+-------------------
+
+  tree234 *newtree234(cmpfn234 cmp);
+
+Creates a new empty tree, and returns a pointer to it.
+
+The parameter `cmp' determines the sorting criterion on the tree. Its
+prototype is
+
+  typedef int (*cmpfn234)(void *, void *);
+
+If you want a sorted tree, you should provide a function matching this
+prototype, which returns like strcmp() does (negative if the first
+argument is smaller than the second, positive if it is bigger, zero if
+they compare equal). In this case, the function addpos234() will not be
+usable on your tree (because all insertions must respect the sorting
+order).
+
+If you want an unsorted tree, pass NULL. In this case you will not be
+able to use either add234() or del234(), or any other function such
+as find234() which depends on a sorting order. Your tree will become
+something more like an array, except that it will efficiently support
+insertion and deletion as well as lookups by numeric index.
+
+5.3.2. freetree234()
+--------------------
+
+  void freetree234(tree234 *t);
+
+Frees a tree. This function will not free the _elements_ of the tree
+(because they might not be dynamically allocated, or you might be
+storing the same set of elements in more than one tree); it will just
+free the tree structure itself. If you want to free all the elements of
+a tree, you should empty it before passing it to freetree234(), by means
+of code along the lines of
+
+  while ((element = delpos234(tree, 0)) != NULL)
+      sfree(element); /* or some more complicated free function */
+
+5.3.3. add234()
+---------------
+
+  void *add234(tree234 *t, void *e);
+
+Inserts a new element `e' into the tree `t'. This function expects the
+tree to be sorted; the new element is inserted according to the sort
+order.
+
+If an element comparing equal to `e' is already in the tree, then the
+insertion will fail, and the return value will be the existing element.
+Otherwise, the insertion succeeds, and `e' is returned.
+
+5.3.4. addpos234()
+------------------
+
+  void *addpos234(tree234 *t, void *e, int index);
+
+Inserts a new element into an unsorted tree. Since there is no sorting
+order to dictate where the new element goes, you must specify where you
+want it to go. Setting `index' to zero puts the new element right at the
+start of the list; setting `index' to the current number of elements in
+the tree puts the new element at the end.
+
+Return value is `e', in line with add234() (although this function
+cannot fail except by running out of memory, in which case it will bomb
+out and die rather than returning an error indication).
+
+5.3.5. index234()
+-----------------
+
+  void *index234(tree234 *t, int index);
+
+Returns a pointer to the `index'th element of the tree, or NULL if
+`index' is out of range. Elements of the tree are numbered from zero.
+
+5.3.6. find234()
+----------------
+
+  void *find234(tree234 *t, void *e, cmpfn234 cmp);
+
+Searches for an element comparing equal to `e' in a sorted tree.
+
+If `cmp' is NULL, the tree's ordinary comparison function will be used
+to perform the search. However, sometimes you don't want that; suppose,
+for example, each of your elements is a big structure containing a
+`char *' name field, and you want to find the element with a given name.
+You _could_ achieve this by constructing a fake element structure,
+setting its name field appropriately, and passing it to find234(),
+but you might find it more convenient to pass _just_ a name string to
+find234(), supplying an alternative comparison function which expects
+one of its arguments to be a bare name and the other to be a large
+structure containing a name field.
+
+Therefore, if `cmp' is not NULL, then it will be used to compare `e' to
+elements of the tree. The first argument passed to `cmp' will always be
+`e'; the second will be an element of the tree.
+
+(See section 5.3.1 for the definition of the `cmpfn234' function pointer
+type.)
+
+The returned value is the element found, or NULL if the search is
+unsuccessful.
+
+5.3.7. findrel234()
+-------------------
+
+  void *findrel234(tree234 *t, void *e, cmpfn234 cmp, int relation);
+
+This function is like find234(), but has the additional ability to do a
+_relative_ search. The additional parameter `relation' can be one of the
+following values:
+
+REL234_EQ
+
+    Find only an element that compares equal to `e'. This is exactly the
+    behaviour of find234().
+
+REL234_LT
+
+    Find the greatest element that compares strictly less than `e'. `e'
+    may be NULL, in which case it finds the greatest element in the
+    whole tree (which could also be done by index234(t, count234(t)-1)).
+
+REL234_LE
+
+    Find the greatest element that compares less than or equal to `e'.
+    (That is, find an element that compares equal to `e' if possible,
+    but failing that settle for something just less than it.)
+
+REL234_GT
+
+    Find the smallest element that compares strictly greater than `e'.
+    `e' may be NULL, in which case it finds the smallest element in the
+    whole tree (which could also be done by index234(t, 0)).
+
+REL234_GE
+
+    Find the smallest element that compares greater than or equal
+    to `e'. (That is, find an element that compares equal to `e' if
+    possible, but failing that settle for something just bigger than
+    it.)
+
+Return value, as before, is the element found or NULL if no element
+satisfied the search criterion.
+
+5.3.8. findpos234()
+-------------------
+
+  void *findpos234(tree234 *t, void *e, cmpfn234 cmp, int *index);
+
+This function is like find234(), but has the additional feature of
+returning the index of the element found in the tree; that index is
+written to `*index' in the event of a successful search (a non-NULL
+return value).
+
+`index' may be NULL, in which case this function behaves exactly like
+find234().
+
+5.3.9. findrelpos234()
+----------------------
+
+  void *findrelpos234(tree234 *t, void *e, cmpfn234 cmp, int relation,
+                      int *index);
+
+This function combines all the features of findrel234() and
+findpos234().
+
+5.3.10. del234()
+----------------
+
+  void *del234(tree234 *t, void *e);
+
+Finds an element comparing equal to `e' in the tree, deletes it, and
+returns it.
+
+The input tree must be sorted.
+
+The element found might be `e' itself, or might merely compare equal to
+it.
+
+Return value is NULL if no such element is found.
+
+5.3.11. delpos234()
+-------------------
+
+  void *delpos234(tree234 *t, int index);
+
+Deletes the element at position `index' in the tree, and returns it.
+
+Return value is NULL if the index is out of range.
+
+5.3.12. count234()
+------------------
+
+  int count234(tree234 *t);
+
+Returns the number of elements currently in the tree.
+
+5.3.13. splitpos234()
+---------------------
+
+  tree234 *splitpos234(tree234 *t, int index, int before);
+
+Splits the input tree into two pieces at a given position, and creates a
+new tree containing all the elements on one side of that position.
+
+If `before' is TRUE, then all the items at or after position `index' are
+left in the input tree, and the items before that point are returned in
+the new tree. Otherwise, the reverse happens: all the items at or after
+`index' are moved into the new tree, and those before that point are
+left in the old one.
+
+If `index' is equal to 0 or to the number of elements in the input tree,
+then one of the two trees will end up empty (and this is not an error
+condition). If `index' is further out of range in either direction, the
+operation will fail completely and return NULL.
+
+This operation completes in O(log N) time, no matter how large the tree
+or how balanced or unbalanced the split.
+
+5.3.14. split234()
+------------------
+
+  tree234 *split234(tree234 *t, void *e, cmpfn234 cmp, int rel);
+
+Splits a sorted tree according to its sort order.
+
+`rel' can be any of the relation constants described in section 5.3.7,
+_except_ for REL234_EQ. All the elements having that relation to `e'
+will be transferred into the new tree; the rest will be left in the old
+one.
+
+The parameter `cmp' has the same semantics as it does in find234(): if
+it is not NULL, it will be used in place of the tree's own comparison
+function when comparing elements to `e', in such a way that `e' itself
+is always the first of its two operands.
+
+Again, this operation completes in O(log N) time, no matter how large
+the tree or how balanced or unbalanced the split.
+
+5.3.15. join234()
+-----------------
+
+  tree234 *join234(tree234 *t1, tree234 *t2);
+
+Joins two trees together by concatenating the lists they represent. All
+the elements of `t2' are moved into `t1', in such a way that they appear
+_after_ the elements of `t1'. The tree `t2' is freed; the return value
+is `t1'.
+
+If you apply this function to a sorted tree and it violates the sort
+order (i.e. the smallest element in `t2' is smaller than or equal to the
+largest element in `t1'), the operation will fail and return NULL.
+
+This operation completes in O(log N) time, no matter how large the trees
+being joined together.
+
+5.3.16. join234r()
+------------------
+
+  tree234 *join234r(tree234 *t1, tree234 *t2);
+
+Joins two trees together in exactly the same way as join234(), but this
+time the combined tree is returned in `t2', and `t1' is destroyed. The
+elements in `t1' still appear before those in `t2'.
+
+Again, this operation completes in O(log N) time, no matter how large
+the trees being joined together.
+
+5.3.17. copytree234()
+---------------------
+
+  tree234 *copytree234(tree234 *t, copyfn234 copyfn,
+                       void *copyfnstate);
+
+Makes a copy of an entire tree.
+
+If `copyfn' is NULL, the tree will be copied but the elements will not
+be; i.e. the new tree will contain pointers to exactly the same physical
+elements as the old one.
+
+If you want to copy each actual element during the operation, you can
+instead pass a function in `copyfn' which makes a copy of each element.
+That function has the prototype
+
+  typedef void *(*copyfn234)(void *state, void *element);
+
+and every time it is called, the `state' parameter will be set to the
+value you passed in as `copyfnstate'.
+
+5.4. Miscellaneous utility functions and macros
+-----------------------------------------------
+
+This section contains all the utility functions which didn't sensibly
+fit anywhere else.
+
+5.4.1. TRUE and FALSE
+---------------------
+
+The main Puzzles header file defines the macros TRUE and FALSE, which
+are used throughout the code in place of 1 and 0 (respectively) to
+indicate that the values are in a boolean context. For code base
+consistency, I'd prefer it if submissions of new code followed this
+convention as well.
+
+5.4.2. max() and min()
+----------------------
+
+The main Puzzles header file defines the pretty standard macros max()
+and min(), each of which is given two arguments and returns the one
+which compares greater or less respectively.
+
+These macros may evaluate their arguments multiple times. Avoid side
+effects.
+
+5.4.3. PI
+---------
+
+The main Puzzles header file defines a macro PI which expands to a
+floating-point constant representing pi.
+
+(I've never understood why ANSI's <math.h> doesn't define this. It'd be
+so useful!)
+
+5.4.4. obfuscate_bitmap()
+-------------------------
+
+  void obfuscate_bitmap(unsigned char *bmp, int bits, int decode);
+
+This function obscures the contents of a piece of data, by cryptographic
+methods. It is useful for games of hidden information (such as Mines,
+Guess or Black Box), in which the game ID theoretically reveals all the
+information the player is supposed to be trying to guess. So in order
+that players should be able to send game IDs to one another without
+accidentally spoiling the resulting game by looking at them, these games
+obfuscate their game IDs using this function.
+
+Although the obfuscation function is cryptographic, it cannot properly
+be called encryption because it has no key. Therefore, anybody motivated
+enough can re-implement it, or hack it out of the Puzzles source,
+and strip the obfuscation off one of these game IDs to see what lies
+beneath. (Indeed, they could usually do it much more easily than that,
+by entering the game ID into their own copy of the puzzle and hitting
+Solve.) The aim is not to protect against a determined attacker; the aim
+is simply to protect people who wanted to play the game honestly from
+_accidentally_ spoiling their own fun.
+
+The input argument `bmp' points at a piece of memory to be obfuscated.
+`bits' gives the length of the data. Note that that length is in _bits_
+rather than bytes: if you ask for obfuscation of a partial number of
+bytes, then you will get it. Bytes are considered to be used from the
+top down: thus, for example, setting `bits' to 10 will cover the whole
+of bmp[0] and the _top two_ bits of bmp[1]. The remainder of a partially
+used byte is undefined (i.e. it may be corrupted by the function).
+
+The parameter `decode' is FALSE for an encoding operation, and TRUE
+for a decoding operation. Each is the inverse of the other. (There's
+no particular reason you shouldn't obfuscate by decoding and restore
+cleartext by encoding, if you really wanted to; it should still work.)
+
+The input bitmap is processed in place.
+
+5.4.5. bin2hex()
+----------------
+
+  char *bin2hex(const unsigned char *in, int inlen);
+
+This function takes an input byte array and converts it into an
+ASCII string encoding those bytes in (lower-case) hex. It returns a
+dynamically allocated string containing that encoding.
+
+This function is useful for encoding the result of obfuscate_bitmap() in
+printable ASCII for use in game IDs.
+
+5.4.6. hex2bin()
+----------------
+
+  unsigned char *hex2bin(const char *in, int outlen);
+
+This function takes an ASCII string containing hex digits, and converts
+it back into a byte array of length `outlen'. If there aren't enough
+hex digits in the string, the contents of the resulting array will be
+undefined.
+
+This function is the inverse of bin2hex().
+
+5.4.7. game_mkhighlight()
+-------------------------
+
+  void game_mkhighlight(frontend *fe, float *ret,
+                        int background, int highlight, int lowlight);
+
+It's reasonably common for a puzzle game's graphics to use highlights
+and lowlights to indicate `raised' or `lowered' sections. Fifteen,
+Sixteen and Twiddle are good examples of this.
+
+Puzzles using this graphical style are running a risk if they just use
+whatever background colour is supplied to them by the front end, because
+that background colour might be too light to see any highlights on at
+all. (In particular, it's not unheard of for the front end to specify a
+default background colour of white.)
+
+Therefore, such puzzles can call this utility function from their
+colours() routine (section 2.8.6). You pass it your front end handle, a
+pointer to the start of your return array, and three colour indices. It
+will:
+
+ -  call frontend_default_colour() (section 4.40) to fetch the front
+    end's default background colour
+
+ -  alter the brightness of that colour if it's unsuitable
+
+ -  define brighter and darker variants of the colour to be used as
+    highlights and lowlights
+
+ -  write those results into the relevant positions in the `ret' array.
+
+Thus, ret[background*3] to ret[background*3+2] will be set to RGB values
+defining a sensible background colour, and similary `highlight' and
+`lowlight' will be set to sensible colours.
+
+6. How to write a new puzzle
+----------------------------
+
+This chapter gives a guide to how to actually write a new puzzle: where
+to start, what to do first, how to solve common problems.
+
+The previous chapters have been largely composed of facts. This one is
+mostly advice.
+
+6.1. Choosing a puzzle
+----------------------
+
+Before you start writing a puzzle, you have to choose one. Your taste
+in puzzle games is up to you, of course; and, in fact, you're probably
+reading this guide because you've _already_ thought of a game you want
+to write. But if you want to get it accepted into the official Puzzles
+distribution, then there's a criterion it has to meet.
+
+The current Puzzles editorial policy is that all games should be _fair_.
+A fair game is one which a player can only fail to complete through
+demonstrable lack of skill - that is, such that a better player in the
+same situation would have _known_ to do something different.
+
+For a start, that means every game presented to the user must have _at
+least one solution_. Giving the unsuspecting user a puzzle which is
+actually impossible is not acceptable. (There is an exception: if the
+user has selected some non-default option which is clearly labelled as
+potentially unfair, _then_ you're allowed to generate possibly insoluble
+puzzles, because the user isn't unsuspecting any more. Same Game and
+Mines both have options of this type.)
+
+Also, this actually _rules out_ games such as Klondike, or the normal
+form of Mahjong Solitaire. Those games have the property that even if
+there is a solution (i.e. some sequence of moves which will get from
+the start state to the solved state), the player doesn't necessarily
+have enough information to _find_ that solution. In both games, it is
+possible to reach a dead end because you had an arbitrary choice to make
+and made it the wrong way. This violates the fairness criterion, because
+a better player couldn't have known they needed to make the other
+choice.
+
+(GNOME has a variant on Mahjong Solitaire which makes it fair: there
+is a Shuffle operation which randomly permutes all the remaining tiles
+without changing their positions, which allows you to get out of a
+sticky situation. Using this operation adds a 60-second penalty to your
+solution time, so it's to the player's advantage to try to minimise
+the chance of having to use it. It's still possible to render the game
+uncompletable if you end up with only two tiles vertically stacked,
+but that's easy to foresee and avoid using a shuffle operation. This
+form of the game _is_ fair. Implementing it in Puzzles would require
+an infrastructure change so that the back end could communicate time
+penalties to the mid-end, but that would be easy enough.)
+
+Providing a _unique_ solution is a little more negotiable; it depends
+on the puzzle. Solo would have been of unacceptably low quality if it
+didn't always have a unique solution, whereas Twiddle inherently has
+multiple solutions by its very nature and it would have been meaningless
+to even _suggest_ making it uniquely soluble. Somewhere in between, Flip
+could reasonably be made to have unique solutions (by enforcing a zero-
+dimension kernel in every generated matrix) but it doesn't seem like a
+serious quality problem that it doesn't.
+
+Of course, you don't _have_ to care about all this. There's nothing
+stopping you implementing any puzzle you want to if you're happy to
+maintain your puzzle yourself, distribute it from your own web site,
+fork the Puzzles code completely, or anything like that. It's free
+software; you can do what you like with it. But any game that you want
+to be accepted into _my_ Puzzles code base has to satisfy the fairness
+criterion, which means all randomly generated puzzles must have a
+solution (unless the user has deliberately chosen otherwise) and it must
+be possible _in theory_ to find that solution without having to guess.
+
+6.2. Getting started
+--------------------
+
+The simplest way to start writing a new puzzle is to copy `nullgame.c'.
+This is a template puzzle source file which does almost nothing, but
+which contains all the back end function prototypes and declares the
+back end data structure correctly. It is built every time the rest of
+Puzzles is built, to ensure that it doesn't get out of sync with the
+code and remains buildable.
+
+So start by copying `nullgame.c' into your new source file. Then you'll
+gradually add functionality until the very boring Null Game turns into
+your real game.
+
+Next you'll need to add your puzzle to the Makefiles, in order to
+compile it conveniently. _Do not edit the Makefiles_: they are created
+automatically by the script `mkfiles.pl', from the file called `Recipe'.
+Edit `Recipe', and then re-run `mkfiles.pl'.
+
+Also, don't forget to add your puzzle to `list.c': if you don't, then it
+will still run fine on platforms which build each puzzle separately, but
+Mac OS X and other monolithic platforms will not include your new puzzle
+in their single binary.
+
+Once your source file is building, you can move on to the fun bit.
+
+6.2.1. Puzzle generation
+------------------------
+
+Randomly generating instances of your puzzle is almost certain to be
+the most difficult part of the code, and also the task with the highest
+chance of turning out to be completely infeasible. Therefore I strongly
+recommend doing it _first_, so that if it all goes horribly wrong you
+haven't wasted any more time than you absolutely had to. What I usually
+do is to take an unmodified `nullgame.c', and start adding code to
+new_game_desc() which tries to generate a puzzle instance and print it
+out using printf(). Once that's working, _then_ I start connecting it up
+to the return value of new_game_desc(), populating other structures like
+`game_params', and generally writing the rest of the source file.
+
+There are many ways to generate a puzzle which is known to be soluble.
+In this section I list all the methods I currently know of, in case any
+of them can be applied to your puzzle. (Not all of these methods will
+work, or in some cases even make sense, for all puzzles.)
+
+Some puzzles are mathematically tractable, meaning you can work out in
+advance which instances are soluble. Sixteen, for example, has a parity
+constraint in some settings which renders exactly half the game space
+unreachable, but it can be mathematically proved that any position
+not in that half _is_ reachable. Therefore, Sixteen's grid generation
+simply consists of selecting at random from a well defined subset of the
+game space. Cube in its default state is even easier: _every_ possible
+arrangement of the blue squares and the cube's starting position is
+soluble!
+
+Another option is to redefine what you mean by `soluble'. Black Box
+takes this approach. There are layouts of balls in the box which are
+completely indistinguishable from one another no matter how many beams
+you fire into the box from which angles, which would normally be grounds
+for declaring those layouts unfair; but fortunately, detecting that
+indistinguishability is computationally easy. So Black Box doesn't
+demand that your ball placements match its own; it merely demands
+that your ball placements be _indistinguishable_ from the ones it was
+thinking of. If you have an ambiguous puzzle, then any of the possible
+answers is considered to be a solution. Having redefined the rules in
+that way, any puzzle is soluble again.
+
+Those are the simple techniques. If they don't work, you have to get
+cleverer.
+
+One way to generate a soluble puzzle is to start from the solved state
+and make inverse moves until you reach a starting state. Then you know
+there's a solution, because you can just list the inverse moves you made
+and make them in the opposite order to return to the solved state.
+
+This method can be simple and effective for puzzles where you get to
+decide what's a starting state and what's not. In Pegs, for example,
+the generator begins with one peg in the centre of the board and makes
+inverse moves until it gets bored; in this puzzle, valid inverse moves
+are easy to detect, and _any_ state that's reachable from the solved
+state by inverse moves is a reasonable starting position. So Pegs just
+continues making inverse moves until the board satisfies some criteria
+about extent and density, and then stops and declares itself done.
+
+For other puzzles, it can be a lot more difficult. Same Game uses
+this strategy too, and it's lucky to get away with it at all: valid
+inverse moves aren't easy to find (because although it's easy to insert
+additional squares in a Same Game position, it's difficult to arrange
+that _after_ the insertion they aren't adjacent to any other squares of
+the same colour), so you're constantly at risk of running out of options
+and having to backtrack or start again. Also, Same Game grids never
+start off half-empty, which means you can't just stop when you run out
+of moves - you have to find a way to fill the grid up _completely_.
+
+The other way to generate a puzzle that's soluble is to start from the
+other end, and actually write a _solver_. This tends to ensure that a
+puzzle has a _unique_ solution over and above having a solution at all,
+so it's a good technique to apply to puzzles for which that's important.
+
+One theoretical drawback of generating soluble puzzles by using a solver
+is that your puzzles are restricted in difficulty to those which the
+solver can handle. (Most solvers are not fully general: many sets of
+puzzle rules are NP-complete or otherwise nasty, so most solvers can
+only handle a subset of the theoretically soluble puzzles.) It's been
+my experience in practice, however, that this usually isn't a problem;
+computers are good at very different things from humans, and what the
+computer thinks is nice and easy might still be pleasantly challenging
+for a human. For example, when solving Dominosa puzzles I frequently
+find myself using a variety of reasoning techniques that my solver
+doesn't know about; in principle, therefore, I should be able to solve
+the puzzle using only those techniques it _does_ know about, but this
+would involve repeatedly searching the entire grid for the one simple
+deduction I can make. Computers are good at this sort of exhaustive
+search, but it's been my experience that human solvers prefer to do more
+complex deductions than to spend ages searching for simple ones. So in
+many cases I don't find my own playing experience to be limited by the
+restrictions on the solver.
+
+(This isn't _always_ the case. Solo is a counter-example; generating
+Solo puzzles using a simple solver does lead to qualitatively easier
+puzzles. Therefore I had to make the Solo solver rather more advanced
+than most of them.)
+
+There are several different ways to apply a solver to the problem of
+generating a soluble puzzle. I list a few of them below.
+
+The simplest approach is brute force: randomly generate a puzzle, use
+the solver to see if it's soluble, and if not, throw it away and try
+again until you get lucky. This is often a viable technique if all
+else fails, but it tends not to scale well: for many puzzle types, the
+probability of finding a uniquely soluble instance decreases sharply
+as puzzle size goes up, so this technique might work reasonably fast
+for small puzzles but take (almost) forever at larger sizes. Still, if
+there's no other alternative it can be usable: Pattern and Dominosa
+both use this technique. (However, Dominosa has a means of tweaking the
+randomly generated grids to increase the _probability_ of them being
+soluble, by ruling out one of the most common ambiguous cases. This
+improved generation speed by over a factor of 10 on the highest preset!)
+
+An approach which can be more scalable involves generating a grid and
+then tweaking it to make it soluble. This is the technique used by Mines
+and also by Net: first a random puzzle is generated, and then the solver
+is run to see how far it gets. Sometimes the solver will get stuck;
+when that happens, examine the area it's having trouble with, and make
+a small random change in that area to allow it to make more progress.
+Continue solving (possibly even without restarting the solver), tweaking
+as necessary, until the solver finishes. Then restart the solver from
+the beginning to ensure that the tweaks haven't caused new problems in
+the process of solving old ones (which can sometimes happen).
+
+This strategy works well in situations where the usual solver failure
+mode is to get stuck in an easily localised spot. Thus it works well
+for Net and Mines, whose most common failure mode tends to be that most
+of the grid is fine but there are a few widely separated ambiguous
+sections; but it would work less well for Dominosa, in which the way you
+get stuck is to have scoured the whole grid and not found anything you
+can deduce _anywhere_. Also, it relies on there being a low probability
+that tweaking the grid introduces a new problem at the same time as
+solving the old one; Mines and Net also have the property that most of
+their deductions are local, so that it's very unlikely for a tweak to
+affect something half way across the grid from the location where it was
+applied. In Dominosa, by contrast, a lot of deductions use information
+about half the grid (`out of all the sixes, only one is next to a
+three', which can depend on the values of up to 32 of the 56 squares in
+the default setting!), so this tweaking strategy would be rather less
+likely to work well.
+
+A more specialised strategy is that used in Solo and Slant. These
+puzzles have the property that they derive their difficulty from not
+presenting all the available clues. (In Solo's case, if all the possible
+clues were provided then the puzzle would already be solved; in Slant
+it would still require user action to fill in the lines, but it would
+present no challenge at all). Therefore, a simple generation technique
+is to leave the decision of which clues to provide until the last
+minute. In other words, first generate a random _filled_ grid with all
+possible clues present, and then gradually remove clues for as long as
+the solver reports that it's still soluble. Unlike the methods described
+above, this technique _cannot_ fail - once you've got a filled grid,
+nothing can stop you from being able to convert it into a viable puzzle.
+However, it wouldn't even be meaningful to apply this technique to (say)
+Pattern, in which clues can never be left out, so the only way to affect
+the set of clues is by altering the solution.
+
+(Unfortunately, Solo is complicated by the need to provide puzzles at
+varying difficulty levels. It's easy enough to generate a puzzle of
+_at most_ a given level of difficulty; you just have a solver with
+configurable intelligence, and you set it to a given level and apply the
+above technique, thus guaranteeing that the resulting grid is solvable
+by someone with at most that much intelligence. However, generating a
+puzzle of _at least_ a given level of difficulty is rather harder; if
+you go for _at most_ Intermediate level, you're likely to find that
+you've accidentally generated a Trivial grid a lot of the time, because
+removing just one number is sufficient to take the puzzle from Trivial
+straight to Ambiguous. In that situation Solo has no remaining options
+but to throw the puzzle away and start again.)
+
+A final strategy is to use the solver _during_ puzzle construction:
+lay out a bit of the grid, run the solver to see what it allows you to
+deduce, and then lay out a bit more to allow the solver to make more
+progress. There are articles on the web that recommend constructing
+Sudoku puzzles by this method (which is completely the opposite way
+round to how Solo does it); for Sudoku it has the advantage that you
+get to specify your clue squares in advance (so you can have them make
+pretty patterns).
+
+Rectangles uses a strategy along these lines. First it generates a grid
+by placing the actual rectangles; then it has to decide where in each
+rectangle to place a number. It uses a solver to help it place the
+numbers in such a way as to ensure a unique solution. It does this by
+means of running a test solver, but it runs the solver _before_ it's
+placed any of the numbers - which means the solver must be capable of
+coping with uncertainty about exactly where the numbers are! It runs
+the solver as far as it can until it gets stuck; then it narrows down
+the possible positions of a number in order to allow the solver to make
+more progress, and so on. Most of the time this process terminates with
+the grid fully solved, at which point any remaining number-placement
+decisions can be made at random from the options not so far ruled out.
+Note that unlike the Net/Mines tweaking strategy described above, this
+algorithm does not require a checking run after it completes: if it
+finishes successfully at all, then it has definitely produced a uniquely
+soluble puzzle.
+
+Most of the strategies described above are not 100% reliable. Each
+one has a failure rate: every so often it has to throw out the whole
+grid and generate a fresh one from scratch. (Solo's strategy would
+be the exception, if it weren't for the need to provide configurable
+difficulty levels.) Occasional failures are not a fundamental problem in
+this sort of work, however: it's just a question of dividing the grid
+generation time by the success rate (if it takes 10ms to generate a
+candidate grid and 1/5 of them work, then it will take 50ms on average
+to generate a viable one), and seeing whether the expected time taken
+to _successfully_ generate a puzzle is unacceptably slow. Dominosa's
+generator has a very low success rate (about 1 out of 20 candidate grids
+turn out to be usable, and if you think _that's_ bad then go and look
+at the source code and find the comment showing what the figures were
+before the generation-time tweaks!), but the generator itself is very
+fast so this doesn't matter. Rectangles has a slower generator, but
+fails well under 50% of the time.
+
+So don't be discouraged if you have an algorithm that doesn't always
+work: if it _nearly_ always works, that's probably good enough. The one
+place where reliability is important is that your algorithm must never
+produce false positives: it must not claim a puzzle is soluble when it
+isn't. It can produce false negatives (failing to notice that a puzzle
+is soluble), and it can fail to generate a puzzle at all, provided it
+doesn't do either so often as to become slow.
+
+One last piece of advice: for grid-based puzzles, when writing and
+testing your generation algorithm, it's almost always a good idea _not_
+to test it initially on a grid that's square (i.e. w==h), because if the
+grid is square then you won't notice if you mistakenly write `h' instead
+of `w' (or vice versa) somewhere in the code. Use a rectangular grid for
+testing, and any size of grid will be likely to work after that.
+
+6.2.2. Designing textual description formats
+--------------------------------------------
+
+Another aspect of writing a puzzle which is worth putting some thought
+into is the design of the various text description formats: the format
+of the game parameter encoding, the game description encoding, and the
+move encoding.
+
+The first two of these should be reasonably intuitive for a user to type
+in; so provide some flexibility where possible. Suppose, for example,
+your parameter format consists of two numbers separated by an `x' to
+specify the grid dimensions (`10x10' or `20x15'), and then has some
+suffixes to specify other aspects of the game type. It's almost always a
+good idea in this situation to arrange that decode_params() can handle
+the suffixes appearing in any order, even if encode_params() only ever
+generates them in one order.
+
+These formats will also be expected to be reasonably stable: users will
+expect to be able to exchange game IDs with other users who aren't
+running exactly the same version of your game. So make them robust and
+stable: don't build too many assumptions into the game ID format which
+will have to be changed every time something subtle changes in the
+puzzle code.
+
+6.3. Common how-to questions
+----------------------------
+
+This section lists some common things people want to do when writing a
+puzzle, and describes how to achieve them within the Puzzles framework.
+
+6.3.1. Drawing objects at only one position
+-------------------------------------------
+
+A common phenomenon is to have an object described in the `game_state'
+or the `game_ui' which can only be at one position. A cursor - probably
+specified in the `game_ui' - is a good example.
+
+In the `game_ui', it would _obviously_ be silly to have an array
+covering the whole game grid with a boolean flag stating whether the
+cursor was at each position. Doing that would waste space, would make
+it difficult to find the cursor in order to do anything with it, and
+would introduce the potential for synchronisation bugs in which you
+ended up with two cursors or none. The obviously sensible way to store a
+cursor in the `game_ui' is to have fields directly encoding the cursor's
+coordinates.
+
+However, it is a mistake to assume that the same logic applies to the
+`game_drawstate'. If you replicate the cursor position fields in the
+draw state, the redraw code will get very complicated. In the draw
+state, in fact, it _is_ probably the right thing to have a cursor flag
+for every position in the grid. You probably have an array for the whole
+grid in the drawstate already (stating what is currently displayed in
+the window at each position); the sensible approach is to add a `cursor'
+flag to each element of that array. Then the main redraw loop will look
+something like this (pseudo-code):
+
+  for (y = 0; y < h; y++) {
+      for (x = 0; x < w; x++) {
+          int value = state->symbol_at_position[y][x];
+          if (x == ui->cursor_x && y == ui->cursor_y)
+              value |= CURSOR;
+          if (ds->symbol_at_position[y][x] != value) {
+              symbol_drawing_subroutine(dr, ds, x, y, value);
+              ds->symbol_at_position[y][x] = value;
+          }
+      }
+  }
+
+This loop is very simple, pretty hard to get wrong, and _automatically_
+deals both with erasing the previous cursor and drawing the new one,
+with no special case code required.
+
+This type of loop is generally a sensible way to write a redraw
+function, in fact. The best thing is to ensure that the information
+stored in the draw state for each position tells you _everything_ about
+what was drawn there. A good way to ensure that is to pass precisely
+the same information, and _only_ that information, to a subroutine that
+does the actual drawing; then you know there's no additional information
+which affects the drawing but which you don't notice changes in.
+
+6.3.2. Implementing a keyboard-controlled cursor
+------------------------------------------------
+
+It is often useful to provide a keyboard control method in a basically
+mouse-controlled game. A keyboard-controlled cursor is best implemented
+by storing its location in the `game_ui' (since if it were in the
+`game_state' then the user would have to separately undo every cursor
+move operation). So the procedure would be:
+
+ -  Put cursor position fields in the `game_ui'.
+
+ -  interpret_move() responds to arrow keys by modifying the cursor
+    position fields and returning "".
+
+ -  interpret_move() responds to some sort of fire button by actually
+    performing a move based on the current cursor location.
+
+ -  You might want an additional `game_ui' field stating whether the
+    cursor is currently visible, and having it disappear when a mouse
+    action occurs (so that it doesn't clutter the display when not
+    actually in use).
+
+ -  You might also want to automatically hide the cursor in
+    changed_state() when the current game state changes to one in
+    which there is no move to make (which is the case in some types of
+    completed game).
+
+ -  redraw() draws the cursor using the technique described in section
+    6.3.1.
+
+6.3.3. Implementing draggable sprites
+-------------------------------------
+
+Some games have a user interface which involves dragging some sort of
+game element around using the mouse. If you need to show a graphic
+moving smoothly over the top of other graphics, use a blitter (see
+section 3.1.13 for the blitter API) to save the background underneath
+it. The typical scenario goes:
+
+ -  Have a blitter field in the `game_drawstate'.
+
+ -  Set the blitter field to NULL in the game's new_drawstate()
+    function, since you don't yet know how big the piece of saved
+    background needs to be.
+
+ -  In the game's set_size() function, once you know the size of the
+    object you'll be dragging around the display and hence the required
+    size of the blitter, actually allocate the blitter.
+
+ -  In free_drawstate(), free the blitter if it's not NULL.
+
+ -  In interpret_move(), respond to mouse-down and mouse-drag events by
+    updating some fields in the game_ui which indicate that a drag is in
+    progress.
+
+ -  At the _very end_ of redraw(), after all other drawing has been
+    done, draw the moving object if there is one. First save the
+    background under the object in the blitter; then set a clip
+    rectangle covering precisely the area you just saved (just in case
+    anti-aliasing or some other error causes your drawing to go beyond
+    the area you saved). Then draw the object, and call unclip().
+    Finally, set a flag in the game_drawstate that indicates that the
+    blitter needs restoring.
+
+ -  At the very start of redraw(), before doing anything else at all,
+    check the flag in the game_drawstate, and if it says the blitter
+    needs restoring then restore it. (Then clear the flag, so that this
+    won't happen again in the next redraw if no moving object is drawn
+    this time.)
+
+This way, you will be able to write the rest of the redraw function
+completely ignoring the dragged object, as if it were floating above
+your bitmap and being completely separate.
+
+6.3.4. Sharing large invariant data between all game states
+-----------------------------------------------------------
+
+In some puzzles, there is a large amount of data which never changes
+between game states. The array of numbers in Dominosa is a good example.
+
+You _could_ dynamically allocate a copy of that array in every
+`game_state', and have dup_game() make a fresh copy of it for every new
+`game_state'; but it would waste memory and time. A more efficient way
+is to use a reference-counted structure.
+
+ -  Define a structure type containing the data in question, and also
+    containing an integer reference count.
+
+ -  Have a field in `game_state' which is a pointer to this structure.
+
+ -  In new_game(), when creating a fresh game state at the start of a
+    new game, create an instance of this structure, initialise it with
+    the invariant data, and set its reference count to 1.
+
+ -  In dup_game(), rather than making a copy of the structure for the
+    new game state, simply set the new game state to point at the same
+    copy of the structure, and increment its reference count.
+
+ -  In free_game(), decrement the reference count in the structure
+    pointed to by the game state; if the count reaches zero, free the
+    structure.
+
+This way, the invariant data will persist for only as long as it's
+genuinely needed; _as soon_ as the last game state for a particular
+puzzle instance is freed, the invariant data for that puzzle will
+vanish as well. Reference counting is a very efficient form of garbage
+collection, when it works at all. (Which it does in this instance, of
+course, because there's no possibility of circular references.)
+
+6.3.5. Implementing multiple types of flash
+-------------------------------------------
+
+In some games you need to flash in more than one different way. Mines,
+for example, flashes white when you win, and flashes red when you tread
+on a mine and die.
+
+The simple way to do this is:
+
+ -  Have a field in the `game_ui' which describes the type of flash.
+
+ -  In flash_length(), examine the old and new game states to decide
+    whether a flash is required and what type. Write the type of flash
+    to the `game_ui' field whenever you return non-zero.
+
+ -  In redraw(), when you detect that `flash_time' is non-zero, examine
+    the field in `game_ui' to decide which type of flash to draw.
+
+redraw() will never be called with `flash_time' non-zero unless
+flash_length() was first called to tell the mid-end that a flash was
+required; so whenever redraw() notices that `flash_time' is non-zero,
+you can be sure that the field in `game_ui' is correctly set.
+
+6.3.6. Animating game moves
+---------------------------
+
+A number of puzzle types benefit from a quick animation of each move you
+make.
+
+For some games, such as Fifteen, this is particularly easy. Whenever
+redraw() is called with `oldstate' non-NULL, Fifteen simply compares the
+position of each tile in the two game states, and if the tile is not in
+the same place then it draws it some fraction of the way from its old
+position to its new position. This method copes automatically with undo.
+
+Other games are less obvious. In Sixteen, for example, you can't just
+draw each tile a fraction of the way from its old to its new position:
+if you did that, the end tile would zip very rapidly past all the others
+to get to the other end and that would look silly. (Worse, it would look
+inconsistent if the end tile was drawn on top going one way and on the
+bottom going the other way.)
+
+A useful trick here is to define a field or two in the game state that
+indicates what the last move was.
+
+ -  Add a `last move' field to the `game_state' (or two or more fields
+    if the move is complex enough to need them).
+
+ -  new_game() initialises this field to a null value for a new game
+    state.
+
+ -  execute_move() sets up the field to reflect the move it just
+    performed.
+
+ -  redraw() now needs to examine its `dir' parameter. If `dir' is
+    positive, it determines the move being animated by looking at the
+    last-move field in `newstate'; but if `dir' is negative, it has to
+    look at the last-move field in `oldstate', and invert whatever move
+    it finds there.
+
+Note also that Sixteen needs to store the _direction_ of the move,
+because you can't quite determine it by examining the row or column in
+question. You can in almost all cases, but when the row is precisely
+two squares long it doesn't work since a move in either direction looks
+the same. (You could argue that since moving a 2-element row left and
+right has the same effect, it doesn't matter which one you animate; but
+in fact it's very disorienting to click the arrow left and find the row
+moving right, and almost as bad to undo a move to the right and find the
+game animating _another_ move to the right.)
+
+6.3.7. Animating drag operations
+--------------------------------
+
+In Untangle, moves are made by dragging a node from an old position to a
+new position. Therefore, at the time when the move is initially made, it
+should not be animated, because the node has already been dragged to the
+right place and doesn't need moving there. However, it's nice to animate
+the same move if it's later undone or redone. This requires a bit of
+fiddling.
+
+The obvious approach is to have a flag in the `game_ui' which inhibits
+move animation, and to set that flag in interpret_move(). The question
+is, when would the flag be reset again? The obvious place to do so
+is changed_state(), which will be called once per move. But it will
+be called _before_ anim_length(), so if it resets the flag then
+anim_length() will never see the flag set at all.
+
+The solution is to have _two_ flags in a queue.
+
+ -  Define two flags in `game_ui'; let's call them `current' and `next'.
+
+ -  Set both to FALSE in `new_ui()'.
+
+ -  When a drag operation completes in interpret_move(), set the `next'
+    flag to TRUE.
+
+ -  Every time changed_state() is called, set the value of `current' to
+    the value in `next', and then set the value of `next' to FALSE.
+
+ -  That way, `current' will be TRUE _after_ a call to changed_state()
+    if and only if that call to changed_state() was the result of a
+    drag operation processed by interpret_move(). Any other call to
+    changed_state(), due to an Undo or a Redo or a Restart or a Solve,
+    will leave `current' FALSE.
+
+ -  So now anim_length() can request a move animation if and only if the
+    `current' flag is _not_ set.
+
+6.3.8. Inhibiting the victory flash when Solve is used
+------------------------------------------------------
+
+Many games flash when you complete them, as a visual congratulation for
+having got to the end of the puzzle. It often seems like a good idea to
+disable that flash when the puzzle is brought to a solved state by means
+of the Solve operation.
+
+This is easily done:
+
+ -  Add a `cheated' flag to the `game_state'.
+
+ -  Set this flag to FALSE in new_game().
+
+ -  Have solve() return a move description string which clearly
+    identifies the move as a solve operation.
+
+ -  Have execute_move() respond to that clear identification by setting
+    the `cheated' flag in the returned `game_state'. The flag will
+    then be propagated to all subsequent game states, even if the user
+    continues fiddling with the game after it is solved.
+
+ -  flash_length() now returns non-zero if `oldstate' is not completed
+    and `newstate' is, _and_ neither state has the `cheated' flag set.
+
+6.4. Things to test once your puzzle is written
+-----------------------------------------------
+
+Puzzle implementations written in this framework are self-testing as far
+as I could make them.
+
+Textual game and move descriptions, for example, are generated and
+parsed as part of the normal process of play. Therefore, if you can make
+moves in the game _at all_ you can be reasonably confident that the
+mid-end serialisation interface will function correctly and you will
+be able to save your game. (By contrast, if I'd stuck with a single
+make_move() function performing the jobs of both interpret_move() and
+execute_move(), and had separate functions to encode and decode a game
+state in string form, then those functions would not be used during
+normal play; so they could have been completely broken, and you'd never
+know it until you tried to save the game - which would have meant you'd
+have to test game saving _extensively_ and make sure to test every
+possible type of game state. As an added bonus, doing it the way I did
+leads to smaller save files.)
+
+There is one exception to this, which is the string encoding of the
+`game_ui'. Most games do not store anything permanent in the `game_ui',
+and hence do not need to put anything in its encode and decode
+functions; but if there is anything in there, you do need to test game
+loading and saving to ensure those functions work properly.
+
+It's also worth testing undo and redo of all operations, to ensure that
+the redraw and the animations (if any) work properly. Failing to animate
+undo properly seems to be a common error.
+
+Other than that, just use your common sense.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..b91fb63
--- /dev/null
@@ -0,0 +1,469 @@
+# Makefile.am for puzzles under Unix with Autoconf/Automake.
+#
+# This file was created by `mkfiles.pl' from the `Recipe' file.
+# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.
+
+GAMES =
+noinst_PROGRAMS = blackbox bridges cube dominosa fifteen fifteensolver \
+               filling fillingsolver flip flood galaxies galaxiespicture \
+               galaxiessolver guess inertia keen keensolver latincheck \
+               lightup lightupsolver loopy loopysolver magnets \
+               magnetssolver map mapsolver mineobfusc mines net netslide \
+               nullgame obfusc palisade pattern patternpicture \
+               patternsolver pearl pearlbench pegs range rect samegame \
+               signpost signpostsolver singles singlessolver sixteen slant \
+               slantsolver solo solosolver tents tentssolver towers \
+               towerssolver tracks twiddle undead unequal unequalsolver \
+               unruly unrulysolver untangle
+AUTOMAKE_OPTIONS = subdir-objects
+
+allsources = ./blackbox.c ./bridges.c ./combi.c ./cube.c ./divvy.c \
+               ./dominosa.c ./drawing.c ./dsf.c ./fifteen.c ./filling.c \
+               ./findloop.c ./flip.c ./flood.c ./galaxies.c ./grid.c \
+               ./grid.h ./gtk.c ./guess.c ./inertia.c ./keen.c ./latin.c \
+               ./latin.h ./laydomino.c ./lightup.c ./list.c ./loopgen.c \
+               ./loopgen.h ./loopy.c ./magnets.c ./malloc.c ./map.c \
+               ./maxflow.c ./maxflow.h ./midend.c ./mines.c ./misc.c \
+               ./net.c ./netslide.c ./no-icon.c ./nullfe.c ./nullgame.c \
+               ./obfusc.c ./osx.m ./palisade.c ./pattern.c ./pearl.c \
+               ./pegs.c ./penrose.c ./penrose.h ./printing.c ./ps.c \
+               ./puzzles.h ./random.c ./range.c ./rect.c ./resource.h \
+               ./samegame.c ./signpost.c ./singles.c ./sixteen.c ./slant.c \
+               ./solo.c ./tdq.c ./tents.c ./towers.c ./tracks.c ./tree234.c \
+               ./tree234.h ./twiddle.c ./undead.c ./unequal.c ./unruly.c \
+               ./untangle.c ./version.c ./version.h ./windows.c \
+               icons/blackbox-icon.c icons/bridges-icon.c icons/cube-icon.c \
+               icons/dominosa-icon.c icons/fifteen-icon.c \
+               icons/filling-icon.c icons/flip-icon.c icons/flood-icon.c \
+               icons/galaxies-icon.c icons/guess-icon.c \
+               icons/inertia-icon.c icons/keen-icon.c icons/lightup-icon.c \
+               icons/loopy-icon.c icons/magnets-icon.c icons/map-icon.c \
+               icons/mines-icon.c icons/net-icon.c icons/netslide-icon.c \
+               icons/palisade-icon.c icons/pattern-icon.c \
+               icons/pearl-icon.c icons/pegs-icon.c icons/range-icon.c \
+               icons/rect-icon.c icons/samegame-icon.c \
+               icons/signpost-icon.c icons/singles-icon.c \
+               icons/sixteen-icon.c icons/slant-icon.c icons/solo-icon.c \
+               icons/tents-icon.c icons/towers-icon.c icons/tracks-icon.c \
+               icons/twiddle-icon.c icons/undead-icon.c \
+               icons/unequal-icon.c icons/unruly-icon.c \
+               icons/untangle-icon.c
+
+AM_CPPFLAGS = -I$(srcdir)/./ -I$(srcdir)/icons/ 
+AM_CFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)
+blackbox_SOURCES = ./blackbox.c ./drawing.c ./gtk.c ./malloc.c ./midend.c \
+               ./misc.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./version.c ./version.h icons/blackbox-icon.c
+blackbox_LDADD = $(GTK_LIBS) -lm
+
+bridges_SOURCES = ./bridges.c ./drawing.c ./dsf.c ./findloop.c ./gtk.c \
+               ./malloc.c ./midend.c ./misc.c ./printing.c ./ps.c \
+               ./puzzles.h ./random.c ./version.c ./version.h \
+               icons/bridges-icon.c
+bridges_LDADD = $(GTK_LIBS) -lm
+
+cube_SOURCES = ./cube.c ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./version.c \
+               ./version.h icons/cube-icon.c
+cube_LDADD = $(GTK_LIBS) -lm
+
+dominosa_SOURCES = ./dominosa.c ./drawing.c ./gtk.c ./laydomino.c ./malloc.c \
+               ./midend.c ./misc.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./version.c ./version.h icons/dominosa-icon.c
+dominosa_LDADD = $(GTK_LIBS) -lm
+
+fifteen_SOURCES = ./drawing.c ./fifteen.c ./gtk.c ./malloc.c ./midend.c \
+               ./misc.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./version.c ./version.h icons/fifteen-icon.c
+fifteen_LDADD = $(GTK_LIBS) -lm
+
+fifteensolver_SOURCES = ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+fifteensolver_LDADD = libfifteen2_a-fifteen.$(OBJEXT) -lm
+
+filling_SOURCES = ./drawing.c ./dsf.c ./filling.c ./gtk.c ./malloc.c \
+               ./midend.c ./misc.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./version.c ./version.h icons/filling-icon.c
+filling_LDADD = $(GTK_LIBS) -lm
+
+fillingsolver_SOURCES = ./dsf.c ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+fillingsolver_LDADD = libfilling2_a-filling.$(OBJEXT) -lm
+
+flip_SOURCES = ./drawing.c ./flip.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./tree234.c \
+               ./tree234.h ./version.c ./version.h icons/flip-icon.c
+flip_LDADD = $(GTK_LIBS) -lm
+
+flood_SOURCES = ./drawing.c ./flood.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./version.c \
+               ./version.h icons/flood-icon.c
+flood_LDADD = $(GTK_LIBS) -lm
+
+galaxies_SOURCES = ./drawing.c ./dsf.c ./galaxies.c ./gtk.c ./malloc.c \
+               ./midend.c ./misc.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./version.c ./version.h icons/galaxies-icon.c
+galaxies_LDADD = $(GTK_LIBS) -lm
+
+galaxiespicture_SOURCES = ./dsf.c ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+galaxiespicture_LDADD = libgalaxie4_a-galaxies.$(OBJEXT) -lm
+
+galaxiessolver_SOURCES = ./dsf.c ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+galaxiessolver_LDADD = libgalaxie2_a-galaxies.$(OBJEXT) -lm
+
+guess_SOURCES = ./drawing.c ./gtk.c ./guess.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./version.c \
+               ./version.h icons/guess-icon.c
+guess_LDADD = $(GTK_LIBS) -lm
+
+inertia_SOURCES = ./drawing.c ./gtk.c ./inertia.c ./malloc.c ./midend.c \
+               ./misc.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./version.c ./version.h icons/inertia-icon.c
+inertia_LDADD = $(GTK_LIBS) -lm
+
+keen_SOURCES = ./drawing.c ./dsf.c ./gtk.c ./keen.c ./latin.c ./latin.h \
+               ./malloc.c ./maxflow.c ./maxflow.h ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./tree234.c \
+               ./tree234.h ./version.c ./version.h icons/keen-icon.c
+keen_LDADD = $(GTK_LIBS) -lm
+
+keensolver_SOURCES = ./dsf.c ./malloc.c ./maxflow.c ./maxflow.h ./misc.c \
+               ./nullfe.c ./puzzles.h ./random.c ./tree234.c ./tree234.h
+keensolver_LDADD = libkeen2_a-keen.$(OBJEXT) liblatin6_a-latin.$(OBJEXT) -lm
+
+latincheck_SOURCES = ./malloc.c ./maxflow.c ./maxflow.h ./misc.c ./nullfe.c \
+               ./puzzles.h ./random.c ./tree234.c ./tree234.h
+latincheck_LDADD = liblatin8_a-latin.$(OBJEXT) -lm
+
+lightup_SOURCES = ./combi.c ./drawing.c ./gtk.c ./lightup.c ./malloc.c \
+               ./midend.c ./misc.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./version.c ./version.h icons/lightup-icon.c
+lightup_LDADD = $(GTK_LIBS) -lm
+
+lightupsolver_SOURCES = ./combi.c ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+lightupsolver_LDADD = liblightup2_a-lightup.$(OBJEXT) -lm
+
+loopy_SOURCES = ./drawing.c ./dsf.c ./grid.c ./grid.h ./gtk.c ./loopgen.c \
+               ./loopgen.h ./loopy.c ./malloc.c ./midend.c ./misc.c \
+               ./penrose.c ./penrose.h ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./tree234.c ./tree234.h ./version.c ./version.h \
+               icons/loopy-icon.c
+loopy_LDADD = $(GTK_LIBS) -lm
+
+loopysolver_SOURCES = ./dsf.c ./grid.c ./grid.h ./loopgen.c ./loopgen.h \
+               ./malloc.c ./misc.c ./nullfe.c ./penrose.c ./penrose.h \
+               ./puzzles.h ./random.c ./tree234.c ./tree234.h
+loopysolver_LDADD = libloopy2_a-loopy.$(OBJEXT) -lm
+
+magnets_SOURCES = ./drawing.c ./gtk.c ./laydomino.c ./magnets.c ./malloc.c \
+               ./midend.c ./misc.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./version.c ./version.h icons/magnets-icon.c
+magnets_LDADD = $(GTK_LIBS) -lm
+
+magnetssolver_SOURCES = ./laydomino.c ./malloc.c ./misc.c ./nullfe.c \
+               ./puzzles.h ./random.c
+magnetssolver_LDADD = libmagnets2_a-magnets.$(OBJEXT) -lm
+
+map_SOURCES = ./drawing.c ./dsf.c ./gtk.c ./malloc.c ./map.c ./midend.c \
+               ./misc.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./version.c ./version.h icons/map-icon.c
+map_LDADD = $(GTK_LIBS) -lm
+
+mapsolver_SOURCES = ./dsf.c ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+mapsolver_LDADD = libmap2_a-map.$(OBJEXT) -lm
+
+mineobfusc_SOURCES = ./malloc.c ./misc.c ./nullfe.c ./puzzles.h ./random.c \
+               ./tree234.c ./tree234.h
+mineobfusc_LDADD = libmines2_a-mines.$(OBJEXT) -lm
+
+mines_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./mines.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./tree234.c \
+               ./tree234.h ./version.c ./version.h icons/mines-icon.c
+mines_LDADD = $(GTK_LIBS) -lm
+
+net_SOURCES = ./drawing.c ./dsf.c ./findloop.c ./gtk.c ./malloc.c ./midend.c \
+               ./misc.c ./net.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./tree234.c ./tree234.h ./version.c ./version.h \
+               icons/net-icon.c
+net_LDADD = $(GTK_LIBS) -lm
+
+netslide_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./netslide.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./tree234.c ./tree234.h ./version.c ./version.h \
+               icons/netslide-icon.c
+netslide_LDADD = $(GTK_LIBS) -lm
+
+nullgame_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./no-icon.c ./nullgame.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./version.c ./version.h
+nullgame_LDADD = $(GTK_LIBS) -lm
+
+obfusc_SOURCES = ./malloc.c ./misc.c ./nullfe.c ./obfusc.c ./puzzles.h \
+               ./random.c
+obfusc_LDADD = -lm
+
+palisade_SOURCES = ./divvy.c ./drawing.c ./dsf.c ./gtk.c ./malloc.c \
+               ./midend.c ./misc.c ./palisade.c ./printing.c ./ps.c \
+               ./puzzles.h ./random.c ./version.c ./version.h \
+               icons/palisade-icon.c
+palisade_LDADD = $(GTK_LIBS) -lm
+
+pattern_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./pattern.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./version.c ./version.h icons/pattern-icon.c
+pattern_LDADD = $(GTK_LIBS) -lm
+
+patternpicture_SOURCES = ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+patternpicture_LDADD = libpattern4_a-pattern.$(OBJEXT) -lm
+
+patternsolver_SOURCES = ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+patternsolver_LDADD = libpattern2_a-pattern.$(OBJEXT) -lm
+
+pearl_SOURCES = ./drawing.c ./dsf.c ./grid.c ./grid.h ./gtk.c ./loopgen.c \
+               ./loopgen.h ./malloc.c ./midend.c ./misc.c ./pearl.c \
+               ./penrose.c ./penrose.h ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./tdq.c ./tree234.c ./tree234.h ./version.c \
+               ./version.h icons/pearl-icon.c
+pearl_LDADD = $(GTK_LIBS) -lm
+
+pearlbench_SOURCES = ./dsf.c ./grid.c ./grid.h ./loopgen.c ./loopgen.h \
+               ./malloc.c ./misc.c ./nullfe.c ./penrose.c ./penrose.h \
+               ./puzzles.h ./random.c ./tdq.c ./tree234.c ./tree234.h
+pearlbench_LDADD = libpearl2_a-pearl.$(OBJEXT) -lm
+
+pegs_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c ./pegs.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./tree234.c \
+               ./tree234.h ./version.c ./version.h icons/pegs-icon.c
+pegs_LDADD = $(GTK_LIBS) -lm
+
+range_SOURCES = ./drawing.c ./dsf.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./range.c \
+               ./version.c ./version.h icons/range-icon.c
+range_LDADD = $(GTK_LIBS) -lm
+
+rect_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./rect.c \
+               ./version.c ./version.h icons/rect-icon.c
+rect_LDADD = $(GTK_LIBS) -lm
+
+samegame_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./samegame.c \
+               ./version.c ./version.h icons/samegame-icon.c
+samegame_LDADD = $(GTK_LIBS) -lm
+
+signpost_SOURCES = ./drawing.c ./dsf.c ./gtk.c ./malloc.c ./midend.c \
+               ./misc.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./signpost.c ./version.c ./version.h icons/signpost-icon.c
+signpost_LDADD = $(GTK_LIBS) -lm
+
+signpostsolver_SOURCES = ./dsf.c ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+signpostsolver_LDADD = libsignpos2_a-signpost.$(OBJEXT) -lm
+
+singles_SOURCES = ./drawing.c ./dsf.c ./gtk.c ./latin.c ./latin.h ./malloc.c \
+               ./maxflow.c ./maxflow.h ./midend.c ./misc.c ./printing.c \
+               ./ps.c ./puzzles.h ./random.c ./singles.c ./tree234.c \
+               ./tree234.h ./version.c ./version.h icons/singles-icon.c
+singles_LDADD = $(GTK_LIBS) -lm
+
+singlessolver_SOURCES = ./dsf.c ./latin.c ./latin.h ./malloc.c ./maxflow.c \
+               ./maxflow.h ./misc.c ./nullfe.c ./puzzles.h ./random.c \
+               ./tree234.c ./tree234.h
+singlessolver_LDADD = libsingles3_a-singles.$(OBJEXT) -lm
+
+sixteen_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./sixteen.c \
+               ./version.c ./version.h icons/sixteen-icon.c
+sixteen_LDADD = $(GTK_LIBS) -lm
+
+slant_SOURCES = ./drawing.c ./dsf.c ./findloop.c ./gtk.c ./malloc.c \
+               ./midend.c ./misc.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./slant.c ./version.c ./version.h \
+               icons/slant-icon.c
+slant_LDADD = $(GTK_LIBS) -lm
+
+slantsolver_SOURCES = ./dsf.c ./findloop.c ./malloc.c ./misc.c ./nullfe.c \
+               ./puzzles.h ./random.c
+slantsolver_LDADD = libslant2_a-slant.$(OBJEXT) -lm
+
+solo_SOURCES = ./divvy.c ./drawing.c ./dsf.c ./gtk.c ./malloc.c ./midend.c \
+               ./misc.c ./printing.c ./ps.c ./puzzles.h ./random.c ./solo.c \
+               ./version.c ./version.h icons/solo-icon.c
+solo_LDADD = $(GTK_LIBS) -lm
+
+solosolver_SOURCES = ./divvy.c ./dsf.c ./malloc.c ./misc.c ./nullfe.c \
+               ./puzzles.h ./random.c
+solosolver_LDADD = libsolo2_a-solo.$(OBJEXT) -lm
+
+tents_SOURCES = ./drawing.c ./dsf.c ./gtk.c ./malloc.c ./maxflow.c \
+               ./maxflow.h ./midend.c ./misc.c ./printing.c ./ps.c \
+               ./puzzles.h ./random.c ./tents.c ./version.c ./version.h \
+               icons/tents-icon.c
+tents_LDADD = $(GTK_LIBS) -lm
+
+tentssolver_SOURCES = ./dsf.c ./malloc.c ./maxflow.c ./maxflow.h ./misc.c \
+               ./nullfe.c ./puzzles.h ./random.c
+tentssolver_LDADD = libtents3_a-tents.$(OBJEXT) -lm
+
+towers_SOURCES = ./drawing.c ./gtk.c ./latin.c ./latin.h ./malloc.c \
+               ./maxflow.c ./maxflow.h ./midend.c ./misc.c ./printing.c \
+               ./ps.c ./puzzles.h ./random.c ./towers.c ./tree234.c \
+               ./tree234.h ./version.c ./version.h icons/towers-icon.c
+towers_LDADD = $(GTK_LIBS) -lm
+
+towerssolver_SOURCES = ./malloc.c ./maxflow.c ./maxflow.h ./misc.c \
+               ./nullfe.c ./puzzles.h ./random.c ./tree234.c ./tree234.h
+towerssolver_LDADD = liblatin6_a-latin.$(OBJEXT) \
+               libtowers2_a-towers.$(OBJEXT) -lm
+
+tracks_SOURCES = ./drawing.c ./dsf.c ./findloop.c ./gtk.c ./malloc.c \
+               ./midend.c ./misc.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./tracks.c ./version.c ./version.h \
+               icons/tracks-icon.c
+tracks_LDADD = $(GTK_LIBS) -lm
+
+twiddle_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./twiddle.c \
+               ./version.c ./version.h icons/twiddle-icon.c
+twiddle_LDADD = $(GTK_LIBS) -lm
+
+undead_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./undead.c \
+               ./version.c ./version.h icons/undead-icon.c
+undead_LDADD = $(GTK_LIBS) -lm
+
+unequal_SOURCES = ./drawing.c ./gtk.c ./latin.c ./latin.h ./malloc.c \
+               ./maxflow.c ./maxflow.h ./midend.c ./misc.c ./printing.c \
+               ./ps.c ./puzzles.h ./random.c ./tree234.c ./tree234.h \
+               ./unequal.c ./version.c ./version.h icons/unequal-icon.c
+unequal_LDADD = $(GTK_LIBS) -lm
+
+unequalsolver_SOURCES = ./malloc.c ./maxflow.c ./maxflow.h ./misc.c \
+               ./nullfe.c ./puzzles.h ./random.c ./tree234.c ./tree234.h
+unequalsolver_LDADD = liblatin6_a-latin.$(OBJEXT) \
+               libunequal2_a-unequal.$(OBJEXT) -lm
+
+unruly_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./unruly.c \
+               ./version.c ./version.h icons/unruly-icon.c
+unruly_LDADD = $(GTK_LIBS) -lm
+
+unrulysolver_SOURCES = ./malloc.c ./misc.c ./nullfe.c ./puzzles.h ./random.c
+unrulysolver_LDADD = libunruly2_a-unruly.$(OBJEXT) -lm
+
+untangle_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./tree234.c \
+               ./tree234.h ./untangle.c ./version.c ./version.h \
+               icons/untangle-icon.c
+untangle_LDADD = $(GTK_LIBS) -lm
+
+libfifteen2_a_SOURCES = ./fifteen.c ./puzzles.h
+libfifteen2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libfilling2_a_SOURCES = ./filling.c ./puzzles.h
+libfilling2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libgalaxie2_a_SOURCES = ./galaxies.c ./puzzles.h
+libgalaxie2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libgalaxie4_a_SOURCES = ./galaxies.c ./puzzles.h
+libgalaxie4_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  \
+               -DSTANDALONE_PICTURE_GENERATOR
+libkeen2_a_SOURCES = ./keen.c ./puzzles.h ./latin.h
+libkeen2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+liblatin6_a_SOURCES = ./latin.c ./puzzles.h ./tree234.h ./maxflow.h \
+               ./latin.h
+liblatin6_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+liblatin8_a_SOURCES = ./latin.c ./puzzles.h ./tree234.h ./maxflow.h \
+               ./latin.h
+liblatin8_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_LATIN_TEST
+liblightup2_a_SOURCES = ./lightup.c ./puzzles.h
+liblightup2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libloopy2_a_SOURCES = ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+libloopy2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libmagnets2_a_SOURCES = ./magnets.c ./puzzles.h
+libmagnets2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libmap2_a_SOURCES = ./map.c ./puzzles.h
+libmap2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libmines2_a_SOURCES = ./mines.c ./tree234.h ./puzzles.h
+libmines2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_OBFUSCATOR
+libpattern2_a_SOURCES = ./pattern.c ./puzzles.h
+libpattern2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libpattern4_a_SOURCES = ./pattern.c ./puzzles.h
+libpattern4_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  \
+               -DSTANDALONE_PICTURE_GENERATOR
+libpearl2_a_SOURCES = ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+libpearl2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libsignpos2_a_SOURCES = ./signpost.c ./puzzles.h
+libsignpos2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libsingles3_a_SOURCES = ./singles.c ./puzzles.h ./latin.h
+libsingles3_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libslant2_a_SOURCES = ./slant.c ./puzzles.h
+libslant2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libsolo2_a_SOURCES = ./solo.c ./puzzles.h
+libsolo2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libtents3_a_SOURCES = ./tents.c ./puzzles.h ./maxflow.h
+libtents3_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libtowers2_a_SOURCES = ./towers.c ./puzzles.h ./latin.h
+libtowers2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libunequal2_a_SOURCES = ./unequal.c ./puzzles.h ./latin.h
+libunequal2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libunruly2_a_SOURCES = ./unruly.c ./puzzles.h
+libunruly2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+noinst_LIBRARIES = libfifteen2.a libfilling2.a libgalaxie2.a libgalaxie4.a \
+               libkeen2.a liblatin6.a liblatin8.a liblightup2.a libloopy2.a \
+               libmagnets2.a libmap2.a libmines2.a libpattern2.a \
+               libpattern4.a libpearl2.a libsignpos2.a libsingles3.a \
+               libslant2.a libsolo2.a libtents3.a libtowers2.a \
+               libunequal2.a libunruly2.a
+
+GAMES += blackbox
+GAMES += bridges
+GAMES += cube
+GAMES += dominosa
+GAMES += fifteen
+GAMES += filling
+GAMES += flip
+GAMES += flood
+GAMES += galaxies
+GAMES += guess
+GAMES += inertia
+GAMES += keen
+GAMES += lightup
+GAMES += loopy
+GAMES += magnets
+GAMES += map
+GAMES += mines
+GAMES += net
+GAMES += netslide
+GAMES += palisade
+GAMES += pattern
+GAMES += pearl
+GAMES += pegs
+GAMES += range
+GAMES += rect
+GAMES += samegame
+GAMES += signpost
+GAMES += singles
+GAMES += sixteen
+GAMES += slant
+GAMES += solo
+GAMES += tents
+GAMES += towers
+GAMES += tracks
+GAMES += twiddle
+GAMES += undead
+GAMES += unequal
+GAMES += unruly
+GAMES += untangle
+bin_PROGRAMS = $(GAMES)
+test: benchmark.html benchmark.txt
+
+benchmark.html: benchmark.txt benchmark.pl
+       ./benchmark.pl benchmark.txt > $@
+
+benchmark.txt: benchmark.sh $(GAMES)
+       ./benchmark.sh > $@
diff --git a/Makefile.cyg b/Makefile.cyg
new file mode 100644 (file)
index 0000000..168fcf2
--- /dev/null
@@ -0,0 +1,879 @@
+# Makefile for puzzles under cygwin.
+#
+# This file was created by `mkfiles.pl' from the `Recipe' file.
+# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.
+
+# You can define this path to point at your tools if you need to
+# TOOLPATH = c:\cygwin\bin\ # or similar, if you're running Windows
+# TOOLPATH = /pkg/mingw32msvc/i386-mingw32msvc/bin/
+CC = $(TOOLPATH)gcc
+RC = $(TOOLPATH)windres
+# Uncomment the following two lines to compile under Winelib
+# CC = winegcc
+# RC = wrc
+# You may also need to tell windres where to find include files:
+# RCINC = --include-dir c:\cygwin\include\
+
+CFLAGS = -mno-cygwin -Wall -O2 -D_WINDOWS -DDEBUG -DWIN32S_COMPAT \
+               -D_NO_OLDNAMES -DNO_MULTIMON -DNO_HTMLHELP -I./ -Iicons/
+LDFLAGS = -mno-cygwin -s
+RCFLAGS = $(RCINC) --define WIN32=1 --define _WIN32=1 --define WINVER=0x0400 \
+               --define MINGW32_FIX=1 --include ./ --include icons/
+
+all: blackbox.exe bridges.exe cube.exe dominosa.exe fifteen.exe \
+               fifteensolver.exe filling.exe fillingsolver.exe flip.exe \
+               flood.exe galaxies.exe galaxiespicture.exe \
+               galaxiessolver.exe guess.exe inertia.exe keen.exe \
+               keensolver.exe latincheck.exe lightup.exe lightupsolver.exe \
+               loopy.exe loopysolver.exe magnets.exe magnetssolver.exe \
+               map.exe mapsolver.exe mineobfusc.exe mines.exe netgame.exe \
+               netslide.exe nullgame.exe palisade.exe pattern.exe \
+               patternpicture.exe patternsolver.exe pearl.exe \
+               pearlbench.exe pegs.exe puzzles.exe range.exe rect.exe \
+               samegame.exe signpost.exe signpostsolver.exe singles.exe \
+               singlessolver.exe sixteen.exe slant.exe slantsolver.exe \
+               solo.exe solosolver.exe tents.exe tentssolver.exe towers.exe \
+               towerssolver.exe tracks.exe twiddle.exe undead.exe \
+               unequal.exe unequalsolver.exe unruly.exe unrulysolver.exe \
+               untangle.exe
+
+blackbox.exe: blackbox.o blackbox.res.o drawing.o malloc.o midend.o misc.o \
+               printing.o random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,blackbox.map blackbox.o \
+               blackbox.res.o drawing.o malloc.o midend.o misc.o printing.o \
+               random.o version.o windows.o -lcomctl32 -lcomdlg32 -lgdi32 \
+               -luser32 -lwinspool
+
+bridges.exe: bridges.o bridges.res.o drawing.o dsf.o findloop.o malloc.o \
+               midend.o misc.o printing.o random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,bridges.map bridges.o \
+               bridges.res.o drawing.o dsf.o findloop.o malloc.o midend.o \
+               misc.o printing.o random.o version.o windows.o -lcomctl32 \
+               -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+cube.exe: cube.o cube.res.o drawing.o malloc.o midend.o misc.o printing.o \
+               random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,cube.map cube.o cube.res.o \
+               drawing.o malloc.o midend.o misc.o printing.o random.o \
+               version.o windows.o -lcomctl32 -lcomdlg32 -lgdi32 -luser32 \
+               -lwinspool
+
+dominosa.exe: dominosa.o dominosa.res.o drawing.o laydomino.o malloc.o \
+               midend.o misc.o printing.o random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,dominosa.map dominosa.o \
+               dominosa.res.o drawing.o laydomino.o malloc.o midend.o \
+               misc.o printing.o random.o version.o windows.o -lcomctl32 \
+               -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+fifteen.exe: drawing.o fifteen.o fifteen.res.o malloc.o midend.o misc.o \
+               printing.o random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,fifteen.map drawing.o \
+               fifteen.o fifteen.res.o malloc.o midend.o misc.o printing.o \
+               random.o version.o windows.o -lcomctl32 -lcomdlg32 -lgdi32 \
+               -luser32 -lwinspool
+
+fifteensolver.exe: fifteen2.o malloc.o misc.o nullfe.o random.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,fifteensolver.map fifteen2.o \
+               malloc.o misc.o nullfe.o random.o 
+
+filling.exe: drawing.o dsf.o filling.o filling.res.o malloc.o midend.o \
+               misc.o printing.o random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,filling.map drawing.o \
+               dsf.o filling.o filling.res.o malloc.o midend.o misc.o \
+               printing.o random.o version.o windows.o -lcomctl32 \
+               -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+fillingsolver.exe: dsf.o filling2.o malloc.o misc.o nullfe.o random.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,fillingsolver.map dsf.o filling2.o \
+               malloc.o misc.o nullfe.o random.o 
+
+flip.exe: drawing.o flip.o flip.res.o malloc.o midend.o misc.o printing.o \
+               random.o tree234.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,flip.map drawing.o flip.o \
+               flip.res.o malloc.o midend.o misc.o printing.o random.o \
+               tree234.o version.o windows.o -lcomctl32 -lcomdlg32 -lgdi32 \
+               -luser32 -lwinspool
+
+flood.exe: drawing.o flood.o flood.res.o malloc.o midend.o misc.o printing.o \
+               random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,flood.map drawing.o \
+               flood.o flood.res.o malloc.o midend.o misc.o printing.o \
+               random.o version.o windows.o -lcomctl32 -lcomdlg32 -lgdi32 \
+               -luser32 -lwinspool
+
+galaxies.exe: drawing.o dsf.o galaxies.o galaxies.res.o malloc.o midend.o \
+               misc.o printing.o random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,galaxies.map drawing.o \
+               dsf.o galaxies.o galaxies.res.o malloc.o midend.o misc.o \
+               printing.o random.o version.o windows.o -lcomctl32 \
+               -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+galaxiespicture.exe: dsf.o galaxie4.o malloc.o misc.o nullfe.o random.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,galaxiespicture.map dsf.o galaxie4.o \
+               malloc.o misc.o nullfe.o random.o 
+
+galaxiessolver.exe: dsf.o galaxie2.o malloc.o misc.o nullfe.o random.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,galaxiessolver.map dsf.o galaxie2.o \
+               malloc.o misc.o nullfe.o random.o 
+
+guess.exe: drawing.o guess.o guess.res.o malloc.o midend.o misc.o printing.o \
+               random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,guess.map drawing.o \
+               guess.o guess.res.o malloc.o midend.o misc.o printing.o \
+               random.o version.o windows.o -lcomctl32 -lcomdlg32 -lgdi32 \
+               -luser32 -lwinspool
+
+inertia.exe: drawing.o inertia.o inertia.res.o malloc.o midend.o misc.o \
+               printing.o random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,inertia.map drawing.o \
+               inertia.o inertia.res.o malloc.o midend.o misc.o printing.o \
+               random.o version.o windows.o -lcomctl32 -lcomdlg32 -lgdi32 \
+               -luser32 -lwinspool
+
+keen.exe: drawing.o dsf.o keen.o keen.res.o latin.o malloc.o maxflow.o \
+               midend.o misc.o printing.o random.o tree234.o version.o \
+               windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,keen.map drawing.o dsf.o \
+               keen.o keen.res.o latin.o malloc.o maxflow.o midend.o misc.o \
+               printing.o random.o tree234.o version.o windows.o -lcomctl32 \
+               -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+keensolver.exe: dsf.o keen2.o latin6.o malloc.o maxflow.o misc.o nullfe.o \
+               random.o tree234.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,keensolver.map dsf.o keen2.o \
+               latin6.o malloc.o maxflow.o misc.o nullfe.o random.o \
+               tree234.o 
+
+latincheck.exe: latin8.o malloc.o maxflow.o misc.o nullfe.o random.o \
+               tree234.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,latincheck.map latin8.o malloc.o \
+               maxflow.o misc.o nullfe.o random.o tree234.o 
+
+lightup.exe: combi.o drawing.o lightup.o lightup.res.o malloc.o midend.o \
+               misc.o printing.o random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,lightup.map combi.o \
+               drawing.o lightup.o lightup.res.o malloc.o midend.o misc.o \
+               printing.o random.o version.o windows.o -lcomctl32 \
+               -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+lightupsolver.exe: combi.o lightup2.o malloc.o misc.o nullfe.o random.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,lightupsolver.map combi.o lightup2.o \
+               malloc.o misc.o nullfe.o random.o 
+
+loopy.exe: drawing.o dsf.o grid.o loopgen.o loopy.o loopy.res.o malloc.o \
+               midend.o misc.o penrose.o printing.o random.o tree234.o \
+               version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,loopy.map drawing.o dsf.o \
+               grid.o loopgen.o loopy.o loopy.res.o malloc.o midend.o \
+               misc.o penrose.o printing.o random.o tree234.o version.o \
+               windows.o -lcomctl32 -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+loopysolver.exe: dsf.o grid.o loopgen.o loopy2.o malloc.o misc.o nullfe.o \
+               penrose.o random.o tree234.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,loopysolver.map dsf.o grid.o \
+               loopgen.o loopy2.o malloc.o misc.o nullfe.o penrose.o \
+               random.o tree234.o 
+
+magnets.exe: drawing.o laydomino.o magnets.o magnets.res.o malloc.o midend.o \
+               misc.o printing.o random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,magnets.map drawing.o \
+               laydomino.o magnets.o magnets.res.o malloc.o midend.o misc.o \
+               printing.o random.o version.o windows.o -lcomctl32 \
+               -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+magnetssolver.exe: laydomino.o magnets2.o malloc.o misc.o nullfe.o random.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,magnetssolver.map laydomino.o \
+               magnets2.o malloc.o misc.o nullfe.o random.o 
+
+map.exe: drawing.o dsf.o malloc.o map.o map.res.o midend.o misc.o printing.o \
+               random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,map.map drawing.o dsf.o \
+               malloc.o map.o map.res.o midend.o misc.o printing.o random.o \
+               version.o windows.o -lcomctl32 -lcomdlg32 -lgdi32 -luser32 \
+               -lwinspool
+
+mapsolver.exe: dsf.o malloc.o map2.o misc.o nullfe.o random.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,mapsolver.map dsf.o malloc.o map2.o \
+               misc.o nullfe.o random.o 
+
+mineobfusc.exe: malloc.o mines2.o misc.o nullfe.o random.o tree234.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,mineobfusc.map malloc.o mines2.o \
+               misc.o nullfe.o random.o tree234.o 
+
+mines.exe: drawing.o malloc.o midend.o mines.o mines.res.o misc.o printing.o \
+               random.o tree234.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,mines.map drawing.o \
+               malloc.o midend.o mines.o mines.res.o misc.o printing.o \
+               random.o tree234.o version.o windows.o -lcomctl32 -lcomdlg32 \
+               -lgdi32 -luser32 -lwinspool
+
+netgame.exe: drawing.o dsf.o findloop.o malloc.o midend.o misc.o net.o \
+               net.res.o printing.o random.o tree234.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,netgame.map drawing.o \
+               dsf.o findloop.o malloc.o midend.o misc.o net.o net.res.o \
+               printing.o random.o tree234.o version.o windows.o -lcomctl32 \
+               -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+netslide.exe: drawing.o malloc.o midend.o misc.o netslide.o netslide.res.o \
+               printing.o random.o tree234.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,netslide.map drawing.o \
+               malloc.o midend.o misc.o netslide.o netslide.res.o \
+               printing.o random.o tree234.o version.o windows.o -lcomctl32 \
+               -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+nullgame.exe: drawing.o malloc.o midend.o misc.o noicon.res.o nullgame.o \
+               printing.o random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,nullgame.map drawing.o \
+               malloc.o midend.o misc.o noicon.res.o nullgame.o printing.o \
+               random.o version.o windows.o -lcomctl32 -lcomdlg32 -lgdi32 \
+               -luser32 -lwinspool
+
+palisade.exe: divvy.o drawing.o dsf.o malloc.o midend.o misc.o palisade.o \
+               palisade.res.o printing.o random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,palisade.map divvy.o \
+               drawing.o dsf.o malloc.o midend.o misc.o palisade.o \
+               palisade.res.o printing.o random.o version.o windows.o \
+               -lcomctl32 -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+pattern.exe: drawing.o malloc.o midend.o misc.o pattern.o pattern.res.o \
+               printing.o random.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,pattern.map drawing.o \
+               malloc.o midend.o misc.o pattern.o pattern.res.o printing.o \
+               random.o version.o windows.o -lcomctl32 -lcomdlg32 -lgdi32 \
+               -luser32 -lwinspool
+
+patternpicture.exe: malloc.o misc.o nullfe.o pattern4.o random.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,patternpicture.map malloc.o misc.o \
+               nullfe.o pattern4.o random.o 
+
+patternsolver.exe: malloc.o misc.o nullfe.o pattern2.o random.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,patternsolver.map malloc.o misc.o \
+               nullfe.o pattern2.o random.o 
+
+pearl.exe: drawing.o dsf.o grid.o loopgen.o malloc.o midend.o misc.o pearl.o \
+               pearl.res.o penrose.o printing.o random.o tdq.o tree234.o \
+               version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,pearl.map drawing.o dsf.o \
+               grid.o loopgen.o malloc.o midend.o misc.o pearl.o \
+               pearl.res.o penrose.o printing.o random.o tdq.o tree234.o \
+               version.o windows.o -lcomctl32 -lcomdlg32 -lgdi32 -luser32 \
+               -lwinspool
+
+pearlbench.exe: dsf.o grid.o loopgen.o malloc.o misc.o nullfe.o pearl2.o \
+               penrose.o random.o tdq.o tree234.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,pearlbench.map dsf.o grid.o \
+               loopgen.o malloc.o misc.o nullfe.o pearl2.o penrose.o \
+               random.o tdq.o tree234.o 
+
+pegs.exe: drawing.o malloc.o midend.o misc.o pegs.o pegs.res.o printing.o \
+               random.o tree234.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,pegs.map drawing.o \
+               malloc.o midend.o misc.o pegs.o pegs.res.o printing.o \
+               random.o tree234.o version.o windows.o -lcomctl32 -lcomdlg32 \
+               -lgdi32 -luser32 -lwinspool
+
+puzzles.exe: blackbo3.o bridges3.o combi.o cube3.o divvy.o dominos3.o \
+               drawing.o dsf.o fifteen5.o filling5.o findloop.o flip3.o \
+               flood3.o galaxie7.o grid.o guess3.o inertia3.o keen5.o \
+               latin.o laydomino.o lightup5.o list.o loopgen.o loopy5.o \
+               magnets5.o malloc.o map5.o maxflow.o midend.o mines5.o \
+               misc.o net3.o netslid3.o noicon.res.o palisad3.o pattern7.o \
+               pearl5.o pegs3.o penrose.o printing.o random.o range3.o \
+               rect3.o samegam3.o signpos5.o singles5.o sixteen3.o slant5.o \
+               solo5.o tdq.o tents5.o towers5.o tracks3.o tree234.o \
+               twiddle3.o undead3.o unequal5.o unruly5.o untangl3.o \
+               version.o windows1.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,puzzles.map blackbo3.o \
+               bridges3.o combi.o cube3.o divvy.o dominos3.o drawing.o \
+               dsf.o fifteen5.o filling5.o findloop.o flip3.o flood3.o \
+               galaxie7.o grid.o guess3.o inertia3.o keen5.o latin.o \
+               laydomino.o lightup5.o list.o loopgen.o loopy5.o magnets5.o \
+               malloc.o map5.o maxflow.o midend.o mines5.o misc.o net3.o \
+               netslid3.o noicon.res.o palisad3.o pattern7.o pearl5.o \
+               pegs3.o penrose.o printing.o random.o range3.o rect3.o \
+               samegam3.o signpos5.o singles5.o sixteen3.o slant5.o solo5.o \
+               tdq.o tents5.o towers5.o tracks3.o tree234.o twiddle3.o \
+               undead3.o unequal5.o unruly5.o untangl3.o version.o \
+               windows1.o -lcomctl32 -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+range.exe: drawing.o dsf.o malloc.o midend.o misc.o printing.o random.o \
+               range.o range.res.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,range.map drawing.o dsf.o \
+               malloc.o midend.o misc.o printing.o random.o range.o \
+               range.res.o version.o windows.o -lcomctl32 -lcomdlg32 \
+               -lgdi32 -luser32 -lwinspool
+
+rect.exe: drawing.o malloc.o midend.o misc.o printing.o random.o rect.o \
+               rect.res.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,rect.map drawing.o \
+               malloc.o midend.o misc.o printing.o random.o rect.o \
+               rect.res.o version.o windows.o -lcomctl32 -lcomdlg32 -lgdi32 \
+               -luser32 -lwinspool
+
+samegame.exe: drawing.o malloc.o midend.o misc.o printing.o random.o \
+               samegame.o samegame.res.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,samegame.map drawing.o \
+               malloc.o midend.o misc.o printing.o random.o samegame.o \
+               samegame.res.o version.o windows.o -lcomctl32 -lcomdlg32 \
+               -lgdi32 -luser32 -lwinspool
+
+signpost.exe: drawing.o dsf.o malloc.o midend.o misc.o printing.o random.o \
+               signpost.o signpost.res.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,signpost.map drawing.o \
+               dsf.o malloc.o midend.o misc.o printing.o random.o \
+               signpost.o signpost.res.o version.o windows.o -lcomctl32 \
+               -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+signpostsolver.exe: dsf.o malloc.o misc.o nullfe.o random.o signpos2.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,signpostsolver.map dsf.o malloc.o \
+               misc.o nullfe.o random.o signpos2.o 
+
+singles.exe: drawing.o dsf.o latin.o malloc.o maxflow.o midend.o misc.o \
+               printing.o random.o singles.o singles.res.o tree234.o \
+               version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,singles.map drawing.o \
+               dsf.o latin.o malloc.o maxflow.o midend.o misc.o printing.o \
+               random.o singles.o singles.res.o tree234.o version.o \
+               windows.o -lcomctl32 -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+singlessolver.exe: dsf.o latin.o malloc.o maxflow.o misc.o nullfe.o random.o \
+               singles3.o tree234.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,singlessolver.map dsf.o latin.o \
+               malloc.o maxflow.o misc.o nullfe.o random.o singles3.o \
+               tree234.o 
+
+sixteen.exe: drawing.o malloc.o midend.o misc.o printing.o random.o \
+               sixteen.o sixteen.res.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,sixteen.map drawing.o \
+               malloc.o midend.o misc.o printing.o random.o sixteen.o \
+               sixteen.res.o version.o windows.o -lcomctl32 -lcomdlg32 \
+               -lgdi32 -luser32 -lwinspool
+
+slant.exe: drawing.o dsf.o findloop.o malloc.o midend.o misc.o printing.o \
+               random.o slant.o slant.res.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,slant.map drawing.o dsf.o \
+               findloop.o malloc.o midend.o misc.o printing.o random.o \
+               slant.o slant.res.o version.o windows.o -lcomctl32 \
+               -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+slantsolver.exe: dsf.o findloop.o malloc.o misc.o nullfe.o random.o slant2.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,slantsolver.map dsf.o findloop.o \
+               malloc.o misc.o nullfe.o random.o slant2.o 
+
+solo.exe: divvy.o drawing.o dsf.o malloc.o midend.o misc.o printing.o \
+               random.o solo.o solo.res.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,solo.map divvy.o drawing.o \
+               dsf.o malloc.o midend.o misc.o printing.o random.o solo.o \
+               solo.res.o version.o windows.o -lcomctl32 -lcomdlg32 -lgdi32 \
+               -luser32 -lwinspool
+
+solosolver.exe: divvy.o dsf.o malloc.o misc.o nullfe.o random.o solo2.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,solosolver.map divvy.o dsf.o \
+               malloc.o misc.o nullfe.o random.o solo2.o 
+
+tents.exe: drawing.o dsf.o malloc.o maxflow.o midend.o misc.o printing.o \
+               random.o tents.o tents.res.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,tents.map drawing.o dsf.o \
+               malloc.o maxflow.o midend.o misc.o printing.o random.o \
+               tents.o tents.res.o version.o windows.o -lcomctl32 \
+               -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+tentssolver.exe: dsf.o malloc.o maxflow.o misc.o nullfe.o random.o tents3.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,tentssolver.map dsf.o malloc.o \
+               maxflow.o misc.o nullfe.o random.o tents3.o 
+
+towers.exe: drawing.o latin.o malloc.o maxflow.o midend.o misc.o printing.o \
+               random.o towers.o towers.res.o tree234.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,towers.map drawing.o \
+               latin.o malloc.o maxflow.o midend.o misc.o printing.o \
+               random.o towers.o towers.res.o tree234.o version.o windows.o \
+               -lcomctl32 -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+towerssolver.exe: latin6.o malloc.o maxflow.o misc.o nullfe.o random.o \
+               towers2.o tree234.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,towerssolver.map latin6.o malloc.o \
+               maxflow.o misc.o nullfe.o random.o towers2.o tree234.o 
+
+tracks.exe: drawing.o dsf.o findloop.o malloc.o midend.o misc.o printing.o \
+               random.o tracks.o tracks.res.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,tracks.map drawing.o dsf.o \
+               findloop.o malloc.o midend.o misc.o printing.o random.o \
+               tracks.o tracks.res.o version.o windows.o -lcomctl32 \
+               -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+twiddle.exe: drawing.o malloc.o midend.o misc.o printing.o random.o \
+               twiddle.o twiddle.res.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,twiddle.map drawing.o \
+               malloc.o midend.o misc.o printing.o random.o twiddle.o \
+               twiddle.res.o version.o windows.o -lcomctl32 -lcomdlg32 \
+               -lgdi32 -luser32 -lwinspool
+
+undead.exe: drawing.o malloc.o midend.o misc.o printing.o random.o undead.o \
+               undead.res.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,undead.map drawing.o \
+               malloc.o midend.o misc.o printing.o random.o undead.o \
+               undead.res.o version.o windows.o -lcomctl32 -lcomdlg32 \
+               -lgdi32 -luser32 -lwinspool
+
+unequal.exe: drawing.o latin.o malloc.o maxflow.o midend.o misc.o printing.o \
+               random.o tree234.o unequal.o unequal.res.o version.o \
+               windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,unequal.map drawing.o \
+               latin.o malloc.o maxflow.o midend.o misc.o printing.o \
+               random.o tree234.o unequal.o unequal.res.o version.o \
+               windows.o -lcomctl32 -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+unequalsolver.exe: latin6.o malloc.o maxflow.o misc.o nullfe.o random.o \
+               tree234.o unequal2.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,unequalsolver.map latin6.o malloc.o \
+               maxflow.o misc.o nullfe.o random.o tree234.o unequal2.o 
+
+unruly.exe: drawing.o malloc.o midend.o misc.o printing.o random.o unruly.o \
+               unruly.res.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,unruly.map drawing.o \
+               malloc.o midend.o misc.o printing.o random.o unruly.o \
+               unruly.res.o version.o windows.o -lcomctl32 -lcomdlg32 \
+               -lgdi32 -luser32 -lwinspool
+
+unrulysolver.exe: malloc.o misc.o nullfe.o random.o unruly2.o
+       $(CC) $(LDFLAGS) -o $@ -Wl,-Map,unrulysolver.map malloc.o misc.o \
+               nullfe.o random.o unruly2.o 
+
+untangle.exe: drawing.o malloc.o midend.o misc.o printing.o random.o \
+               tree234.o untangle.o untangle.res.o version.o windows.o
+       $(CC) -mwindows $(LDFLAGS) -o $@ -Wl,-Map,untangle.map drawing.o \
+               malloc.o midend.o misc.o printing.o random.o tree234.o \
+               untangle.o untangle.res.o version.o windows.o -lcomctl32 \
+               -lcomdlg32 -lgdi32 -luser32 -lwinspool
+
+blackbox.o: ./blackbox.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+blackbox-icon.o: icons/blackbox-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+blackbox.res.o: icons/blackbox.rc ./puzzles.rc2 icons/blackbox.ico \
+               ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+blackbo3.o: ./blackbox.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+bridges.o: ./bridges.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+bridges-icon.o: icons/bridges-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+bridges.res.o: icons/bridges.rc ./puzzles.rc2 icons/bridges.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+bridges3.o: ./bridges.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+combi.o: ./combi.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube.o: ./cube.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube-icon.o: icons/cube-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube.res.o: icons/cube.rc ./puzzles.rc2 icons/cube.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+cube3.o: ./cube.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+divvy.o: ./divvy.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominosa.o: ./dominosa.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominosa-icon.o: icons/dominosa-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominosa.res.o: icons/dominosa.rc ./puzzles.rc2 icons/dominosa.ico \
+               ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+dominos3.o: ./dominosa.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+drawing.o: ./drawing.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dsf.o: ./dsf.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen.o: ./fifteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen-icon.o: icons/fifteen-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen.res.o: icons/fifteen.rc ./puzzles.rc2 icons/fifteen.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+fifteen5.o: ./fifteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+fifteen2.o: ./fifteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+filling.o: ./filling.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+filling-icon.o: icons/filling-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+filling.res.o: icons/filling.rc ./puzzles.rc2 icons/filling.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+filling5.o: ./filling.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+filling2.o: ./filling.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+findloop.o: ./findloop.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip.o: ./flip.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip-icon.o: icons/flip-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip.res.o: icons/flip.rc ./puzzles.rc2 icons/flip.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+flip3.o: ./flip.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+flood.o: ./flood.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flood-icon.o: icons/flood-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flood.res.o: icons/flood.rc ./puzzles.rc2 icons/flood.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+flood3.o: ./flood.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+galaxies.o: ./galaxies.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+galaxies-icon.o: icons/galaxies-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+galaxies.res.o: icons/galaxies.rc ./puzzles.rc2 icons/galaxies.ico \
+               ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+galaxie7.o: ./galaxies.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+galaxie4.o: ./galaxies.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_PICTURE_GENERATOR -c $< -o $@
+galaxie2.o: ./galaxies.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+grid.o: ./grid.c ./puzzles.h ./tree234.h ./grid.h ./penrose.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+gtk.o: ./gtk.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess.o: ./guess.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess-icon.o: icons/guess-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess.res.o: icons/guess.rc ./puzzles.rc2 icons/guess.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+guess3.o: ./guess.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+inertia.o: ./inertia.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+inertia-icon.o: icons/inertia-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+inertia.res.o: icons/inertia.rc ./puzzles.rc2 icons/inertia.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+inertia3.o: ./inertia.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+keen.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+keen-icon.o: icons/keen-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+keen.res.o: icons/keen.rc ./puzzles.rc2 icons/keen.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+keen5.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+keen2.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+latin.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+latin8.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_LATIN_TEST -c $< -o $@
+latin6.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+laydomino.o: ./laydomino.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup.o: ./lightup.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup-icon.o: icons/lightup-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup.res.o: icons/lightup.rc ./puzzles.rc2 icons/lightup.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+lightup5.o: ./lightup.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+lightup2.o: ./lightup.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+list.o: ./list.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopgen.o: ./loopgen.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy-icon.o: icons/loopy-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy.res.o: icons/loopy.rc ./puzzles.rc2 icons/loopy.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+loopy5.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+loopy2.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+magnets.o: ./magnets.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+magnets-icon.o: icons/magnets-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+magnets.res.o: icons/magnets.rc ./puzzles.rc2 icons/magnets.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+magnets5.o: ./magnets.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+magnets2.o: ./magnets.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+malloc.o: ./malloc.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map.o: ./map.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map-icon.o: icons/map-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map.res.o: icons/map.rc ./puzzles.rc2 icons/map.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+map5.o: ./map.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+map2.o: ./map.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+maxflow.o: ./maxflow.c ./maxflow.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+midend.o: ./midend.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines-icon.o: icons/mines-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines.res.o: icons/mines.rc ./puzzles.rc2 icons/mines.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+mines5.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+mines2.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_OBFUSCATOR -c $< -o $@
+misc.o: ./misc.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net.o: ./net.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net-icon.o: icons/net-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net.res.o: icons/net.rc ./puzzles.rc2 icons/net.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+net3.o: ./net.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+netslide.o: ./netslide.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+netslide-icon.o: icons/netslide-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+netslide.res.o: icons/netslide.rc ./puzzles.rc2 icons/netslide.ico \
+               ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+netslid3.o: ./netslide.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+no-icon.o: ./no-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+noicon.res.o: ./noicon.rc ./puzzles.rc2 ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+nullfe.o: ./nullfe.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+nullgame.o: ./nullgame.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+obfusc.o: ./obfusc.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+osx.o: ./osx.m ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisade.o: ./palisade.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisade-icon.o: icons/palisade-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisade.res.o: icons/palisade.rc ./puzzles.rc2 icons/palisade.ico \
+               ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+palisad3.o: ./palisade.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pattern.o: ./pattern.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pattern-icon.o: icons/pattern-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pattern.res.o: icons/pattern.rc ./puzzles.rc2 icons/pattern.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+pattern7.o: ./pattern.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pattern4.o: ./pattern.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_PICTURE_GENERATOR -c $< -o $@
+pattern2.o: ./pattern.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+pearl.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pearl-icon.o: icons/pearl-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pearl.res.o: icons/pearl.rc ./puzzles.rc2 icons/pearl.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+pearl5.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pearl2.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+pegs.o: ./pegs.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pegs-icon.o: icons/pegs-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pegs.res.o: icons/pegs.rc ./puzzles.rc2 icons/pegs.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+pegs3.o: ./pegs.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+penrose.o: ./penrose.c ./puzzles.h ./penrose.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+printing.o: ./printing.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+ps.o: ./ps.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+random.o: ./random.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range.o: ./range.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range-icon.o: icons/range-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range.res.o: icons/range.rc ./puzzles.rc2 icons/range.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+range3.o: ./range.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+rect.o: ./rect.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+rect-icon.o: icons/rect-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+rect.res.o: icons/rect.rc ./puzzles.rc2 icons/rect.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+rect3.o: ./rect.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+samegame.o: ./samegame.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+samegame-icon.o: icons/samegame-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+samegame.res.o: icons/samegame.rc ./puzzles.rc2 icons/samegame.ico \
+               ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+samegam3.o: ./samegame.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+signpost.o: ./signpost.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+signpost-icon.o: icons/signpost-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+signpost.res.o: icons/signpost.rc ./puzzles.rc2 icons/signpost.ico \
+               ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+signpos5.o: ./signpost.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+signpos2.o: ./signpost.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+singles.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+singles-icon.o: icons/singles-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+singles.res.o: icons/singles.rc ./puzzles.rc2 icons/singles.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+singles5.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+singles3.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+sixteen.o: ./sixteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+sixteen-icon.o: icons/sixteen-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+sixteen.res.o: icons/sixteen.rc ./puzzles.rc2 icons/sixteen.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+sixteen3.o: ./sixteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+slant.o: ./slant.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+slant-icon.o: icons/slant-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+slant.res.o: icons/slant.rc ./puzzles.rc2 icons/slant.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+slant5.o: ./slant.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+slant2.o: ./slant.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+solo.o: ./solo.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+solo-icon.o: icons/solo-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+solo.res.o: icons/solo.rc ./puzzles.rc2 icons/solo.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+solo5.o: ./solo.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+solo2.o: ./solo.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+tdq.o: ./tdq.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents-icon.o: icons/tents-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents.res.o: icons/tents.rc ./puzzles.rc2 icons/tents.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+tents5.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+tents3.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+towers.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+towers-icon.o: icons/towers-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+towers.res.o: icons/towers.rc ./puzzles.rc2 icons/towers.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+towers5.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+towers2.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+tracks.o: ./tracks.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tracks-icon.o: icons/tracks-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tracks.res.o: icons/tracks.rc ./puzzles.rc2 icons/tracks.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+tracks3.o: ./tracks.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+tree234.o: ./tree234.c ./tree234.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle.o: ./twiddle.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle-icon.o: icons/twiddle-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle.res.o: icons/twiddle.rc ./puzzles.rc2 icons/twiddle.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+twiddle3.o: ./twiddle.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+undead.o: ./undead.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+undead-icon.o: icons/undead-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+undead.res.o: icons/undead.rc ./puzzles.rc2 icons/undead.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+undead3.o: ./undead.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unequal.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unequal-icon.o: icons/unequal-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unequal.res.o: icons/unequal.rc ./puzzles.rc2 icons/unequal.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+unequal5.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unequal2.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+unruly.o: ./unruly.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unruly-icon.o: icons/unruly-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unruly.res.o: icons/unruly.rc ./puzzles.rc2 icons/unruly.ico ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+unruly5.o: ./unruly.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unruly2.o: ./unruly.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+untangle.o: ./untangle.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+untangle-icon.o: icons/untangle-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+untangle.res.o: icons/untangle.rc ./puzzles.rc2 icons/untangle.ico \
+               ./resource.h
+       $(RC) $(FWHACK) $(RCFL) $(RCFLAGS) $< $@
+untangl3.o: ./untangle.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+version.o: ./version.c ./version.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+windows.o: ./windows.c ./puzzles.h ./resource.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+windows1.o: ./windows.c ./puzzles.h ./resource.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+
+
+clean:
+       rm -f *.o *.exe *.res.o *.map
+
index 0fd28db5ed51100bf2cbba3e65519dc91c13310e..00436a56ab6b3f4ef60ecee7a233182541e2d8a3 100644 (file)
@@ -1,17 +1,89 @@
-all: puzzles.chm puzzles.hlp puzzles.txt HACKING
+all: puzzles.hlp puzzles.txt HACKING
 
 preprocessed.but: puzzles.but
        sed 's/PREFIX-/$(BINPREFIX)/g' puzzles.but > preprocessed.but
 
-puzzles.chm: preprocessed.but
-       halibut --chm=puzzles.chm preprocessed.but
-puzzles.hlp: preprocessed.but
-       halibut --winhelp=puzzles.hlp preprocessed.but
-puzzles.txt: preprocessed.but
-       halibut --text=puzzles.txt preprocessed.but
+puzzles.hlp puzzles.txt: preprocessed.but
+       halibut --winhelp=puzzles.hlp --text=puzzles.txt preprocessed.but
 
 HACKING: devel.but
        halibut --text=HACKING devel.but
 
+chm: puzzles.hhp
+puzzles.hhp: puzzles.but chm.but
+       halibut --html puzzles.but chm.but
+
+TRANSLATIONS := $(patsubst po/%.po,%,$(wildcard po/*.po))
+LANGUAGES := en $(TRANSLATIONS)
+
+update-po:
+# Please tell me there is an easier way to preserve the POT file header.
+       test -f po/puzzles-doc.pot
+       po4a-gettextize -f halibut -m puzzles.but --package-name puzzles \
+               -p po/puzzles-doc.tmp1.pot
+       awk -F: '{ print ""; \
+                  print "#: " $$1 ".R"; \
+                  print "msgid \"" $$4 "\""; \
+                  print "msgstr \"\""; }' \
+               < gamedesc.txt >> po/puzzles-doc.tmp1.pot
+       xgettext -j -cTranslator: --package-name puzzles \
+               -o po/puzzles-doc.tmp1.pot mkmanpages.pl
+       sed -i '1,/^#$$/d' po/puzzles-doc.tmp1.pot
+       cat po/puzzles-doc.pot.head po/puzzles-doc.tmp1.pot \
+               > po/puzzles-doc.tmp2.pot
+       diff -q -I Project-Id-Version: -I POT-Creation-Date: \
+               po/puzzles-doc.pot po/puzzles-doc.tmp2.pot || \
+               mv po/puzzles-doc.tmp2.pot po/puzzles-doc.pot
+       rm -f po/puzzles-doc.tmp*.pot
+       for lang in $(TRANSLATIONS); do \
+               msgmerge --previous -U po/$$lang.po po/puzzles-doc.pot || exit; \
+       done
+.PHONY: update-po
+
+doc/puzzles.but.%: puzzles.but po/%.po
+       mkdir -p doc
+       po4a-translate -k 0 -f halibut -m puzzles.but -p po/$*.po -l $@
+.PRECIOUS: $(addprefix doc/puzzles.but.,$(TRANSLATIONS))
+
+doc/preprocessed.but.%: doc/puzzles.but.%
+       sed 's/PREFIX-/$(BINPREFIX)/g' $< > $@
+
+doc/puzzles.txt.%: doc/preprocessed.but.%
+       halibut --text=$@ --input-charset=UTF-8 $<
+all: $(addprefix doc/puzzles.txt.,$(TRANSLATIONS))
+
+doc/man-en-stamp: preprocessed.but
+       mkdir -p doc
+       rm -rf doc/man-en
+       mkdir doc/man-en
+       perl mkmanpages.pl en
+       touch $@
+doc/man-%-stamp: doc/preprocessed.but.%
+       mkdir -p doc
+       rm -rf doc/man-$*
+       mkdir doc/man-$*
+       perl mkmanpages.pl $*
+       touch $@
+man: $(patsubst %,doc/man-%-stamp,$(LANGUAGES))
+
+doc/html-en-stamp: preprocessed.but
+       mkdir -p doc
+       rm -rf doc/html-en
+       mkdir doc/html-en
+       cd doc/html-en && halibut --html ../../preprocessed.but
+       touch $@
+doc/html-%-stamp: doc/preprocessed.but.%
+       mkdir -p doc
+       rm -rf doc/html-$*
+       mkdir doc/html-$*
+       cd doc/html-$* && halibut --html --input-charset=UTF-8 ../preprocessed.but.$*
+       touch $@
+html: $(patsubst %,doc/html-%-stamp,$(LANGUAGES))
+
+.PHONY: man html
+all: man html
+
 clean:
        rm -f puzzles.hlp puzzles.txt preprocessed.but HACKING *.html *.hh[pck]
+       rm -f puzzles.cnt
+       rm -rf doc
diff --git a/Makefile.emcc b/Makefile.emcc
new file mode 100644 (file)
index 0000000..f248c85
--- /dev/null
@@ -0,0 +1,576 @@
+# Makefile for puzzles using Emscripten. Requires GNU make.
+#
+# This file was created by `mkfiles.pl' from the `Recipe' file.
+# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.
+
+# This can be set on the command line to point at the emcc command,
+# if it is not on your PATH.
+EMCC = emcc
+
+CFLAGS = -DSLOW_SYSTEM -I./ -Iicons/
+
+all: $(OUTPREFIX)blackbox.js $(OUTPREFIX)bridges.js $(OUTPREFIX)cube.js \
+               $(OUTPREFIX)dominosa.js $(OUTPREFIX)fifteen.js \
+               $(OUTPREFIX)filling.js $(OUTPREFIX)flip.js \
+               $(OUTPREFIX)flood.js $(OUTPREFIX)galaxies.js \
+               $(OUTPREFIX)guess.js $(OUTPREFIX)inertia.js \
+               $(OUTPREFIX)keen.js $(OUTPREFIX)lightup.js \
+               $(OUTPREFIX)loopy.js $(OUTPREFIX)magnets.js \
+               $(OUTPREFIX)map.js $(OUTPREFIX)mines.js $(OUTPREFIX)net.js \
+               $(OUTPREFIX)netslide.js $(OUTPREFIX)nullgame.js \
+               $(OUTPREFIX)palisade.js $(OUTPREFIX)pattern.js \
+               $(OUTPREFIX)pearl.js $(OUTPREFIX)pegs.js \
+               $(OUTPREFIX)range.js $(OUTPREFIX)rect.js \
+               $(OUTPREFIX)samegame.js $(OUTPREFIX)signpost.js \
+               $(OUTPREFIX)singles.js $(OUTPREFIX)sixteen.js \
+               $(OUTPREFIX)slant.js $(OUTPREFIX)solo.js \
+               $(OUTPREFIX)tents.js $(OUTPREFIX)towers.js \
+               $(OUTPREFIX)tracks.js $(OUTPREFIX)twiddle.js \
+               $(OUTPREFIX)undead.js $(OUTPREFIX)unequal.js \
+               $(OUTPREFIX)unruly.js $(OUTPREFIX)untangle.js
+
+$(OUTPREFIX)blackbox.js: blackbox.o blackbox-icon.o drawing.o emcc.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o \
+               emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)blackbox.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" blackbox.o blackbox-icon.o drawing.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)bridges.js: bridges.o bridges-icon.o drawing.o dsf.o findloop.o \
+               emcc.o malloc.o midend.o misc.o printing.o ps.o random.o \
+               version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)bridges.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" bridges.o bridges-icon.o drawing.o dsf.o findloop.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)cube.js: cube.o cube-icon.o drawing.o emcc.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o version.o emccpre.js \
+               emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)cube.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" cube.o cube-icon.o drawing.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)dominosa.js: dominosa.o dominosa-icon.o drawing.o emcc.o \
+               laydomino.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)dominosa.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" dominosa.o dominosa-icon.o drawing.o emcc.o laydomino.o malloc.o midend.o misc.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)fifteen.js: drawing.o fifteen.o fifteen-icon.o emcc.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o \
+               emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)fifteen.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o fifteen.o fifteen-icon.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)filling.js: drawing.o dsf.o filling.o filling-icon.o emcc.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o \
+               emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)filling.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o dsf.o filling.o filling-icon.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)flip.js: drawing.o flip.o flip-icon.o emcc.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o tree234.o version.o \
+               emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)flip.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o flip.o flip-icon.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o tree234.o version.o
+
+$(OUTPREFIX)flood.js: drawing.o flood.o flood-icon.o emcc.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o \
+               emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)flood.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o flood.o flood-icon.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)galaxies.js: drawing.o dsf.o galaxies.o galaxies-icon.o emcc.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o \
+               emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)galaxies.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o dsf.o galaxies.o galaxies-icon.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)guess.js: drawing.o emcc.o guess.o guess-icon.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o \
+               emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)guess.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o guess.o guess-icon.o malloc.o midend.o misc.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)inertia.js: drawing.o emcc.o inertia.o inertia-icon.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o \
+               emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)inertia.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o inertia.o inertia-icon.o malloc.o midend.o misc.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)keen.js: drawing.o dsf.o emcc.o keen.o keen-icon.o latin.o \
+               malloc.o maxflow.o midend.o misc.o printing.o ps.o random.o \
+               tree234.o version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)keen.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o dsf.o emcc.o keen.o keen-icon.o latin.o malloc.o maxflow.o midend.o misc.o printing.o ps.o random.o tree234.o version.o
+
+$(OUTPREFIX)lightup.js: combi.o drawing.o emcc.o lightup.o lightup-icon.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o \
+               emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)lightup.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" combi.o drawing.o emcc.o lightup.o lightup-icon.o malloc.o midend.o misc.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)loopy.js: drawing.o dsf.o grid.o emcc.o loopgen.o loopy.o \
+               loopy-icon.o malloc.o midend.o misc.o penrose.o printing.o \
+               ps.o random.o tree234.o version.o emccpre.js emcclib.js \
+               emccx.json
+       $(EMCC) -o $(OUTPREFIX)loopy.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o dsf.o grid.o emcc.o loopgen.o loopy.o loopy-icon.o malloc.o midend.o misc.o penrose.o printing.o ps.o random.o tree234.o version.o
+
+$(OUTPREFIX)magnets.js: drawing.o emcc.o laydomino.o magnets.o \
+               magnets-icon.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)magnets.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o laydomino.o magnets.o magnets-icon.o malloc.o midend.o misc.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)map.js: drawing.o dsf.o emcc.o malloc.o map.o map-icon.o \
+               midend.o misc.o printing.o ps.o random.o version.o \
+               emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)map.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o dsf.o emcc.o malloc.o map.o map-icon.o midend.o misc.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)mines.js: drawing.o emcc.o malloc.o midend.o mines.o \
+               mines-icon.o misc.o printing.o ps.o random.o tree234.o \
+               version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)mines.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o malloc.o midend.o mines.o mines-icon.o misc.o printing.o ps.o random.o tree234.o version.o
+
+$(OUTPREFIX)net.js: drawing.o dsf.o findloop.o emcc.o malloc.o midend.o \
+               misc.o net.o net-icon.o printing.o ps.o random.o tree234.o \
+               version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)net.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o dsf.o findloop.o emcc.o malloc.o midend.o misc.o net.o net-icon.o printing.o ps.o random.o tree234.o version.o
+
+$(OUTPREFIX)netslide.js: drawing.o emcc.o malloc.o midend.o misc.o \
+               netslide.o netslide-icon.o printing.o ps.o random.o \
+               tree234.o version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)netslide.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o malloc.o midend.o misc.o netslide.o netslide-icon.o printing.o ps.o random.o tree234.o version.o
+
+$(OUTPREFIX)nullgame.js: drawing.o emcc.o malloc.o midend.o misc.o no-icon.o \
+               nullgame.o printing.o ps.o random.o version.o emccpre.js \
+               emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)nullgame.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o malloc.o midend.o misc.o no-icon.o nullgame.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)palisade.js: divvy.o drawing.o dsf.o emcc.o malloc.o midend.o \
+               misc.o palisade.o palisade-icon.o printing.o ps.o random.o \
+               version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)palisade.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" divvy.o drawing.o dsf.o emcc.o malloc.o midend.o misc.o palisade.o palisade-icon.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)pattern.js: drawing.o emcc.o malloc.o midend.o misc.o pattern.o \
+               pattern-icon.o printing.o ps.o random.o version.o emccpre.js \
+               emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)pattern.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o malloc.o midend.o misc.o pattern.o pattern-icon.o printing.o ps.o random.o version.o
+
+$(OUTPREFIX)pearl.js: drawing.o dsf.o grid.o emcc.o loopgen.o malloc.o \
+               midend.o misc.o pearl.o pearl-icon.o penrose.o printing.o \
+               ps.o random.o tdq.o tree234.o version.o emccpre.js \
+               emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)pearl.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o dsf.o grid.o emcc.o loopgen.o malloc.o midend.o misc.o pearl.o pearl-icon.o penrose.o printing.o ps.o random.o tdq.o tree234.o version.o
+
+$(OUTPREFIX)pegs.js: drawing.o emcc.o malloc.o midend.o misc.o pegs.o \
+               pegs-icon.o printing.o ps.o random.o tree234.o version.o \
+               emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)pegs.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o malloc.o midend.o misc.o pegs.o pegs-icon.o printing.o ps.o random.o tree234.o version.o
+
+$(OUTPREFIX)range.js: drawing.o dsf.o emcc.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o range.o range-icon.o version.o \
+               emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)range.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o dsf.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o range.o range-icon.o version.o
+
+$(OUTPREFIX)rect.js: drawing.o emcc.o malloc.o midend.o misc.o printing.o \
+               ps.o random.o rect.o rect-icon.o version.o emccpre.js \
+               emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)rect.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o rect.o rect-icon.o version.o
+
+$(OUTPREFIX)samegame.js: drawing.o emcc.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o samegame.o samegame-icon.o \
+               version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)samegame.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o samegame.o samegame-icon.o version.o
+
+$(OUTPREFIX)signpost.js: drawing.o dsf.o emcc.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o signpost.o signpost-icon.o \
+               version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)signpost.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o dsf.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o signpost.o signpost-icon.o version.o
+
+$(OUTPREFIX)singles.js: drawing.o dsf.o emcc.o latin.o malloc.o maxflow.o \
+               midend.o misc.o printing.o ps.o random.o singles.o \
+               singles-icon.o tree234.o version.o emccpre.js emcclib.js \
+               emccx.json
+       $(EMCC) -o $(OUTPREFIX)singles.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o dsf.o emcc.o latin.o malloc.o maxflow.o midend.o misc.o printing.o ps.o random.o singles.o singles-icon.o tree234.o version.o
+
+$(OUTPREFIX)sixteen.js: drawing.o emcc.o malloc.o midend.o misc.o printing.o \
+               ps.o random.o sixteen.o sixteen-icon.o version.o emccpre.js \
+               emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)sixteen.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o sixteen.o sixteen-icon.o version.o
+
+$(OUTPREFIX)slant.js: drawing.o dsf.o findloop.o emcc.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o slant.o slant-icon.o \
+               version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)slant.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o dsf.o findloop.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o slant.o slant-icon.o version.o
+
+$(OUTPREFIX)solo.js: divvy.o drawing.o dsf.o emcc.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o solo.o solo-icon.o version.o \
+               emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)solo.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" divvy.o drawing.o dsf.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o solo.o solo-icon.o version.o
+
+$(OUTPREFIX)tents.js: drawing.o dsf.o emcc.o malloc.o maxflow.o midend.o \
+               misc.o printing.o ps.o random.o tents.o tents-icon.o \
+               version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)tents.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o dsf.o emcc.o malloc.o maxflow.o midend.o misc.o printing.o ps.o random.o tents.o tents-icon.o version.o
+
+$(OUTPREFIX)towers.js: drawing.o emcc.o latin.o malloc.o maxflow.o midend.o \
+               misc.o printing.o ps.o random.o towers.o towers-icon.o \
+               tree234.o version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)towers.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o latin.o malloc.o maxflow.o midend.o misc.o printing.o ps.o random.o towers.o towers-icon.o tree234.o version.o
+
+$(OUTPREFIX)tracks.js: drawing.o dsf.o findloop.o emcc.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o tracks.o tracks-icon.o \
+               version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)tracks.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o dsf.o findloop.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o tracks.o tracks-icon.o version.o
+
+$(OUTPREFIX)twiddle.js: drawing.o emcc.o malloc.o midend.o misc.o printing.o \
+               ps.o random.o twiddle.o twiddle-icon.o version.o emccpre.js \
+               emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)twiddle.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o twiddle.o twiddle-icon.o version.o
+
+$(OUTPREFIX)undead.js: drawing.o emcc.o malloc.o midend.o misc.o printing.o \
+               ps.o random.o undead.o undead-icon.o version.o emccpre.js \
+               emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)undead.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o undead.o undead-icon.o version.o
+
+$(OUTPREFIX)unequal.js: drawing.o emcc.o latin.o malloc.o maxflow.o midend.o \
+               misc.o printing.o ps.o random.o tree234.o unequal.o \
+               unequal-icon.o version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)unequal.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o latin.o malloc.o maxflow.o midend.o misc.o printing.o ps.o random.o tree234.o unequal.o unequal-icon.o version.o
+
+$(OUTPREFIX)unruly.js: drawing.o emcc.o malloc.o midend.o misc.o printing.o \
+               ps.o random.o unruly.o unruly-icon.o version.o emccpre.js \
+               emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)unruly.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o unruly.o unruly-icon.o version.o
+
+$(OUTPREFIX)untangle.js: drawing.o emcc.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o tree234.o untangle.o \
+               untangle-icon.o version.o emccpre.js emcclib.js emccx.json
+       $(EMCC) -o $(OUTPREFIX)untangle.js -O2 -s ASM_JS=1 --pre-js emccpre.js --js-library emcclib.js -s EXPORTED_FUNCTIONS="`sed 's://.*::' emccx.json | tr -d ' \n'`" drawing.o emcc.o malloc.o midend.o misc.o printing.o ps.o random.o tree234.o untangle.o untangle-icon.o version.o
+
+blackbox.o: ./blackbox.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+blackbox-icon.o: icons/blackbox-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+blackbo3.o: ./blackbox.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+bridges.o: ./bridges.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+bridges-icon.o: icons/bridges-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+bridges3.o: ./bridges.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+combi.o: ./combi.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube.o: ./cube.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube-icon.o: icons/cube-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube3.o: ./cube.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+divvy.o: ./divvy.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominosa.o: ./dominosa.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominosa-icon.o: icons/dominosa-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominos3.o: ./dominosa.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+drawing.o: ./drawing.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dsf.o: ./dsf.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen.o: ./fifteen.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen-icon.o: icons/fifteen-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen5.o: ./fifteen.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+fifteen2.o: ./fifteen.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+filling.o: ./filling.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+filling-icon.o: icons/filling-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+filling5.o: ./filling.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+filling2.o: ./filling.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+findloop.o: ./findloop.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip.o: ./flip.c ./puzzles.h ./tree234.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip-icon.o: icons/flip-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip3.o: ./flip.c ./puzzles.h ./tree234.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+flood.o: ./flood.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flood-icon.o: icons/flood-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flood3.o: ./flood.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+galaxies.o: ./galaxies.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+galaxies-icon.o: icons/galaxies-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+galaxie7.o: ./galaxies.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+galaxie4.o: ./galaxies.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_PICTURE_GENERATOR -c $< -o $@
+galaxie2.o: ./galaxies.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+grid.o: ./grid.c ./puzzles.h ./tree234.h ./grid.h ./penrose.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+emcc.o: ./emcc.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess.o: ./guess.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess-icon.o: icons/guess-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess3.o: ./guess.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+inertia.o: ./inertia.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+inertia-icon.o: icons/inertia-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+inertia3.o: ./inertia.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+keen.o: ./keen.c ./puzzles.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+keen-icon.o: icons/keen-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+keen5.o: ./keen.c ./puzzles.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+keen2.o: ./keen.c ./puzzles.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+latin.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+latin8.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_LATIN_TEST -c $< -o $@
+latin6.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+laydomino.o: ./laydomino.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup.o: ./lightup.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup-icon.o: icons/lightup-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup5.o: ./lightup.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+lightup2.o: ./lightup.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+list.o: ./list.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopgen.o: ./loopgen.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy-icon.o: icons/loopy-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy5.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+loopy2.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+magnets.o: ./magnets.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+magnets-icon.o: icons/magnets-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+magnets5.o: ./magnets.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+magnets2.o: ./magnets.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+malloc.o: ./malloc.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map.o: ./map.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map-icon.o: icons/map-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map5.o: ./map.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+map2.o: ./map.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+maxflow.o: ./maxflow.c ./maxflow.h ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+midend.o: ./midend.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines.o: ./mines.c ./tree234.h ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines-icon.o: icons/mines-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines5.o: ./mines.c ./tree234.h ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+mines2.o: ./mines.c ./tree234.h ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_OBFUSCATOR -c $< -o $@
+misc.o: ./misc.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net.o: ./net.c ./puzzles.h ./tree234.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net-icon.o: icons/net-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net3.o: ./net.c ./puzzles.h ./tree234.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+netslide.o: ./netslide.c ./puzzles.h ./tree234.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+netslide-icon.o: icons/netslide-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+netslid3.o: ./netslide.c ./puzzles.h ./tree234.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+no-icon.o: ./no-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+nullfe.o: ./nullfe.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+nullgame.o: ./nullgame.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+obfusc.o: ./obfusc.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+osx.o: ./osx.m ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisade.o: ./palisade.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisade-icon.o: icons/palisade-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisad3.o: ./palisade.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pattern.o: ./pattern.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pattern-icon.o: icons/pattern-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pattern7.o: ./pattern.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pattern4.o: ./pattern.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_PICTURE_GENERATOR -c $< -o $@
+pattern2.o: ./pattern.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+pearl.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pearl-icon.o: icons/pearl-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pearl5.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pearl2.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+pegs.o: ./pegs.c ./puzzles.h ./tree234.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pegs-icon.o: icons/pegs-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pegs3.o: ./pegs.c ./puzzles.h ./tree234.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+penrose.o: ./penrose.c ./puzzles.h ./penrose.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+printing.o: ./printing.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+ps.o: ./ps.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+random.o: ./random.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range.o: ./range.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range-icon.o: icons/range-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range3.o: ./range.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+rect.o: ./rect.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+rect-icon.o: icons/rect-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+rect3.o: ./rect.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+samegame.o: ./samegame.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+samegame-icon.o: icons/samegame-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+samegam3.o: ./samegame.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+signpost.o: ./signpost.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+signpost-icon.o: icons/signpost-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+signpos5.o: ./signpost.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+signpos2.o: ./signpost.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+singles.o: ./singles.c ./puzzles.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+singles-icon.o: icons/singles-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+singles5.o: ./singles.c ./puzzles.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+singles3.o: ./singles.c ./puzzles.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+sixteen.o: ./sixteen.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+sixteen-icon.o: icons/sixteen-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+sixteen3.o: ./sixteen.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+slant.o: ./slant.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+slant-icon.o: icons/slant-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+slant5.o: ./slant.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+slant2.o: ./slant.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+solo.o: ./solo.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+solo-icon.o: icons/solo-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+solo5.o: ./solo.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+solo2.o: ./solo.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+tdq.o: ./tdq.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents-icon.o: icons/tents-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents5.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+tents3.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+towers.o: ./towers.c ./puzzles.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+towers-icon.o: icons/towers-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+towers5.o: ./towers.c ./puzzles.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+towers2.o: ./towers.c ./puzzles.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+tracks.o: ./tracks.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tracks-icon.o: icons/tracks-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tracks3.o: ./tracks.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+tree234.o: ./tree234.c ./tree234.h ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle.o: ./twiddle.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle-icon.o: icons/twiddle-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle3.o: ./twiddle.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+undead.o: ./undead.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+undead-icon.o: icons/undead-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+undead3.o: ./undead.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unequal.o: ./unequal.c ./puzzles.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unequal-icon.o: icons/unequal-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unequal5.o: ./unequal.c ./puzzles.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unequal2.o: ./unequal.c ./puzzles.h ./latin.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+unruly.o: ./unruly.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unruly-icon.o: icons/unruly-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unruly5.o: ./unruly.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unruly2.o: ./unruly.c ./puzzles.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+untangle.o: ./untangle.c ./puzzles.h ./tree234.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+untangle-icon.o: icons/untangle-icon.c
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+untangl3.o: ./untangle.c ./puzzles.h ./tree234.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+version.o: ./version.c ./version.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+windows.o: ./windows.c ./puzzles.h ./resource.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -c $< -o $@
+windows1.o: ./windows.c ./puzzles.h ./resource.h
+       $(EMCC) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+
+
+clean:
+       rm -rf *.o  $(OUTPREFIX)blackbox.js $(OUTPREFIX)bridges.js $(OUTPREFIX)cube.js $(OUTPREFIX)dominosa.js $(OUTPREFIX)fifteen.js $(OUTPREFIX)filling.js $(OUTPREFIX)flip.js $(OUTPREFIX)flood.js $(OUTPREFIX)galaxies.js $(OUTPREFIX)guess.js $(OUTPREFIX)inertia.js $(OUTPREFIX)keen.js $(OUTPREFIX)lightup.js $(OUTPREFIX)loopy.js $(OUTPREFIX)magnets.js $(OUTPREFIX)map.js $(OUTPREFIX)mines.js $(OUTPREFIX)net.js $(OUTPREFIX)netslide.js $(OUTPREFIX)nullgame.js $(OUTPREFIX)palisade.js $(OUTPREFIX)pattern.js $(OUTPREFIX)pearl.js $(OUTPREFIX)pegs.js $(OUTPREFIX)range.js $(OUTPREFIX)rect.js $(OUTPREFIX)samegame.js $(OUTPREFIX)signpost.js $(OUTPREFIX)singles.js $(OUTPREFIX)sixteen.js $(OUTPREFIX)slant.js $(OUTPREFIX)solo.js $(OUTPREFIX)tents.js $(OUTPREFIX)towers.js $(OUTPREFIX)tracks.js $(OUTPREFIX)twiddle.js $(OUTPREFIX)undead.js $(OUTPREFIX)unequal.js $(OUTPREFIX)unruly.js $(OUTPREFIX)untangle.js
diff --git a/Makefile.gnustep b/Makefile.gnustep
new file mode 100644 (file)
index 0000000..0ab2548
--- /dev/null
@@ -0,0 +1,490 @@
+# Makefile for puzzles under GNUstep.
+#
+# This file was created by `mkfiles.pl' from the `Recipe' file.
+# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.
+NEEDS_GUI=yes
+include $(GNUSTEP_MAKEFILES)/common.make
+include $(GNUSTEP_MAKEFILES)/rules.make
+include $(GNUSTEP_MAKEFILES)/Instance/rules.make
+
+all:: Puzzles fifteensolver fillingsolver galaxiespicture galaxiessolver \
+               keensolver latincheck lightupsolver loopysolver \
+               magnetssolver mapsolver mineobfusc obfusc patternpicture \
+               patternsolver pearlbench signpostsolver singlessolver \
+               slantsolver solosolver tentssolver towerssolver \
+               unequalsolver unrulysolver
+
+.SUFFIXES: .o .c .m
+
+
+
+Puzzles.app:
+       mkdir -p $@
+Puzzles.app/Resources: Puzzles.app
+       mkdir -p $@
+Puzzles.app/Resources/Puzzles.icns: Puzzles.app/Resources osx.icns
+       cp osx.icns $@
+Puzzles.app/Info.plist: Puzzles.app osx-info.plist
+       cp osx-info.plist $@
+Puzzles: Puzzles.app Puzzles.app/Puzzles \
+               Puzzles.app/Resources/Puzzles.icns Puzzles.app/Info.plist \
+               $(Puzzles_extra)
+
+Puzzles.app/Puzzles: blackbo3.o bridges3.o combi.o cube3.o divvy.o \
+               dominos3.o drawing.o dsf.o fifteen5.o filling5.o findloop.o \
+               flip3.o flood3.o galaxie7.o grid.o guess3.o inertia3.o \
+               keen5.o latin.o laydomino.o lightup5.o list.o loopgen.o \
+               loopy5.o magnets5.o malloc.o map5.o maxflow.o midend.o \
+               mines5.o misc.o net3.o netslid3.o osx.o palisad3.o \
+               pattern7.o pearl5.o pegs3.o penrose.o random.o range3.o \
+               rect3.o samegam3.o signpos5.o singles5.o sixteen3.o slant5.o \
+               solo5.o tdq.o tents5.o towers5.o tracks3.o tree234.o \
+               twiddle3.o undead3.o unequal5.o unruly5.o untangl3.o \
+               version.o
+       $(CC) $(ALL_LDFLAGS) -o $@ blackbo3.o bridges3.o combi.o cube3.o \
+               divvy.o dominos3.o drawing.o dsf.o fifteen5.o filling5.o \
+               findloop.o flip3.o flood3.o galaxie7.o grid.o guess3.o \
+               inertia3.o keen5.o latin.o laydomino.o lightup5.o list.o \
+               loopgen.o loopy5.o magnets5.o malloc.o map5.o maxflow.o \
+               midend.o mines5.o misc.o net3.o netslid3.o osx.o palisad3.o \
+               pattern7.o pearl5.o pegs3.o penrose.o random.o range3.o \
+               rect3.o samegam3.o signpos5.o singles5.o sixteen3.o slant5.o \
+               solo5.o tdq.o tents5.o towers5.o tracks3.o tree234.o \
+               twiddle3.o undead3.o unequal5.o unruly5.o untangl3.o \
+               version.o $(ALL_LIB_DIRS)  $(ALL_LIBS)
+
+fifteensolver: fifteen2.o malloc.o misc.o nullfe.o random.o
+       $(CC) $(ULDFLAGS) -o $@ fifteen2.o malloc.o misc.o nullfe.o random.o
+
+fillingsolver: dsf.o filling2.o malloc.o misc.o nullfe.o random.o
+       $(CC) $(ULDFLAGS) -o $@ dsf.o filling2.o malloc.o misc.o nullfe.o \
+               random.o 
+
+galaxiespicture: dsf.o galaxie4.o malloc.o misc.o nullfe.o random.o
+       $(CC) $(ULDFLAGS) -o $@ dsf.o galaxie4.o malloc.o misc.o nullfe.o \
+               random.o -lm
+
+galaxiessolver: dsf.o galaxie2.o malloc.o misc.o nullfe.o random.o
+       $(CC) $(ULDFLAGS) -o $@ dsf.o galaxie2.o malloc.o misc.o nullfe.o \
+               random.o -lm
+
+keensolver: dsf.o keen2.o latin6.o malloc.o maxflow.o misc.o nullfe.o \
+               random.o tree234.o
+       $(CC) $(ULDFLAGS) -o $@ dsf.o keen2.o latin6.o malloc.o maxflow.o \
+               misc.o nullfe.o random.o tree234.o 
+
+latincheck: latin8.o malloc.o maxflow.o misc.o nullfe.o random.o tree234.o
+       $(CC) $(ULDFLAGS) -o $@ latin8.o malloc.o maxflow.o misc.o nullfe.o \
+               random.o tree234.o 
+
+lightupsolver: combi.o lightup2.o malloc.o misc.o nullfe.o random.o
+       $(CC) $(ULDFLAGS) -o $@ combi.o lightup2.o malloc.o misc.o nullfe.o \
+               random.o 
+
+loopysolver: dsf.o grid.o loopgen.o loopy2.o malloc.o misc.o nullfe.o \
+               penrose.o random.o tree234.o
+       $(CC) $(ULDFLAGS) -o $@ dsf.o grid.o loopgen.o loopy2.o malloc.o \
+               misc.o nullfe.o penrose.o random.o tree234.o -lm
+
+magnetssolver: laydomino.o magnets2.o malloc.o misc.o nullfe.o random.o
+       $(CC) $(ULDFLAGS) -o $@ laydomino.o magnets2.o malloc.o misc.o \
+               nullfe.o random.o -lm
+
+mapsolver: dsf.o malloc.o map2.o misc.o nullfe.o random.o
+       $(CC) $(ULDFLAGS) -o $@ dsf.o malloc.o map2.o misc.o nullfe.o \
+               random.o -lm
+
+mineobfusc: malloc.o mines2.o misc.o nullfe.o random.o tree234.o
+       $(CC) $(ULDFLAGS) -o $@ malloc.o mines2.o misc.o nullfe.o random.o \
+               tree234.o 
+
+obfusc: malloc.o misc.o nullfe.o obfusc.o random.o
+       $(CC) $(ULDFLAGS) -o $@ malloc.o misc.o nullfe.o obfusc.o random.o 
+
+patternpicture: malloc.o misc.o nullfe.o pattern4.o random.o
+       $(CC) $(ULDFLAGS) -o $@ malloc.o misc.o nullfe.o pattern4.o random.o
+
+patternsolver: malloc.o misc.o nullfe.o pattern2.o random.o
+       $(CC) $(ULDFLAGS) -o $@ malloc.o misc.o nullfe.o pattern2.o random.o
+
+pearlbench: dsf.o grid.o loopgen.o malloc.o misc.o nullfe.o pearl2.o \
+               penrose.o random.o tdq.o tree234.o
+       $(CC) $(ULDFLAGS) -o $@ dsf.o grid.o loopgen.o malloc.o misc.o \
+               nullfe.o pearl2.o penrose.o random.o tdq.o tree234.o -lm
+
+signpostsolver: dsf.o malloc.o misc.o nullfe.o random.o signpos2.o
+       $(CC) $(ULDFLAGS) -o $@ dsf.o malloc.o misc.o nullfe.o random.o \
+               signpos2.o -lm
+
+singlessolver: dsf.o latin.o malloc.o maxflow.o misc.o nullfe.o random.o \
+               singles3.o tree234.o
+       $(CC) $(ULDFLAGS) -o $@ dsf.o latin.o malloc.o maxflow.o misc.o \
+               nullfe.o random.o singles3.o tree234.o 
+
+slantsolver: dsf.o findloop.o malloc.o misc.o nullfe.o random.o slant2.o
+       $(CC) $(ULDFLAGS) -o $@ dsf.o findloop.o malloc.o misc.o nullfe.o \
+               random.o slant2.o 
+
+solosolver: divvy.o dsf.o malloc.o misc.o nullfe.o random.o solo2.o
+       $(CC) $(ULDFLAGS) -o $@ divvy.o dsf.o malloc.o misc.o nullfe.o \
+               random.o solo2.o 
+
+tentssolver: dsf.o malloc.o maxflow.o misc.o nullfe.o random.o tents3.o
+       $(CC) $(ULDFLAGS) -o $@ dsf.o malloc.o maxflow.o misc.o nullfe.o \
+               random.o tents3.o 
+
+towerssolver: latin6.o malloc.o maxflow.o misc.o nullfe.o random.o towers2.o \
+               tree234.o
+       $(CC) $(ULDFLAGS) -o $@ latin6.o malloc.o maxflow.o misc.o nullfe.o \
+               random.o towers2.o tree234.o 
+
+unequalsolver: latin6.o malloc.o maxflow.o misc.o nullfe.o random.o \
+               tree234.o unequal2.o
+       $(CC) $(ULDFLAGS) -o $@ latin6.o malloc.o maxflow.o misc.o nullfe.o \
+               random.o tree234.o unequal2.o 
+
+unrulysolver: malloc.o misc.o nullfe.o random.o unruly2.o
+       $(CC) $(ULDFLAGS) -o $@ malloc.o misc.o nullfe.o random.o unruly2.o 
+
+blackbox.o: ./blackbox.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+blackbox-icon.o: icons/blackbox-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+blackbo3.o: ./blackbox.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+bridges.o: ./bridges.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+bridges-icon.o: icons/bridges-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+bridges3.o: ./bridges.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+combi.o: ./combi.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube.o: ./cube.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube-icon.o: icons/cube-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube3.o: ./cube.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+divvy.o: ./divvy.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominosa.o: ./dominosa.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominosa-icon.o: icons/dominosa-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominos3.o: ./dominosa.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+drawing.o: ./drawing.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dsf.o: ./dsf.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen.o: ./fifteen.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen-icon.o: icons/fifteen-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen5.o: ./fifteen.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+fifteen2.o: ./fifteen.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+filling.o: ./filling.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+filling-icon.o: icons/filling-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+filling5.o: ./filling.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+filling2.o: ./filling.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+findloop.o: ./findloop.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip.o: ./flip.c ./puzzles.h ./tree234.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip-icon.o: icons/flip-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip3.o: ./flip.c ./puzzles.h ./tree234.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+flood.o: ./flood.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flood-icon.o: icons/flood-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flood3.o: ./flood.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+galaxies.o: ./galaxies.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+galaxies-icon.o: icons/galaxies-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+galaxie7.o: ./galaxies.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+galaxie4.o: ./galaxies.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_PICTURE_GENERATOR -c $< -o $@
+galaxie2.o: ./galaxies.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+grid.o: ./grid.c ./puzzles.h ./tree234.h ./grid.h ./penrose.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+gtk.o: ./gtk.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess.o: ./guess.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess-icon.o: icons/guess-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess3.o: ./guess.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+inertia.o: ./inertia.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+inertia-icon.o: icons/inertia-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+inertia3.o: ./inertia.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+keen.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+keen-icon.o: icons/keen-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+keen5.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+keen2.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+latin.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+latin8.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_LATIN_TEST -c $< -o $@
+latin6.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+laydomino.o: ./laydomino.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup.o: ./lightup.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup-icon.o: icons/lightup-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup5.o: ./lightup.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+lightup2.o: ./lightup.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+list.o: ./list.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopgen.o: ./loopgen.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy-icon.o: icons/loopy-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy5.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+loopy2.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+magnets.o: ./magnets.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+magnets-icon.o: icons/magnets-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+magnets5.o: ./magnets.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+magnets2.o: ./magnets.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+malloc.o: ./malloc.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map.o: ./map.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map-icon.o: icons/map-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map5.o: ./map.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+map2.o: ./map.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+maxflow.o: ./maxflow.c ./maxflow.h ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+midend.o: ./midend.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines-icon.o: icons/mines-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines5.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+mines2.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_OBFUSCATOR -c $< -o $@
+misc.o: ./misc.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net.o: ./net.c ./puzzles.h ./tree234.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net-icon.o: icons/net-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net3.o: ./net.c ./puzzles.h ./tree234.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+netslide.o: ./netslide.c ./puzzles.h ./tree234.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+netslide-icon.o: icons/netslide-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+netslid3.o: ./netslide.c ./puzzles.h ./tree234.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+no-icon.o: ./no-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+nullfe.o: ./nullfe.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+nullgame.o: ./nullgame.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+obfusc.o: ./obfusc.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+osx.o: ./osx.m ./puzzles.h
+       $(CC) -DGNUSTEP $(ALL_OBJCFLAGS) $(COMPAT) $(FWHACK) $(OBJCFLAGS) $(XFLAGS) -c $< -o $@
+palisade.o: ./palisade.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisade-icon.o: icons/palisade-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisad3.o: ./palisade.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pattern.o: ./pattern.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pattern-icon.o: icons/pattern-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pattern7.o: ./pattern.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pattern4.o: ./pattern.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_PICTURE_GENERATOR -c $< -o $@
+pattern2.o: ./pattern.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+pearl.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pearl-icon.o: icons/pearl-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pearl5.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pearl2.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+pegs.o: ./pegs.c ./puzzles.h ./tree234.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pegs-icon.o: icons/pegs-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pegs3.o: ./pegs.c ./puzzles.h ./tree234.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+penrose.o: ./penrose.c ./puzzles.h ./penrose.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+printing.o: ./printing.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+ps.o: ./ps.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+random.o: ./random.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range.o: ./range.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range-icon.o: icons/range-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range3.o: ./range.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+rect.o: ./rect.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+rect-icon.o: icons/rect-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+rect3.o: ./rect.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+samegame.o: ./samegame.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+samegame-icon.o: icons/samegame-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+samegam3.o: ./samegame.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+signpost.o: ./signpost.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+signpost-icon.o: icons/signpost-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+signpos5.o: ./signpost.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+signpos2.o: ./signpost.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+singles.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+singles-icon.o: icons/singles-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+singles5.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+singles3.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+sixteen.o: ./sixteen.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+sixteen-icon.o: icons/sixteen-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+sixteen3.o: ./sixteen.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+slant.o: ./slant.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+slant-icon.o: icons/slant-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+slant5.o: ./slant.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+slant2.o: ./slant.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+solo.o: ./solo.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+solo-icon.o: icons/solo-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+solo5.o: ./solo.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+solo2.o: ./solo.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+tdq.o: ./tdq.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents-icon.o: icons/tents-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents5.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+tents3.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+towers.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+towers-icon.o: icons/towers-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+towers5.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+towers2.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+tracks.o: ./tracks.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tracks-icon.o: icons/tracks-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tracks3.o: ./tracks.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+tree234.o: ./tree234.c ./tree234.h ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle.o: ./twiddle.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle-icon.o: icons/twiddle-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle3.o: ./twiddle.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+undead.o: ./undead.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+undead-icon.o: icons/undead-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+undead3.o: ./undead.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unequal.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unequal-icon.o: icons/unequal-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unequal5.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unequal2.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+unruly.o: ./unruly.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unruly-icon.o: icons/unruly-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unruly5.o: ./unruly.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unruly2.o: ./unruly.c ./puzzles.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+untangle.o: ./untangle.c ./puzzles.h ./tree234.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+untangle-icon.o: icons/untangle-icon.c
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+untangl3.o: ./untangle.c ./puzzles.h ./tree234.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+version.o: ./version.c ./version.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+windows.o: ./windows.c ./puzzles.h ./resource.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+windows1.o: ./windows.c ./puzzles.h ./resource.h
+       $(CC) $(ALL_CFLAGS) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+
+clean::
+       rm -f *.o fifteensolver fillingsolver galaxiespicture galaxiessolver keensolver latincheck lightupsolver loopysolver magnetssolver mapsolver mineobfusc obfusc patternpicture patternsolver pearlbench signpostsolver singlessolver slantsolver solosolver tentssolver towerssolver unequalsolver unrulysolver
+       rm -rf *.app
diff --git a/Makefile.gtk b/Makefile.gtk
new file mode 100644 (file)
index 0000000..650a836
--- /dev/null
@@ -0,0 +1,809 @@
+# Makefile for puzzles under X/GTK and Unix.
+#
+# This file was created by `mkfiles.pl' from the `Recipe' file.
+# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.
+
+# You can define this path to point at your tools if you need to
+# TOOLPATH = /opt/gcc/bin
+CC := $(TOOLPATH)$(CC)
+# You can manually set this to `gtk-config' or `pkg-config gtk+-1.2'
+# (depending on what works on your system) if you want to enforce
+# building with GTK 1.2, or you can set it to `pkg-config gtk+-2.0'
+# if you want to enforce 2.0. The default is to try 2.0 and fall back
+# to 1.2 if it isn't found.
+GTK_CONFIG = sh -c 'pkg-config gtk+-2.0 $$0 2>/dev/null || gtk-config $$0'
+
+CFLAGS := -O2 -Wall -Werror -ansi  -g -I./ -Iicons/ `$(GTK_CONFIG) \
+               --cflags` $(CFLAGS)
+XLIBS = `$(GTK_CONFIG) --libs` -lm
+ULIBS = -lm#
+INSTALL=install
+INSTALL_PROGRAM=$(INSTALL)
+INSTALL_DATA=$(INSTALL)
+prefix=/usr/local
+exec_prefix=$(prefix)
+bindir=$(exec_prefix)/bin
+gamesdir=$(exec_prefix)/games
+mandir=$(prefix)/man
+man1dir=$(mandir)/man1
+
+all: $(BINPREFIX)blackbox $(BINPREFIX)bridges $(BINPREFIX)cube \
+               $(BINPREFIX)dominosa $(BINPREFIX)fifteen \
+               $(BINPREFIX)fifteensolver $(BINPREFIX)filling \
+               $(BINPREFIX)fillingsolver $(BINPREFIX)flip $(BINPREFIX)flood \
+               $(BINPREFIX)galaxies $(BINPREFIX)galaxiespicture \
+               $(BINPREFIX)galaxiessolver $(BINPREFIX)guess \
+               $(BINPREFIX)inertia $(BINPREFIX)keen $(BINPREFIX)keensolver \
+               $(BINPREFIX)latincheck $(BINPREFIX)lightup \
+               $(BINPREFIX)lightupsolver $(BINPREFIX)loopy \
+               $(BINPREFIX)loopysolver $(BINPREFIX)magnets \
+               $(BINPREFIX)magnetssolver $(BINPREFIX)map \
+               $(BINPREFIX)mapsolver $(BINPREFIX)mineobfusc \
+               $(BINPREFIX)mines $(BINPREFIX)net $(BINPREFIX)netslide \
+               $(BINPREFIX)nullgame $(BINPREFIX)obfusc $(BINPREFIX)palisade \
+               $(BINPREFIX)pattern $(BINPREFIX)patternpicture \
+               $(BINPREFIX)patternsolver $(BINPREFIX)pearl \
+               $(BINPREFIX)pearlbench $(BINPREFIX)pegs $(BINPREFIX)range \
+               $(BINPREFIX)rect $(BINPREFIX)samegame $(BINPREFIX)signpost \
+               $(BINPREFIX)signpostsolver $(BINPREFIX)singles \
+               $(BINPREFIX)singlessolver $(BINPREFIX)sixteen \
+               $(BINPREFIX)slant $(BINPREFIX)slantsolver $(BINPREFIX)solo \
+               $(BINPREFIX)solosolver $(BINPREFIX)tents \
+               $(BINPREFIX)tentssolver $(BINPREFIX)towers \
+               $(BINPREFIX)towerssolver $(BINPREFIX)tracks \
+               $(BINPREFIX)twiddle $(BINPREFIX)undead $(BINPREFIX)unequal \
+               $(BINPREFIX)unequalsolver $(BINPREFIX)unruly \
+               $(BINPREFIX)unrulysolver $(BINPREFIX)untangle
+
+$(BINPREFIX)blackbox: blackbox.o blackbox-icon.o drawing.o gtk.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) -o $@ blackbox.o blackbox-icon.o drawing.o gtk.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)bridges: bridges.o bridges-icon.o drawing.o dsf.o findloop.o \
+               gtk.o malloc.o midend.o misc.o printing.o ps.o random.o \
+               version.o
+       $(CC) -o $@ bridges.o bridges-icon.o drawing.o dsf.o findloop.o \
+               gtk.o malloc.o midend.o misc.o printing.o ps.o random.o \
+               version.o  $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)cube: cube.o cube-icon.o drawing.o gtk.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o version.o
+       $(CC) -o $@ cube.o cube-icon.o drawing.o gtk.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o version.o  $(XLFLAGS) \
+               $(XLIBS)
+
+$(BINPREFIX)dominosa: dominosa.o dominosa-icon.o drawing.o gtk.o laydomino.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) -o $@ dominosa.o dominosa-icon.o drawing.o gtk.o laydomino.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)fifteen: drawing.o fifteen.o fifteen-icon.o gtk.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) -o $@ drawing.o fifteen.o fifteen-icon.o gtk.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)fifteensolver: fifteen2.o malloc.o misc.o nullfe.o random.o
+       $(CC) -o $@ fifteen2.o malloc.o misc.o nullfe.o random.o  $(XLFLAGS) \
+               $(ULIBS)
+
+$(BINPREFIX)filling: drawing.o dsf.o filling.o filling-icon.o gtk.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) -o $@ drawing.o dsf.o filling.o filling-icon.o gtk.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)fillingsolver: dsf.o filling2.o malloc.o misc.o nullfe.o \
+               random.o
+       $(CC) -o $@ dsf.o filling2.o malloc.o misc.o nullfe.o random.o  \
+               $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)flip: drawing.o flip.o flip-icon.o gtk.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o tree234.o version.o
+       $(CC) -o $@ drawing.o flip.o flip-icon.o gtk.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o tree234.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)flood: drawing.o flood.o flood-icon.o gtk.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o version.o
+       $(CC) -o $@ drawing.o flood.o flood-icon.o gtk.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o version.o  $(XLFLAGS) \
+               $(XLIBS)
+
+$(BINPREFIX)galaxies: drawing.o dsf.o galaxies.o galaxies-icon.o gtk.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) -o $@ drawing.o dsf.o galaxies.o galaxies-icon.o gtk.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)galaxiespicture: dsf.o galaxie4.o malloc.o misc.o nullfe.o \
+               random.o
+       $(CC) -o $@ dsf.o galaxie4.o malloc.o misc.o nullfe.o random.o -lm \
+               $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)galaxiessolver: dsf.o galaxie2.o malloc.o misc.o nullfe.o \
+               random.o
+       $(CC) -o $@ dsf.o galaxie2.o malloc.o misc.o nullfe.o random.o -lm \
+               $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)guess: drawing.o gtk.o guess.o guess-icon.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o version.o
+       $(CC) -o $@ drawing.o gtk.o guess.o guess-icon.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o version.o  $(XLFLAGS) \
+               $(XLIBS)
+
+$(BINPREFIX)inertia: drawing.o gtk.o inertia.o inertia-icon.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) -o $@ drawing.o gtk.o inertia.o inertia-icon.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)keen: drawing.o dsf.o gtk.o keen.o keen-icon.o latin.o malloc.o \
+               maxflow.o midend.o misc.o printing.o ps.o random.o tree234.o \
+               version.o
+       $(CC) -o $@ drawing.o dsf.o gtk.o keen.o keen-icon.o latin.o \
+               malloc.o maxflow.o midend.o misc.o printing.o ps.o random.o \
+               tree234.o version.o  $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)keensolver: dsf.o keen2.o latin6.o malloc.o maxflow.o misc.o \
+               nullfe.o random.o tree234.o
+       $(CC) -o $@ dsf.o keen2.o latin6.o malloc.o maxflow.o misc.o \
+               nullfe.o random.o tree234.o  $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)latincheck: latin8.o malloc.o maxflow.o misc.o nullfe.o random.o \
+               tree234.o
+       $(CC) -o $@ latin8.o malloc.o maxflow.o misc.o nullfe.o random.o \
+               tree234.o  $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)lightup: combi.o drawing.o gtk.o lightup.o lightup-icon.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) -o $@ combi.o drawing.o gtk.o lightup.o lightup-icon.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)lightupsolver: combi.o lightup2.o malloc.o misc.o nullfe.o \
+               random.o
+       $(CC) -o $@ combi.o lightup2.o malloc.o misc.o nullfe.o random.o  \
+               $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)loopy: drawing.o dsf.o grid.o gtk.o loopgen.o loopy.o \
+               loopy-icon.o malloc.o midend.o misc.o penrose.o printing.o \
+               ps.o random.o tree234.o version.o
+       $(CC) -o $@ drawing.o dsf.o grid.o gtk.o loopgen.o loopy.o \
+               loopy-icon.o malloc.o midend.o misc.o penrose.o printing.o \
+               ps.o random.o tree234.o version.o  $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)loopysolver: dsf.o grid.o loopgen.o loopy2.o malloc.o misc.o \
+               nullfe.o penrose.o random.o tree234.o
+       $(CC) -o $@ dsf.o grid.o loopgen.o loopy2.o malloc.o misc.o nullfe.o \
+               penrose.o random.o tree234.o -lm $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)magnets: drawing.o gtk.o laydomino.o magnets.o magnets-icon.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) -o $@ drawing.o gtk.o laydomino.o magnets.o magnets-icon.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)magnetssolver: laydomino.o magnets2.o malloc.o misc.o nullfe.o \
+               random.o
+       $(CC) -o $@ laydomino.o magnets2.o malloc.o misc.o nullfe.o random.o \
+               -lm $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)map: drawing.o dsf.o gtk.o malloc.o map.o map-icon.o midend.o \
+               misc.o printing.o ps.o random.o version.o
+       $(CC) -o $@ drawing.o dsf.o gtk.o malloc.o map.o map-icon.o midend.o \
+               misc.o printing.o ps.o random.o version.o  $(XLFLAGS) \
+               $(XLIBS)
+
+$(BINPREFIX)mapsolver: dsf.o malloc.o map2.o misc.o nullfe.o random.o
+       $(CC) -o $@ dsf.o malloc.o map2.o misc.o nullfe.o random.o -lm \
+               $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)mineobfusc: malloc.o mines2.o misc.o nullfe.o random.o tree234.o
+       $(CC) -o $@ malloc.o mines2.o misc.o nullfe.o random.o tree234.o  \
+               $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)mines: drawing.o gtk.o malloc.o midend.o mines.o mines-icon.o \
+               misc.o printing.o ps.o random.o tree234.o version.o
+       $(CC) -o $@ drawing.o gtk.o malloc.o midend.o mines.o mines-icon.o \
+               misc.o printing.o ps.o random.o tree234.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)net: drawing.o dsf.o findloop.o gtk.o malloc.o midend.o misc.o \
+               net.o net-icon.o printing.o ps.o random.o tree234.o \
+               version.o
+       $(CC) -o $@ drawing.o dsf.o findloop.o gtk.o malloc.o midend.o \
+               misc.o net.o net-icon.o printing.o ps.o random.o tree234.o \
+               version.o  $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)netslide: drawing.o gtk.o malloc.o midend.o misc.o netslide.o \
+               netslide-icon.o printing.o ps.o random.o tree234.o version.o
+       $(CC) -o $@ drawing.o gtk.o malloc.o midend.o misc.o netslide.o \
+               netslide-icon.o printing.o ps.o random.o tree234.o version.o \
+                $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)nullgame: drawing.o gtk.o malloc.o midend.o misc.o no-icon.o \
+               nullgame.o printing.o ps.o random.o version.o
+       $(CC) -o $@ drawing.o gtk.o malloc.o midend.o misc.o no-icon.o \
+               nullgame.o printing.o ps.o random.o version.o  $(XLFLAGS) \
+               $(XLIBS)
+
+$(BINPREFIX)obfusc: malloc.o misc.o nullfe.o obfusc.o random.o
+       $(CC) -o $@ malloc.o misc.o nullfe.o obfusc.o random.o  $(XLFLAGS) \
+               $(ULIBS)
+
+$(BINPREFIX)palisade: divvy.o drawing.o dsf.o gtk.o malloc.o midend.o misc.o \
+               palisade.o palisade-icon.o printing.o ps.o random.o \
+               version.o
+       $(CC) -o $@ divvy.o drawing.o dsf.o gtk.o malloc.o midend.o misc.o \
+               palisade.o palisade-icon.o printing.o ps.o random.o \
+               version.o  $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)pattern: drawing.o gtk.o malloc.o midend.o misc.o pattern.o \
+               pattern-icon.o printing.o ps.o random.o version.o
+       $(CC) -o $@ drawing.o gtk.o malloc.o midend.o misc.o pattern.o \
+               pattern-icon.o printing.o ps.o random.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)patternpicture: malloc.o misc.o nullfe.o pattern4.o random.o
+       $(CC) -o $@ malloc.o misc.o nullfe.o pattern4.o random.o  $(XLFLAGS) \
+               $(ULIBS)
+
+$(BINPREFIX)patternsolver: malloc.o misc.o nullfe.o pattern2.o random.o
+       $(CC) -o $@ malloc.o misc.o nullfe.o pattern2.o random.o  $(XLFLAGS) \
+               $(ULIBS)
+
+$(BINPREFIX)pearl: drawing.o dsf.o grid.o gtk.o loopgen.o malloc.o midend.o \
+               misc.o pearl.o pearl-icon.o penrose.o printing.o ps.o \
+               random.o tdq.o tree234.o version.o
+       $(CC) -o $@ drawing.o dsf.o grid.o gtk.o loopgen.o malloc.o midend.o \
+               misc.o pearl.o pearl-icon.o penrose.o printing.o ps.o \
+               random.o tdq.o tree234.o version.o  $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)pearlbench: dsf.o grid.o loopgen.o malloc.o misc.o nullfe.o \
+               pearl2.o penrose.o random.o tdq.o tree234.o
+       $(CC) -o $@ dsf.o grid.o loopgen.o malloc.o misc.o nullfe.o pearl2.o \
+               penrose.o random.o tdq.o tree234.o -lm $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)pegs: drawing.o gtk.o malloc.o midend.o misc.o pegs.o \
+               pegs-icon.o printing.o ps.o random.o tree234.o version.o
+       $(CC) -o $@ drawing.o gtk.o malloc.o midend.o misc.o pegs.o \
+               pegs-icon.o printing.o ps.o random.o tree234.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)range: drawing.o dsf.o gtk.o malloc.o midend.o misc.o printing.o \
+               ps.o random.o range.o range-icon.o version.o
+       $(CC) -o $@ drawing.o dsf.o gtk.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o range.o range-icon.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)rect: drawing.o gtk.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o rect.o rect-icon.o version.o
+       $(CC) -o $@ drawing.o gtk.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o rect.o rect-icon.o version.o  $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)samegame: drawing.o gtk.o malloc.o midend.o misc.o printing.o \
+               ps.o random.o samegame.o samegame-icon.o version.o
+       $(CC) -o $@ drawing.o gtk.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o samegame.o samegame-icon.o version.o  $(XLFLAGS) \
+               $(XLIBS)
+
+$(BINPREFIX)signpost: drawing.o dsf.o gtk.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o signpost.o signpost-icon.o \
+               version.o
+       $(CC) -o $@ drawing.o dsf.o gtk.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o signpost.o signpost-icon.o \
+               version.o  $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)signpostsolver: dsf.o malloc.o misc.o nullfe.o random.o \
+               signpos2.o
+       $(CC) -o $@ dsf.o malloc.o misc.o nullfe.o random.o signpos2.o -lm \
+               $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)singles: drawing.o dsf.o gtk.o latin.o malloc.o maxflow.o \
+               midend.o misc.o printing.o ps.o random.o singles.o \
+               singles-icon.o tree234.o version.o
+       $(CC) -o $@ drawing.o dsf.o gtk.o latin.o malloc.o maxflow.o \
+               midend.o misc.o printing.o ps.o random.o singles.o \
+               singles-icon.o tree234.o version.o  $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)singlessolver: dsf.o latin.o malloc.o maxflow.o misc.o nullfe.o \
+               random.o singles3.o tree234.o
+       $(CC) -o $@ dsf.o latin.o malloc.o maxflow.o misc.o nullfe.o \
+               random.o singles3.o tree234.o  $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)sixteen: drawing.o gtk.o malloc.o midend.o misc.o printing.o \
+               ps.o random.o sixteen.o sixteen-icon.o version.o
+       $(CC) -o $@ drawing.o gtk.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o sixteen.o sixteen-icon.o version.o  $(XLFLAGS) \
+               $(XLIBS)
+
+$(BINPREFIX)slant: drawing.o dsf.o findloop.o gtk.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o slant.o slant-icon.o version.o
+       $(CC) -o $@ drawing.o dsf.o findloop.o gtk.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o slant.o slant-icon.o \
+               version.o  $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)slantsolver: dsf.o findloop.o malloc.o misc.o nullfe.o random.o \
+               slant2.o
+       $(CC) -o $@ dsf.o findloop.o malloc.o misc.o nullfe.o random.o \
+               slant2.o  $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)solo: divvy.o drawing.o dsf.o gtk.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o solo.o solo-icon.o version.o
+       $(CC) -o $@ divvy.o drawing.o dsf.o gtk.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o solo.o solo-icon.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)solosolver: divvy.o dsf.o malloc.o misc.o nullfe.o random.o \
+               solo2.o
+       $(CC) -o $@ divvy.o dsf.o malloc.o misc.o nullfe.o random.o solo2.o  \
+               $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)tents: drawing.o dsf.o gtk.o malloc.o maxflow.o midend.o misc.o \
+               printing.o ps.o random.o tents.o tents-icon.o version.o
+       $(CC) -o $@ drawing.o dsf.o gtk.o malloc.o maxflow.o midend.o misc.o \
+               printing.o ps.o random.o tents.o tents-icon.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)tentssolver: dsf.o malloc.o maxflow.o misc.o nullfe.o random.o \
+               tents3.o
+       $(CC) -o $@ dsf.o malloc.o maxflow.o misc.o nullfe.o random.o \
+               tents3.o  $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)towers: drawing.o gtk.o latin.o malloc.o maxflow.o midend.o \
+               misc.o printing.o ps.o random.o towers.o towers-icon.o \
+               tree234.o version.o
+       $(CC) -o $@ drawing.o gtk.o latin.o malloc.o maxflow.o midend.o \
+               misc.o printing.o ps.o random.o towers.o towers-icon.o \
+               tree234.o version.o  $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)towerssolver: latin6.o malloc.o maxflow.o misc.o nullfe.o \
+               random.o towers2.o tree234.o
+       $(CC) -o $@ latin6.o malloc.o maxflow.o misc.o nullfe.o random.o \
+               towers2.o tree234.o  $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)tracks: drawing.o dsf.o findloop.o gtk.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o tracks.o tracks-icon.o \
+               version.o
+       $(CC) -o $@ drawing.o dsf.o findloop.o gtk.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o tracks.o tracks-icon.o \
+               version.o  $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)twiddle: drawing.o gtk.o malloc.o midend.o misc.o printing.o \
+               ps.o random.o twiddle.o twiddle-icon.o version.o
+       $(CC) -o $@ drawing.o gtk.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o twiddle.o twiddle-icon.o version.o  $(XLFLAGS) \
+               $(XLIBS)
+
+$(BINPREFIX)undead: drawing.o gtk.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o undead.o undead-icon.o version.o
+       $(CC) -o $@ drawing.o gtk.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o undead.o undead-icon.o version.o  $(XLFLAGS) \
+               $(XLIBS)
+
+$(BINPREFIX)unequal: drawing.o gtk.o latin.o malloc.o maxflow.o midend.o \
+               misc.o printing.o ps.o random.o tree234.o unequal.o \
+               unequal-icon.o version.o
+       $(CC) -o $@ drawing.o gtk.o latin.o malloc.o maxflow.o midend.o \
+               misc.o printing.o ps.o random.o tree234.o unequal.o \
+               unequal-icon.o version.o  $(XLFLAGS) $(XLIBS)
+
+$(BINPREFIX)unequalsolver: latin6.o malloc.o maxflow.o misc.o nullfe.o \
+               random.o tree234.o unequal2.o
+       $(CC) -o $@ latin6.o malloc.o maxflow.o misc.o nullfe.o random.o \
+               tree234.o unequal2.o  $(XLFLAGS) $(ULIBS)
+
+$(BINPREFIX)unruly: drawing.o gtk.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o unruly.o unruly-icon.o version.o
+       $(CC) -o $@ drawing.o gtk.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o unruly.o unruly-icon.o version.o  $(XLFLAGS) \
+               $(XLIBS)
+
+$(BINPREFIX)unrulysolver: malloc.o misc.o nullfe.o random.o unruly2.o
+       $(CC) -o $@ malloc.o misc.o nullfe.o random.o unruly2.o  $(XLFLAGS) \
+               $(ULIBS)
+
+$(BINPREFIX)untangle: drawing.o gtk.o malloc.o midend.o misc.o printing.o \
+               ps.o random.o tree234.o untangle.o untangle-icon.o version.o
+       $(CC) -o $@ drawing.o gtk.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o tree234.o untangle.o untangle-icon.o version.o  \
+               $(XLFLAGS) $(XLIBS)
+
+blackbox.o: ./blackbox.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+blackbox-icon.o: icons/blackbox-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+blackbo3.o: ./blackbox.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+bridges.o: ./bridges.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+bridges-icon.o: icons/bridges-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+bridges3.o: ./bridges.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+combi.o: ./combi.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube.o: ./cube.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube-icon.o: icons/cube-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube3.o: ./cube.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+divvy.o: ./divvy.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominosa.o: ./dominosa.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominosa-icon.o: icons/dominosa-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominos3.o: ./dominosa.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+drawing.o: ./drawing.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dsf.o: ./dsf.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen.o: ./fifteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen-icon.o: icons/fifteen-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen5.o: ./fifteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+fifteen2.o: ./fifteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+filling.o: ./filling.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+filling-icon.o: icons/filling-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+filling5.o: ./filling.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+filling2.o: ./filling.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+findloop.o: ./findloop.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip.o: ./flip.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip-icon.o: icons/flip-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip3.o: ./flip.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+flood.o: ./flood.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flood-icon.o: icons/flood-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flood3.o: ./flood.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+galaxies.o: ./galaxies.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+galaxies-icon.o: icons/galaxies-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+galaxie7.o: ./galaxies.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+galaxie4.o: ./galaxies.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_PICTURE_GENERATOR -c $< -o $@
+galaxie2.o: ./galaxies.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+grid.o: ./grid.c ./puzzles.h ./tree234.h ./grid.h ./penrose.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+gtk.o: ./gtk.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess.o: ./guess.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess-icon.o: icons/guess-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess3.o: ./guess.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+inertia.o: ./inertia.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+inertia-icon.o: icons/inertia-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+inertia3.o: ./inertia.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+keen.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+keen-icon.o: icons/keen-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+keen5.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+keen2.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+latin.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+latin8.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_LATIN_TEST -c $< -o $@
+latin6.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+laydomino.o: ./laydomino.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup.o: ./lightup.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup-icon.o: icons/lightup-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup5.o: ./lightup.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+lightup2.o: ./lightup.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+list.o: ./list.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopgen.o: ./loopgen.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy-icon.o: icons/loopy-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy5.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+loopy2.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+magnets.o: ./magnets.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+magnets-icon.o: icons/magnets-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+magnets5.o: ./magnets.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+magnets2.o: ./magnets.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+malloc.o: ./malloc.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map.o: ./map.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map-icon.o: icons/map-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map5.o: ./map.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+map2.o: ./map.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+maxflow.o: ./maxflow.c ./maxflow.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+midend.o: ./midend.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines-icon.o: icons/mines-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines5.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+mines2.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_OBFUSCATOR -c $< -o $@
+misc.o: ./misc.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net.o: ./net.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net-icon.o: icons/net-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net3.o: ./net.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+netslide.o: ./netslide.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+netslide-icon.o: icons/netslide-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+netslid3.o: ./netslide.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+no-icon.o: ./no-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+nullfe.o: ./nullfe.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+nullgame.o: ./nullgame.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+obfusc.o: ./obfusc.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+osx.o: ./osx.m ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisade.o: ./palisade.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisade-icon.o: icons/palisade-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisad3.o: ./palisade.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pattern.o: ./pattern.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pattern-icon.o: icons/pattern-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pattern7.o: ./pattern.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pattern4.o: ./pattern.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_PICTURE_GENERATOR -c $< -o $@
+pattern2.o: ./pattern.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+pearl.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pearl-icon.o: icons/pearl-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pearl5.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pearl2.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+pegs.o: ./pegs.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pegs-icon.o: icons/pegs-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pegs3.o: ./pegs.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+penrose.o: ./penrose.c ./puzzles.h ./penrose.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+printing.o: ./printing.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+ps.o: ./ps.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+random.o: ./random.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range.o: ./range.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range-icon.o: icons/range-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range3.o: ./range.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+rect.o: ./rect.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+rect-icon.o: icons/rect-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+rect3.o: ./rect.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+samegame.o: ./samegame.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+samegame-icon.o: icons/samegame-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+samegam3.o: ./samegame.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+signpost.o: ./signpost.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+signpost-icon.o: icons/signpost-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+signpos5.o: ./signpost.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+signpos2.o: ./signpost.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+singles.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+singles-icon.o: icons/singles-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+singles5.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+singles3.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+sixteen.o: ./sixteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+sixteen-icon.o: icons/sixteen-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+sixteen3.o: ./sixteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+slant.o: ./slant.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+slant-icon.o: icons/slant-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+slant5.o: ./slant.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+slant2.o: ./slant.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+solo.o: ./solo.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+solo-icon.o: icons/solo-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+solo5.o: ./solo.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+solo2.o: ./solo.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+tdq.o: ./tdq.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents-icon.o: icons/tents-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents5.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+tents3.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+towers.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+towers-icon.o: icons/towers-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+towers5.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+towers2.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+tracks.o: ./tracks.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tracks-icon.o: icons/tracks-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tracks3.o: ./tracks.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+tree234.o: ./tree234.c ./tree234.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle.o: ./twiddle.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle-icon.o: icons/twiddle-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle3.o: ./twiddle.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+undead.o: ./undead.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+undead-icon.o: icons/undead-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+undead3.o: ./undead.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unequal.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unequal-icon.o: icons/unequal-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unequal5.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unequal2.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+unruly.o: ./unruly.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unruly-icon.o: icons/unruly-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unruly5.o: ./unruly.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unruly2.o: ./unruly.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+untangle.o: ./untangle.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+untangle-icon.o: icons/untangle-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+untangl3.o: ./untangle.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+version.o: ./version.c ./version.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+windows.o: ./windows.c ./puzzles.h ./resource.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+windows1.o: ./windows.c ./puzzles.h ./resource.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+
+GAMES += blackbox
+GAMES += bridges
+GAMES += cube
+GAMES += dominosa
+GAMES += fifteen
+GAMES += filling
+GAMES += flip
+GAMES += flood
+GAMES += galaxies
+GAMES += guess
+GAMES += inertia
+GAMES += keen
+GAMES += lightup
+GAMES += loopy
+GAMES += magnets
+GAMES += map
+GAMES += mines
+GAMES += net
+GAMES += netslide
+GAMES += palisade
+GAMES += pattern
+GAMES += pearl
+GAMES += pegs
+GAMES += range
+GAMES += rect
+GAMES += samegame
+GAMES += signpost
+GAMES += singles
+GAMES += sixteen
+GAMES += slant
+GAMES += solo
+GAMES += tents
+GAMES += towers
+GAMES += tracks
+GAMES += twiddle
+GAMES += undead
+GAMES += unequal
+GAMES += unruly
+GAMES += untangle
+install:
+       for i in $(GAMES); do \
+               $(INSTALL_PROGRAM) -m 755 $(BINPREFIX)$$i $(DESTDIR)$(gamesdir)/$(BINPREFIX)$$i \
+               || exit 1; \
+       done
+test: benchmark.html benchmark.txt
+
+benchmark.html: benchmark.txt benchmark.pl
+       ./benchmark.pl benchmark.txt > $@
+
+benchmark.txt: benchmark.sh $(GAMES)
+       ./benchmark.sh > $@
+
+
+clean:
+       rm -f *.o $(BINPREFIX)blackbox $(BINPREFIX)bridges $(BINPREFIX)cube $(BINPREFIX)dominosa $(BINPREFIX)fifteen $(BINPREFIX)fifteensolver $(BINPREFIX)filling $(BINPREFIX)fillingsolver $(BINPREFIX)flip $(BINPREFIX)flood $(BINPREFIX)galaxies $(BINPREFIX)galaxiespicture $(BINPREFIX)galaxiessolver $(BINPREFIX)guess $(BINPREFIX)inertia $(BINPREFIX)keen $(BINPREFIX)keensolver $(BINPREFIX)latincheck $(BINPREFIX)lightup $(BINPREFIX)lightupsolver $(BINPREFIX)loopy $(BINPREFIX)loopysolver $(BINPREFIX)magnets $(BINPREFIX)magnetssolver $(BINPREFIX)map $(BINPREFIX)mapsolver $(BINPREFIX)mineobfusc $(BINPREFIX)mines $(BINPREFIX)net $(BINPREFIX)netslide $(BINPREFIX)nullgame $(BINPREFIX)obfusc $(BINPREFIX)palisade $(BINPREFIX)pattern $(BINPREFIX)patternpicture $(BINPREFIX)patternsolver $(BINPREFIX)pearl $(BINPREFIX)pearlbench $(BINPREFIX)pegs $(BINPREFIX)range $(BINPREFIX)rect $(BINPREFIX)samegame $(BINPREFIX)signpost $(BINPREFIX)signpostsolver $(BINPREFIX)singles $(BINPREFIX)singlessolver $(BINPREFIX)sixteen $(BINPREFIX)slant $(BINPREFIX)slantsolver $(BINPREFIX)solo $(BINPREFIX)solosolver $(BINPREFIX)tents $(BINPREFIX)tentssolver $(BINPREFIX)towers $(BINPREFIX)towerssolver $(BINPREFIX)tracks $(BINPREFIX)twiddle $(BINPREFIX)undead $(BINPREFIX)unequal $(BINPREFIX)unequalsolver $(BINPREFIX)unruly $(BINPREFIX)unrulysolver $(BINPREFIX)untangle
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..a49f795
--- /dev/null
@@ -0,0 +1,2780 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Makefile.am for puzzles under Unix with Autoconf/Automake.
+#
+# This file was created by `mkfiles.pl' from the `Recipe' file.
+# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \  ]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs  ]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+noinst_PROGRAMS = blackbox$(EXEEXT) bridges$(EXEEXT) cube$(EXEEXT) \
+       dominosa$(EXEEXT) fifteen$(EXEEXT) fifteensolver$(EXEEXT) \
+       filling$(EXEEXT) fillingsolver$(EXEEXT) flip$(EXEEXT) \
+       flood$(EXEEXT) galaxies$(EXEEXT) galaxiespicture$(EXEEXT) \
+       galaxiessolver$(EXEEXT) guess$(EXEEXT) inertia$(EXEEXT) \
+       keen$(EXEEXT) keensolver$(EXEEXT) latincheck$(EXEEXT) \
+       lightup$(EXEEXT) lightupsolver$(EXEEXT) loopy$(EXEEXT) \
+       loopysolver$(EXEEXT) magnets$(EXEEXT) magnetssolver$(EXEEXT) \
+       map$(EXEEXT) mapsolver$(EXEEXT) mineobfusc$(EXEEXT) \
+       mines$(EXEEXT) net$(EXEEXT) netslide$(EXEEXT) \
+       nullgame$(EXEEXT) obfusc$(EXEEXT) palisade$(EXEEXT) \
+       pattern$(EXEEXT) patternpicture$(EXEEXT) \
+       patternsolver$(EXEEXT) pearl$(EXEEXT) pearlbench$(EXEEXT) \
+       pegs$(EXEEXT) range$(EXEEXT) rect$(EXEEXT) samegame$(EXEEXT) \
+       signpost$(EXEEXT) signpostsolver$(EXEEXT) singles$(EXEEXT) \
+       singlessolver$(EXEEXT) sixteen$(EXEEXT) slant$(EXEEXT) \
+       slantsolver$(EXEEXT) solo$(EXEEXT) solosolver$(EXEEXT) \
+       tents$(EXEEXT) tentssolver$(EXEEXT) towers$(EXEEXT) \
+       towerssolver$(EXEEXT) tracks$(EXEEXT) twiddle$(EXEEXT) \
+       undead$(EXEEXT) unequal$(EXEEXT) unequalsolver$(EXEEXT) \
+       unruly$(EXEEXT) unrulysolver$(EXEEXT) untangle$(EXEEXT)
+bin_PROGRAMS = $(am__EXEEXT_1)
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+       $(am__configure_deps) $(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo "  AR      " $@;
+am__v_AR_1 = 
+libfifteen2_a_AR = $(AR) $(ARFLAGS)
+libfifteen2_a_LIBADD =
+am__dirstamp = $(am__leading_dot)dirstamp
+am_libfifteen2_a_OBJECTS = ./libfifteen2_a-fifteen.$(OBJEXT)
+libfifteen2_a_OBJECTS = $(am_libfifteen2_a_OBJECTS)
+libfilling2_a_AR = $(AR) $(ARFLAGS)
+libfilling2_a_LIBADD =
+am_libfilling2_a_OBJECTS = ./libfilling2_a-filling.$(OBJEXT)
+libfilling2_a_OBJECTS = $(am_libfilling2_a_OBJECTS)
+libgalaxie2_a_AR = $(AR) $(ARFLAGS)
+libgalaxie2_a_LIBADD =
+am_libgalaxie2_a_OBJECTS = ./libgalaxie2_a-galaxies.$(OBJEXT)
+libgalaxie2_a_OBJECTS = $(am_libgalaxie2_a_OBJECTS)
+libgalaxie4_a_AR = $(AR) $(ARFLAGS)
+libgalaxie4_a_LIBADD =
+am_libgalaxie4_a_OBJECTS = ./libgalaxie4_a-galaxies.$(OBJEXT)
+libgalaxie4_a_OBJECTS = $(am_libgalaxie4_a_OBJECTS)
+libkeen2_a_AR = $(AR) $(ARFLAGS)
+libkeen2_a_LIBADD =
+am_libkeen2_a_OBJECTS = ./libkeen2_a-keen.$(OBJEXT)
+libkeen2_a_OBJECTS = $(am_libkeen2_a_OBJECTS)
+liblatin6_a_AR = $(AR) $(ARFLAGS)
+liblatin6_a_LIBADD =
+am_liblatin6_a_OBJECTS = ./liblatin6_a-latin.$(OBJEXT)
+liblatin6_a_OBJECTS = $(am_liblatin6_a_OBJECTS)
+liblatin8_a_AR = $(AR) $(ARFLAGS)
+liblatin8_a_LIBADD =
+am_liblatin8_a_OBJECTS = ./liblatin8_a-latin.$(OBJEXT)
+liblatin8_a_OBJECTS = $(am_liblatin8_a_OBJECTS)
+liblightup2_a_AR = $(AR) $(ARFLAGS)
+liblightup2_a_LIBADD =
+am_liblightup2_a_OBJECTS = ./liblightup2_a-lightup.$(OBJEXT)
+liblightup2_a_OBJECTS = $(am_liblightup2_a_OBJECTS)
+libloopy2_a_AR = $(AR) $(ARFLAGS)
+libloopy2_a_LIBADD =
+am_libloopy2_a_OBJECTS = ./libloopy2_a-loopy.$(OBJEXT)
+libloopy2_a_OBJECTS = $(am_libloopy2_a_OBJECTS)
+libmagnets2_a_AR = $(AR) $(ARFLAGS)
+libmagnets2_a_LIBADD =
+am_libmagnets2_a_OBJECTS = ./libmagnets2_a-magnets.$(OBJEXT)
+libmagnets2_a_OBJECTS = $(am_libmagnets2_a_OBJECTS)
+libmap2_a_AR = $(AR) $(ARFLAGS)
+libmap2_a_LIBADD =
+am_libmap2_a_OBJECTS = ./libmap2_a-map.$(OBJEXT)
+libmap2_a_OBJECTS = $(am_libmap2_a_OBJECTS)
+libmines2_a_AR = $(AR) $(ARFLAGS)
+libmines2_a_LIBADD =
+am_libmines2_a_OBJECTS = ./libmines2_a-mines.$(OBJEXT)
+libmines2_a_OBJECTS = $(am_libmines2_a_OBJECTS)
+libpattern2_a_AR = $(AR) $(ARFLAGS)
+libpattern2_a_LIBADD =
+am_libpattern2_a_OBJECTS = ./libpattern2_a-pattern.$(OBJEXT)
+libpattern2_a_OBJECTS = $(am_libpattern2_a_OBJECTS)
+libpattern4_a_AR = $(AR) $(ARFLAGS)
+libpattern4_a_LIBADD =
+am_libpattern4_a_OBJECTS = ./libpattern4_a-pattern.$(OBJEXT)
+libpattern4_a_OBJECTS = $(am_libpattern4_a_OBJECTS)
+libpearl2_a_AR = $(AR) $(ARFLAGS)
+libpearl2_a_LIBADD =
+am_libpearl2_a_OBJECTS = ./libpearl2_a-pearl.$(OBJEXT)
+libpearl2_a_OBJECTS = $(am_libpearl2_a_OBJECTS)
+libsignpos2_a_AR = $(AR) $(ARFLAGS)
+libsignpos2_a_LIBADD =
+am_libsignpos2_a_OBJECTS = ./libsignpos2_a-signpost.$(OBJEXT)
+libsignpos2_a_OBJECTS = $(am_libsignpos2_a_OBJECTS)
+libsingles3_a_AR = $(AR) $(ARFLAGS)
+libsingles3_a_LIBADD =
+am_libsingles3_a_OBJECTS = ./libsingles3_a-singles.$(OBJEXT)
+libsingles3_a_OBJECTS = $(am_libsingles3_a_OBJECTS)
+libslant2_a_AR = $(AR) $(ARFLAGS)
+libslant2_a_LIBADD =
+am_libslant2_a_OBJECTS = ./libslant2_a-slant.$(OBJEXT)
+libslant2_a_OBJECTS = $(am_libslant2_a_OBJECTS)
+libsolo2_a_AR = $(AR) $(ARFLAGS)
+libsolo2_a_LIBADD =
+am_libsolo2_a_OBJECTS = ./libsolo2_a-solo.$(OBJEXT)
+libsolo2_a_OBJECTS = $(am_libsolo2_a_OBJECTS)
+libtents3_a_AR = $(AR) $(ARFLAGS)
+libtents3_a_LIBADD =
+am_libtents3_a_OBJECTS = ./libtents3_a-tents.$(OBJEXT)
+libtents3_a_OBJECTS = $(am_libtents3_a_OBJECTS)
+libtowers2_a_AR = $(AR) $(ARFLAGS)
+libtowers2_a_LIBADD =
+am_libtowers2_a_OBJECTS = ./libtowers2_a-towers.$(OBJEXT)
+libtowers2_a_OBJECTS = $(am_libtowers2_a_OBJECTS)
+libunequal2_a_AR = $(AR) $(ARFLAGS)
+libunequal2_a_LIBADD =
+am_libunequal2_a_OBJECTS = ./libunequal2_a-unequal.$(OBJEXT)
+libunequal2_a_OBJECTS = $(am_libunequal2_a_OBJECTS)
+libunruly2_a_AR = $(AR) $(ARFLAGS)
+libunruly2_a_LIBADD =
+am_libunruly2_a_OBJECTS = ./libunruly2_a-unruly.$(OBJEXT)
+libunruly2_a_OBJECTS = $(am_libunruly2_a_OBJECTS)
+am__EXEEXT_1 = blackbox$(EXEEXT) bridges$(EXEEXT) cube$(EXEEXT) \
+       dominosa$(EXEEXT) fifteen$(EXEEXT) filling$(EXEEXT) \
+       flip$(EXEEXT) flood$(EXEEXT) galaxies$(EXEEXT) guess$(EXEEXT) \
+       inertia$(EXEEXT) keen$(EXEEXT) lightup$(EXEEXT) loopy$(EXEEXT) \
+       magnets$(EXEEXT) map$(EXEEXT) mines$(EXEEXT) net$(EXEEXT) \
+       netslide$(EXEEXT) palisade$(EXEEXT) pattern$(EXEEXT) \
+       pearl$(EXEEXT) pegs$(EXEEXT) range$(EXEEXT) rect$(EXEEXT) \
+       samegame$(EXEEXT) signpost$(EXEEXT) singles$(EXEEXT) \
+       sixteen$(EXEEXT) slant$(EXEEXT) solo$(EXEEXT) tents$(EXEEXT) \
+       towers$(EXEEXT) tracks$(EXEEXT) twiddle$(EXEEXT) \
+       undead$(EXEEXT) unequal$(EXEEXT) unruly$(EXEEXT) \
+       untangle$(EXEEXT)
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+am_blackbox_OBJECTS = ./blackbox.$(OBJEXT) ./drawing.$(OBJEXT) \
+       ./gtk.$(OBJEXT) ./malloc.$(OBJEXT) ./midend.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./printing.$(OBJEXT) ./ps.$(OBJEXT) \
+       ./random.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/blackbox-icon.$(OBJEXT)
+blackbox_OBJECTS = $(am_blackbox_OBJECTS)
+am__DEPENDENCIES_1 =
+blackbox_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_bridges_OBJECTS = ./bridges.$(OBJEXT) ./drawing.$(OBJEXT) \
+       ./dsf.$(OBJEXT) ./findloop.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./version.$(OBJEXT) icons/bridges-icon.$(OBJEXT)
+bridges_OBJECTS = $(am_bridges_OBJECTS)
+bridges_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_cube_OBJECTS = ./cube.$(OBJEXT) ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./version.$(OBJEXT) icons/cube-icon.$(OBJEXT)
+cube_OBJECTS = $(am_cube_OBJECTS)
+cube_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_dominosa_OBJECTS = ./dominosa.$(OBJEXT) ./drawing.$(OBJEXT) \
+       ./gtk.$(OBJEXT) ./laydomino.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./midend.$(OBJEXT) ./misc.$(OBJEXT) ./printing.$(OBJEXT) \
+       ./ps.$(OBJEXT) ./random.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/dominosa-icon.$(OBJEXT)
+dominosa_OBJECTS = $(am_dominosa_OBJECTS)
+dominosa_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_fifteen_OBJECTS = ./drawing.$(OBJEXT) ./fifteen.$(OBJEXT) \
+       ./gtk.$(OBJEXT) ./malloc.$(OBJEXT) ./midend.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./printing.$(OBJEXT) ./ps.$(OBJEXT) \
+       ./random.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/fifteen-icon.$(OBJEXT)
+fifteen_OBJECTS = $(am_fifteen_OBJECTS)
+fifteen_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_fifteensolver_OBJECTS = ./malloc.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./nullfe.$(OBJEXT) ./random.$(OBJEXT)
+fifteensolver_OBJECTS = $(am_fifteensolver_OBJECTS)
+fifteensolver_DEPENDENCIES = libfifteen2_a-fifteen.$(OBJEXT)
+am_filling_OBJECTS = ./drawing.$(OBJEXT) ./dsf.$(OBJEXT) \
+       ./filling.$(OBJEXT) ./gtk.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./midend.$(OBJEXT) ./misc.$(OBJEXT) ./printing.$(OBJEXT) \
+       ./ps.$(OBJEXT) ./random.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/filling-icon.$(OBJEXT)
+filling_OBJECTS = $(am_filling_OBJECTS)
+filling_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_fillingsolver_OBJECTS = ./dsf.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./nullfe.$(OBJEXT) ./random.$(OBJEXT)
+fillingsolver_OBJECTS = $(am_fillingsolver_OBJECTS)
+fillingsolver_DEPENDENCIES = libfilling2_a-filling.$(OBJEXT)
+am_flip_OBJECTS = ./drawing.$(OBJEXT) ./flip.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./tree234.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/flip-icon.$(OBJEXT)
+flip_OBJECTS = $(am_flip_OBJECTS)
+flip_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_flood_OBJECTS = ./drawing.$(OBJEXT) ./flood.$(OBJEXT) \
+       ./gtk.$(OBJEXT) ./malloc.$(OBJEXT) ./midend.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./printing.$(OBJEXT) ./ps.$(OBJEXT) \
+       ./random.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/flood-icon.$(OBJEXT)
+flood_OBJECTS = $(am_flood_OBJECTS)
+flood_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_galaxies_OBJECTS = ./drawing.$(OBJEXT) ./dsf.$(OBJEXT) \
+       ./galaxies.$(OBJEXT) ./gtk.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./midend.$(OBJEXT) ./misc.$(OBJEXT) ./printing.$(OBJEXT) \
+       ./ps.$(OBJEXT) ./random.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/galaxies-icon.$(OBJEXT)
+galaxies_OBJECTS = $(am_galaxies_OBJECTS)
+galaxies_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_galaxiespicture_OBJECTS = ./dsf.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./nullfe.$(OBJEXT) ./random.$(OBJEXT)
+galaxiespicture_OBJECTS = $(am_galaxiespicture_OBJECTS)
+galaxiespicture_DEPENDENCIES = libgalaxie4_a-galaxies.$(OBJEXT)
+am_galaxiessolver_OBJECTS = ./dsf.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./nullfe.$(OBJEXT) ./random.$(OBJEXT)
+galaxiessolver_OBJECTS = $(am_galaxiessolver_OBJECTS)
+galaxiessolver_DEPENDENCIES = libgalaxie2_a-galaxies.$(OBJEXT)
+am_guess_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./guess.$(OBJEXT) ./malloc.$(OBJEXT) ./midend.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./printing.$(OBJEXT) ./ps.$(OBJEXT) \
+       ./random.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/guess-icon.$(OBJEXT)
+guess_OBJECTS = $(am_guess_OBJECTS)
+guess_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_inertia_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./inertia.$(OBJEXT) ./malloc.$(OBJEXT) ./midend.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./printing.$(OBJEXT) ./ps.$(OBJEXT) \
+       ./random.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/inertia-icon.$(OBJEXT)
+inertia_OBJECTS = $(am_inertia_OBJECTS)
+inertia_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_keen_OBJECTS = ./drawing.$(OBJEXT) ./dsf.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./keen.$(OBJEXT) ./latin.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./maxflow.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./tree234.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/keen-icon.$(OBJEXT)
+keen_OBJECTS = $(am_keen_OBJECTS)
+keen_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_keensolver_OBJECTS = ./dsf.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./maxflow.$(OBJEXT) ./misc.$(OBJEXT) ./nullfe.$(OBJEXT) \
+       ./random.$(OBJEXT) ./tree234.$(OBJEXT)
+keensolver_OBJECTS = $(am_keensolver_OBJECTS)
+keensolver_DEPENDENCIES = libkeen2_a-keen.$(OBJEXT) \
+       liblatin6_a-latin.$(OBJEXT)
+am_latincheck_OBJECTS = ./malloc.$(OBJEXT) ./maxflow.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./nullfe.$(OBJEXT) ./random.$(OBJEXT) \
+       ./tree234.$(OBJEXT)
+latincheck_OBJECTS = $(am_latincheck_OBJECTS)
+latincheck_DEPENDENCIES = liblatin8_a-latin.$(OBJEXT)
+am_lightup_OBJECTS = ./combi.$(OBJEXT) ./drawing.$(OBJEXT) \
+       ./gtk.$(OBJEXT) ./lightup.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./midend.$(OBJEXT) ./misc.$(OBJEXT) ./printing.$(OBJEXT) \
+       ./ps.$(OBJEXT) ./random.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/lightup-icon.$(OBJEXT)
+lightup_OBJECTS = $(am_lightup_OBJECTS)
+lightup_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_lightupsolver_OBJECTS = ./combi.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./nullfe.$(OBJEXT) ./random.$(OBJEXT)
+lightupsolver_OBJECTS = $(am_lightupsolver_OBJECTS)
+lightupsolver_DEPENDENCIES = liblightup2_a-lightup.$(OBJEXT)
+am_loopy_OBJECTS = ./drawing.$(OBJEXT) ./dsf.$(OBJEXT) \
+       ./grid.$(OBJEXT) ./gtk.$(OBJEXT) ./loopgen.$(OBJEXT) \
+       ./loopy.$(OBJEXT) ./malloc.$(OBJEXT) ./midend.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./penrose.$(OBJEXT) ./printing.$(OBJEXT) \
+       ./ps.$(OBJEXT) ./random.$(OBJEXT) ./tree234.$(OBJEXT) \
+       ./version.$(OBJEXT) icons/loopy-icon.$(OBJEXT)
+loopy_OBJECTS = $(am_loopy_OBJECTS)
+loopy_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_loopysolver_OBJECTS = ./dsf.$(OBJEXT) ./grid.$(OBJEXT) \
+       ./loopgen.$(OBJEXT) ./malloc.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./nullfe.$(OBJEXT) ./penrose.$(OBJEXT) ./random.$(OBJEXT) \
+       ./tree234.$(OBJEXT)
+loopysolver_OBJECTS = $(am_loopysolver_OBJECTS)
+loopysolver_DEPENDENCIES = libloopy2_a-loopy.$(OBJEXT)
+am_magnets_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./laydomino.$(OBJEXT) ./magnets.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./midend.$(OBJEXT) ./misc.$(OBJEXT) ./printing.$(OBJEXT) \
+       ./ps.$(OBJEXT) ./random.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/magnets-icon.$(OBJEXT)
+magnets_OBJECTS = $(am_magnets_OBJECTS)
+magnets_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_magnetssolver_OBJECTS = ./laydomino.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./nullfe.$(OBJEXT) ./random.$(OBJEXT)
+magnetssolver_OBJECTS = $(am_magnetssolver_OBJECTS)
+magnetssolver_DEPENDENCIES = libmagnets2_a-magnets.$(OBJEXT)
+am_map_OBJECTS = ./drawing.$(OBJEXT) ./dsf.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./map.$(OBJEXT) ./midend.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./printing.$(OBJEXT) ./ps.$(OBJEXT) \
+       ./random.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/map-icon.$(OBJEXT)
+map_OBJECTS = $(am_map_OBJECTS)
+map_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_mapsolver_OBJECTS = ./dsf.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./nullfe.$(OBJEXT) ./random.$(OBJEXT)
+mapsolver_OBJECTS = $(am_mapsolver_OBJECTS)
+mapsolver_DEPENDENCIES = libmap2_a-map.$(OBJEXT)
+am_mineobfusc_OBJECTS = ./malloc.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./nullfe.$(OBJEXT) ./random.$(OBJEXT) ./tree234.$(OBJEXT)
+mineobfusc_OBJECTS = $(am_mineobfusc_OBJECTS)
+mineobfusc_DEPENDENCIES = libmines2_a-mines.$(OBJEXT)
+am_mines_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./mines.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./printing.$(OBJEXT) ./ps.$(OBJEXT) \
+       ./random.$(OBJEXT) ./tree234.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/mines-icon.$(OBJEXT)
+mines_OBJECTS = $(am_mines_OBJECTS)
+mines_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_net_OBJECTS = ./drawing.$(OBJEXT) ./dsf.$(OBJEXT) \
+       ./findloop.$(OBJEXT) ./gtk.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./midend.$(OBJEXT) ./misc.$(OBJEXT) ./net.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./tree234.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/net-icon.$(OBJEXT)
+net_OBJECTS = $(am_net_OBJECTS)
+net_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_netslide_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./netslide.$(OBJEXT) ./printing.$(OBJEXT) ./ps.$(OBJEXT) \
+       ./random.$(OBJEXT) ./tree234.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/netslide-icon.$(OBJEXT)
+netslide_OBJECTS = $(am_netslide_OBJECTS)
+netslide_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_nullgame_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./no-icon.$(OBJEXT) ./nullgame.$(OBJEXT) ./printing.$(OBJEXT) \
+       ./ps.$(OBJEXT) ./random.$(OBJEXT) ./version.$(OBJEXT)
+nullgame_OBJECTS = $(am_nullgame_OBJECTS)
+nullgame_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_obfusc_OBJECTS = ./malloc.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./nullfe.$(OBJEXT) ./obfusc.$(OBJEXT) ./random.$(OBJEXT)
+obfusc_OBJECTS = $(am_obfusc_OBJECTS)
+obfusc_DEPENDENCIES =
+am_palisade_OBJECTS = ./divvy.$(OBJEXT) ./drawing.$(OBJEXT) \
+       ./dsf.$(OBJEXT) ./gtk.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./midend.$(OBJEXT) ./misc.$(OBJEXT) ./palisade.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./version.$(OBJEXT) icons/palisade-icon.$(OBJEXT)
+palisade_OBJECTS = $(am_palisade_OBJECTS)
+palisade_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_pattern_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./pattern.$(OBJEXT) ./printing.$(OBJEXT) ./ps.$(OBJEXT) \
+       ./random.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/pattern-icon.$(OBJEXT)
+pattern_OBJECTS = $(am_pattern_OBJECTS)
+pattern_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_patternpicture_OBJECTS = ./malloc.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./nullfe.$(OBJEXT) ./random.$(OBJEXT)
+patternpicture_OBJECTS = $(am_patternpicture_OBJECTS)
+patternpicture_DEPENDENCIES = libpattern4_a-pattern.$(OBJEXT)
+am_patternsolver_OBJECTS = ./malloc.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./nullfe.$(OBJEXT) ./random.$(OBJEXT)
+patternsolver_OBJECTS = $(am_patternsolver_OBJECTS)
+patternsolver_DEPENDENCIES = libpattern2_a-pattern.$(OBJEXT)
+am_pearl_OBJECTS = ./drawing.$(OBJEXT) ./dsf.$(OBJEXT) \
+       ./grid.$(OBJEXT) ./gtk.$(OBJEXT) ./loopgen.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./pearl.$(OBJEXT) ./penrose.$(OBJEXT) ./printing.$(OBJEXT) \
+       ./ps.$(OBJEXT) ./random.$(OBJEXT) ./tdq.$(OBJEXT) \
+       ./tree234.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/pearl-icon.$(OBJEXT)
+pearl_OBJECTS = $(am_pearl_OBJECTS)
+pearl_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_pearlbench_OBJECTS = ./dsf.$(OBJEXT) ./grid.$(OBJEXT) \
+       ./loopgen.$(OBJEXT) ./malloc.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./nullfe.$(OBJEXT) ./penrose.$(OBJEXT) ./random.$(OBJEXT) \
+       ./tdq.$(OBJEXT) ./tree234.$(OBJEXT)
+pearlbench_OBJECTS = $(am_pearlbench_OBJECTS)
+pearlbench_DEPENDENCIES = libpearl2_a-pearl.$(OBJEXT)
+am_pegs_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./pegs.$(OBJEXT) ./printing.$(OBJEXT) ./ps.$(OBJEXT) \
+       ./random.$(OBJEXT) ./tree234.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/pegs-icon.$(OBJEXT)
+pegs_OBJECTS = $(am_pegs_OBJECTS)
+pegs_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_range_OBJECTS = ./drawing.$(OBJEXT) ./dsf.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./range.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/range-icon.$(OBJEXT)
+range_OBJECTS = $(am_range_OBJECTS)
+range_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_rect_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./rect.$(OBJEXT) ./version.$(OBJEXT) icons/rect-icon.$(OBJEXT)
+rect_OBJECTS = $(am_rect_OBJECTS)
+rect_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_samegame_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./samegame.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/samegame-icon.$(OBJEXT)
+samegame_OBJECTS = $(am_samegame_OBJECTS)
+samegame_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_signpost_OBJECTS = ./drawing.$(OBJEXT) ./dsf.$(OBJEXT) \
+       ./gtk.$(OBJEXT) ./malloc.$(OBJEXT) ./midend.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./printing.$(OBJEXT) ./ps.$(OBJEXT) \
+       ./random.$(OBJEXT) ./signpost.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/signpost-icon.$(OBJEXT)
+signpost_OBJECTS = $(am_signpost_OBJECTS)
+signpost_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_signpostsolver_OBJECTS = ./dsf.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./nullfe.$(OBJEXT) ./random.$(OBJEXT)
+signpostsolver_OBJECTS = $(am_signpostsolver_OBJECTS)
+signpostsolver_DEPENDENCIES = libsignpos2_a-signpost.$(OBJEXT)
+am_singles_OBJECTS = ./drawing.$(OBJEXT) ./dsf.$(OBJEXT) \
+       ./gtk.$(OBJEXT) ./latin.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./maxflow.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./singles.$(OBJEXT) ./tree234.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/singles-icon.$(OBJEXT)
+singles_OBJECTS = $(am_singles_OBJECTS)
+singles_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_singlessolver_OBJECTS = ./dsf.$(OBJEXT) ./latin.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./maxflow.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./nullfe.$(OBJEXT) ./random.$(OBJEXT) ./tree234.$(OBJEXT)
+singlessolver_OBJECTS = $(am_singlessolver_OBJECTS)
+singlessolver_DEPENDENCIES = libsingles3_a-singles.$(OBJEXT)
+am_sixteen_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./sixteen.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/sixteen-icon.$(OBJEXT)
+sixteen_OBJECTS = $(am_sixteen_OBJECTS)
+sixteen_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_slant_OBJECTS = ./drawing.$(OBJEXT) ./dsf.$(OBJEXT) \
+       ./findloop.$(OBJEXT) ./gtk.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./midend.$(OBJEXT) ./misc.$(OBJEXT) ./printing.$(OBJEXT) \
+       ./ps.$(OBJEXT) ./random.$(OBJEXT) ./slant.$(OBJEXT) \
+       ./version.$(OBJEXT) icons/slant-icon.$(OBJEXT)
+slant_OBJECTS = $(am_slant_OBJECTS)
+slant_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_slantsolver_OBJECTS = ./dsf.$(OBJEXT) ./findloop.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./misc.$(OBJEXT) ./nullfe.$(OBJEXT) \
+       ./random.$(OBJEXT)
+slantsolver_OBJECTS = $(am_slantsolver_OBJECTS)
+slantsolver_DEPENDENCIES = libslant2_a-slant.$(OBJEXT)
+am_solo_OBJECTS = ./divvy.$(OBJEXT) ./drawing.$(OBJEXT) \
+       ./dsf.$(OBJEXT) ./gtk.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./midend.$(OBJEXT) ./misc.$(OBJEXT) ./printing.$(OBJEXT) \
+       ./ps.$(OBJEXT) ./random.$(OBJEXT) ./solo.$(OBJEXT) \
+       ./version.$(OBJEXT) icons/solo-icon.$(OBJEXT)
+solo_OBJECTS = $(am_solo_OBJECTS)
+solo_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_solosolver_OBJECTS = ./divvy.$(OBJEXT) ./dsf.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./misc.$(OBJEXT) ./nullfe.$(OBJEXT) \
+       ./random.$(OBJEXT)
+solosolver_OBJECTS = $(am_solosolver_OBJECTS)
+solosolver_DEPENDENCIES = libsolo2_a-solo.$(OBJEXT)
+am_tents_OBJECTS = ./drawing.$(OBJEXT) ./dsf.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./maxflow.$(OBJEXT) ./midend.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./printing.$(OBJEXT) ./ps.$(OBJEXT) \
+       ./random.$(OBJEXT) ./tents.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/tents-icon.$(OBJEXT)
+tents_OBJECTS = $(am_tents_OBJECTS)
+tents_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_tentssolver_OBJECTS = ./dsf.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./maxflow.$(OBJEXT) ./misc.$(OBJEXT) ./nullfe.$(OBJEXT) \
+       ./random.$(OBJEXT)
+tentssolver_OBJECTS = $(am_tentssolver_OBJECTS)
+tentssolver_DEPENDENCIES = libtents3_a-tents.$(OBJEXT)
+am_towers_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./latin.$(OBJEXT) ./malloc.$(OBJEXT) ./maxflow.$(OBJEXT) \
+       ./midend.$(OBJEXT) ./misc.$(OBJEXT) ./printing.$(OBJEXT) \
+       ./ps.$(OBJEXT) ./random.$(OBJEXT) ./towers.$(OBJEXT) \
+       ./tree234.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/towers-icon.$(OBJEXT)
+towers_OBJECTS = $(am_towers_OBJECTS)
+towers_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_towerssolver_OBJECTS = ./malloc.$(OBJEXT) ./maxflow.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./nullfe.$(OBJEXT) ./random.$(OBJEXT) \
+       ./tree234.$(OBJEXT)
+towerssolver_OBJECTS = $(am_towerssolver_OBJECTS)
+towerssolver_DEPENDENCIES = liblatin6_a-latin.$(OBJEXT) \
+       libtowers2_a-towers.$(OBJEXT)
+am_tracks_OBJECTS = ./drawing.$(OBJEXT) ./dsf.$(OBJEXT) \
+       ./findloop.$(OBJEXT) ./gtk.$(OBJEXT) ./malloc.$(OBJEXT) \
+       ./midend.$(OBJEXT) ./misc.$(OBJEXT) ./printing.$(OBJEXT) \
+       ./ps.$(OBJEXT) ./random.$(OBJEXT) ./tracks.$(OBJEXT) \
+       ./version.$(OBJEXT) icons/tracks-icon.$(OBJEXT)
+tracks_OBJECTS = $(am_tracks_OBJECTS)
+tracks_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_twiddle_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./twiddle.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/twiddle-icon.$(OBJEXT)
+twiddle_OBJECTS = $(am_twiddle_OBJECTS)
+twiddle_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_undead_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./undead.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/undead-icon.$(OBJEXT)
+undead_OBJECTS = $(am_undead_OBJECTS)
+undead_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_unequal_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./latin.$(OBJEXT) ./malloc.$(OBJEXT) ./maxflow.$(OBJEXT) \
+       ./midend.$(OBJEXT) ./misc.$(OBJEXT) ./printing.$(OBJEXT) \
+       ./ps.$(OBJEXT) ./random.$(OBJEXT) ./tree234.$(OBJEXT) \
+       ./unequal.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/unequal-icon.$(OBJEXT)
+unequal_OBJECTS = $(am_unequal_OBJECTS)
+unequal_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_unequalsolver_OBJECTS = ./malloc.$(OBJEXT) ./maxflow.$(OBJEXT) \
+       ./misc.$(OBJEXT) ./nullfe.$(OBJEXT) ./random.$(OBJEXT) \
+       ./tree234.$(OBJEXT)
+unequalsolver_OBJECTS = $(am_unequalsolver_OBJECTS)
+unequalsolver_DEPENDENCIES = liblatin6_a-latin.$(OBJEXT) \
+       libunequal2_a-unequal.$(OBJEXT)
+am_unruly_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./unruly.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/unruly-icon.$(OBJEXT)
+unruly_OBJECTS = $(am_unruly_OBJECTS)
+unruly_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_unrulysolver_OBJECTS = ./malloc.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./nullfe.$(OBJEXT) ./random.$(OBJEXT)
+unrulysolver_OBJECTS = $(am_unrulysolver_OBJECTS)
+unrulysolver_DEPENDENCIES = libunruly2_a-unruly.$(OBJEXT)
+am_untangle_OBJECTS = ./drawing.$(OBJEXT) ./gtk.$(OBJEXT) \
+       ./malloc.$(OBJEXT) ./midend.$(OBJEXT) ./misc.$(OBJEXT) \
+       ./printing.$(OBJEXT) ./ps.$(OBJEXT) ./random.$(OBJEXT) \
+       ./tree234.$(OBJEXT) ./untangle.$(OBJEXT) ./version.$(OBJEXT) \
+       icons/untangle-icon.$(OBJEXT)
+untangle_OBJECTS = $(am_untangle_OBJECTS)
+untangle_DEPENDENCIES = $(am__DEPENDENCIES_1)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libfifteen2_a_SOURCES) $(libfilling2_a_SOURCES) \
+       $(libgalaxie2_a_SOURCES) $(libgalaxie4_a_SOURCES) \
+       $(libkeen2_a_SOURCES) $(liblatin6_a_SOURCES) \
+       $(liblatin8_a_SOURCES) $(liblightup2_a_SOURCES) \
+       $(libloopy2_a_SOURCES) $(libmagnets2_a_SOURCES) \
+       $(libmap2_a_SOURCES) $(libmines2_a_SOURCES) \
+       $(libpattern2_a_SOURCES) $(libpattern4_a_SOURCES) \
+       $(libpearl2_a_SOURCES) $(libsignpos2_a_SOURCES) \
+       $(libsingles3_a_SOURCES) $(libslant2_a_SOURCES) \
+       $(libsolo2_a_SOURCES) $(libtents3_a_SOURCES) \
+       $(libtowers2_a_SOURCES) $(libunequal2_a_SOURCES) \
+       $(libunruly2_a_SOURCES) $(blackbox_SOURCES) $(bridges_SOURCES) \
+       $(cube_SOURCES) $(dominosa_SOURCES) $(fifteen_SOURCES) \
+       $(fifteensolver_SOURCES) $(filling_SOURCES) \
+       $(fillingsolver_SOURCES) $(flip_SOURCES) $(flood_SOURCES) \
+       $(galaxies_SOURCES) $(galaxiespicture_SOURCES) \
+       $(galaxiessolver_SOURCES) $(guess_SOURCES) $(inertia_SOURCES) \
+       $(keen_SOURCES) $(keensolver_SOURCES) $(latincheck_SOURCES) \
+       $(lightup_SOURCES) $(lightupsolver_SOURCES) $(loopy_SOURCES) \
+       $(loopysolver_SOURCES) $(magnets_SOURCES) \
+       $(magnetssolver_SOURCES) $(map_SOURCES) $(mapsolver_SOURCES) \
+       $(mineobfusc_SOURCES) $(mines_SOURCES) $(net_SOURCES) \
+       $(netslide_SOURCES) $(nullgame_SOURCES) $(obfusc_SOURCES) \
+       $(palisade_SOURCES) $(pattern_SOURCES) \
+       $(patternpicture_SOURCES) $(patternsolver_SOURCES) \
+       $(pearl_SOURCES) $(pearlbench_SOURCES) $(pegs_SOURCES) \
+       $(range_SOURCES) $(rect_SOURCES) $(samegame_SOURCES) \
+       $(signpost_SOURCES) $(signpostsolver_SOURCES) \
+       $(singles_SOURCES) $(singlessolver_SOURCES) $(sixteen_SOURCES) \
+       $(slant_SOURCES) $(slantsolver_SOURCES) $(solo_SOURCES) \
+       $(solosolver_SOURCES) $(tents_SOURCES) $(tentssolver_SOURCES) \
+       $(towers_SOURCES) $(towerssolver_SOURCES) $(tracks_SOURCES) \
+       $(twiddle_SOURCES) $(undead_SOURCES) $(unequal_SOURCES) \
+       $(unequalsolver_SOURCES) $(unruly_SOURCES) \
+       $(unrulysolver_SOURCES) $(untangle_SOURCES)
+DIST_SOURCES = $(libfifteen2_a_SOURCES) $(libfilling2_a_SOURCES) \
+       $(libgalaxie2_a_SOURCES) $(libgalaxie4_a_SOURCES) \
+       $(libkeen2_a_SOURCES) $(liblatin6_a_SOURCES) \
+       $(liblatin8_a_SOURCES) $(liblightup2_a_SOURCES) \
+       $(libloopy2_a_SOURCES) $(libmagnets2_a_SOURCES) \
+       $(libmap2_a_SOURCES) $(libmines2_a_SOURCES) \
+       $(libpattern2_a_SOURCES) $(libpattern4_a_SOURCES) \
+       $(libpearl2_a_SOURCES) $(libsignpos2_a_SOURCES) \
+       $(libsingles3_a_SOURCES) $(libslant2_a_SOURCES) \
+       $(libsolo2_a_SOURCES) $(libtents3_a_SOURCES) \
+       $(libtowers2_a_SOURCES) $(libunequal2_a_SOURCES) \
+       $(libunruly2_a_SOURCES) $(blackbox_SOURCES) $(bridges_SOURCES) \
+       $(cube_SOURCES) $(dominosa_SOURCES) $(fifteen_SOURCES) \
+       $(fifteensolver_SOURCES) $(filling_SOURCES) \
+       $(fillingsolver_SOURCES) $(flip_SOURCES) $(flood_SOURCES) \
+       $(galaxies_SOURCES) $(galaxiespicture_SOURCES) \
+       $(galaxiessolver_SOURCES) $(guess_SOURCES) $(inertia_SOURCES) \
+       $(keen_SOURCES) $(keensolver_SOURCES) $(latincheck_SOURCES) \
+       $(lightup_SOURCES) $(lightupsolver_SOURCES) $(loopy_SOURCES) \
+       $(loopysolver_SOURCES) $(magnets_SOURCES) \
+       $(magnetssolver_SOURCES) $(map_SOURCES) $(mapsolver_SOURCES) \
+       $(mineobfusc_SOURCES) $(mines_SOURCES) $(net_SOURCES) \
+       $(netslide_SOURCES) $(nullgame_SOURCES) $(obfusc_SOURCES) \
+       $(palisade_SOURCES) $(pattern_SOURCES) \
+       $(patternpicture_SOURCES) $(patternsolver_SOURCES) \
+       $(pearl_SOURCES) $(pearlbench_SOURCES) $(pegs_SOURCES) \
+       $(range_SOURCES) $(rect_SOURCES) $(samegame_SOURCES) \
+       $(signpost_SOURCES) $(signpostsolver_SOURCES) \
+       $(singles_SOURCES) $(singlessolver_SOURCES) $(sixteen_SOURCES) \
+       $(slant_SOURCES) $(slantsolver_SOURCES) $(solo_SOURCES) \
+       $(solosolver_SOURCES) $(tents_SOURCES) $(tentssolver_SOURCES) \
+       $(towers_SOURCES) $(towerssolver_SOURCES) $(tracks_SOURCES) \
+       $(twiddle_SOURCES) $(undead_SOURCES) $(unequal_SOURCES) \
+       $(unequalsolver_SOURCES) $(unruly_SOURCES) \
+       $(unrulysolver_SOURCES) $(untangle_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+AM_RECURSIVE_TARGETS = cscope
+am__DIST_COMMON = $(srcdir)/Makefile.in README compile depcomp \
+       install-sh missing
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EXEEXT = @EXEEXT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+GAMES = blackbox bridges cube dominosa fifteen filling flip flood \
+       galaxies guess inertia keen lightup loopy magnets map mines \
+       net netslide palisade pattern pearl pegs range rect samegame \
+       signpost singles sixteen slant solo tents towers tracks \
+       twiddle undead unequal unruly untangle
+AUTOMAKE_OPTIONS = subdir-objects
+allsources = ./blackbox.c ./bridges.c ./combi.c ./cube.c ./divvy.c \
+               ./dominosa.c ./drawing.c ./dsf.c ./fifteen.c ./filling.c \
+               ./findloop.c ./flip.c ./flood.c ./galaxies.c ./grid.c \
+               ./grid.h ./gtk.c ./guess.c ./inertia.c ./keen.c ./latin.c \
+               ./latin.h ./laydomino.c ./lightup.c ./list.c ./loopgen.c \
+               ./loopgen.h ./loopy.c ./magnets.c ./malloc.c ./map.c \
+               ./maxflow.c ./maxflow.h ./midend.c ./mines.c ./misc.c \
+               ./net.c ./netslide.c ./no-icon.c ./nullfe.c ./nullgame.c \
+               ./obfusc.c ./osx.m ./palisade.c ./pattern.c ./pearl.c \
+               ./pegs.c ./penrose.c ./penrose.h ./printing.c ./ps.c \
+               ./puzzles.h ./random.c ./range.c ./rect.c ./resource.h \
+               ./samegame.c ./signpost.c ./singles.c ./sixteen.c ./slant.c \
+               ./solo.c ./tdq.c ./tents.c ./towers.c ./tracks.c ./tree234.c \
+               ./tree234.h ./twiddle.c ./undead.c ./unequal.c ./unruly.c \
+               ./untangle.c ./version.c ./version.h ./windows.c \
+               icons/blackbox-icon.c icons/bridges-icon.c icons/cube-icon.c \
+               icons/dominosa-icon.c icons/fifteen-icon.c \
+               icons/filling-icon.c icons/flip-icon.c icons/flood-icon.c \
+               icons/galaxies-icon.c icons/guess-icon.c \
+               icons/inertia-icon.c icons/keen-icon.c icons/lightup-icon.c \
+               icons/loopy-icon.c icons/magnets-icon.c icons/map-icon.c \
+               icons/mines-icon.c icons/net-icon.c icons/netslide-icon.c \
+               icons/palisade-icon.c icons/pattern-icon.c \
+               icons/pearl-icon.c icons/pegs-icon.c icons/range-icon.c \
+               icons/rect-icon.c icons/samegame-icon.c \
+               icons/signpost-icon.c icons/singles-icon.c \
+               icons/sixteen-icon.c icons/slant-icon.c icons/solo-icon.c \
+               icons/tents-icon.c icons/towers-icon.c icons/tracks-icon.c \
+               icons/twiddle-icon.c icons/undead-icon.c \
+               icons/unequal-icon.c icons/unruly-icon.c \
+               icons/untangle-icon.c
+
+AM_CPPFLAGS = -I$(srcdir)/./ -I$(srcdir)/icons/ 
+AM_CFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)
+blackbox_SOURCES = ./blackbox.c ./drawing.c ./gtk.c ./malloc.c ./midend.c \
+               ./misc.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./version.c ./version.h icons/blackbox-icon.c
+
+blackbox_LDADD = $(GTK_LIBS) -lm
+bridges_SOURCES = ./bridges.c ./drawing.c ./dsf.c ./findloop.c ./gtk.c \
+               ./malloc.c ./midend.c ./misc.c ./printing.c ./ps.c \
+               ./puzzles.h ./random.c ./version.c ./version.h \
+               icons/bridges-icon.c
+
+bridges_LDADD = $(GTK_LIBS) -lm
+cube_SOURCES = ./cube.c ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./version.c \
+               ./version.h icons/cube-icon.c
+
+cube_LDADD = $(GTK_LIBS) -lm
+dominosa_SOURCES = ./dominosa.c ./drawing.c ./gtk.c ./laydomino.c ./malloc.c \
+               ./midend.c ./misc.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./version.c ./version.h icons/dominosa-icon.c
+
+dominosa_LDADD = $(GTK_LIBS) -lm
+fifteen_SOURCES = ./drawing.c ./fifteen.c ./gtk.c ./malloc.c ./midend.c \
+               ./misc.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./version.c ./version.h icons/fifteen-icon.c
+
+fifteen_LDADD = $(GTK_LIBS) -lm
+fifteensolver_SOURCES = ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+
+fifteensolver_LDADD = libfifteen2_a-fifteen.$(OBJEXT) -lm
+filling_SOURCES = ./drawing.c ./dsf.c ./filling.c ./gtk.c ./malloc.c \
+               ./midend.c ./misc.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./version.c ./version.h icons/filling-icon.c
+
+filling_LDADD = $(GTK_LIBS) -lm
+fillingsolver_SOURCES = ./dsf.c ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+
+fillingsolver_LDADD = libfilling2_a-filling.$(OBJEXT) -lm
+flip_SOURCES = ./drawing.c ./flip.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./tree234.c \
+               ./tree234.h ./version.c ./version.h icons/flip-icon.c
+
+flip_LDADD = $(GTK_LIBS) -lm
+flood_SOURCES = ./drawing.c ./flood.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./version.c \
+               ./version.h icons/flood-icon.c
+
+flood_LDADD = $(GTK_LIBS) -lm
+galaxies_SOURCES = ./drawing.c ./dsf.c ./galaxies.c ./gtk.c ./malloc.c \
+               ./midend.c ./misc.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./version.c ./version.h icons/galaxies-icon.c
+
+galaxies_LDADD = $(GTK_LIBS) -lm
+galaxiespicture_SOURCES = ./dsf.c ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+
+galaxiespicture_LDADD = libgalaxie4_a-galaxies.$(OBJEXT) -lm
+galaxiessolver_SOURCES = ./dsf.c ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+
+galaxiessolver_LDADD = libgalaxie2_a-galaxies.$(OBJEXT) -lm
+guess_SOURCES = ./drawing.c ./gtk.c ./guess.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./version.c \
+               ./version.h icons/guess-icon.c
+
+guess_LDADD = $(GTK_LIBS) -lm
+inertia_SOURCES = ./drawing.c ./gtk.c ./inertia.c ./malloc.c ./midend.c \
+               ./misc.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./version.c ./version.h icons/inertia-icon.c
+
+inertia_LDADD = $(GTK_LIBS) -lm
+keen_SOURCES = ./drawing.c ./dsf.c ./gtk.c ./keen.c ./latin.c ./latin.h \
+               ./malloc.c ./maxflow.c ./maxflow.h ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./tree234.c \
+               ./tree234.h ./version.c ./version.h icons/keen-icon.c
+
+keen_LDADD = $(GTK_LIBS) -lm
+keensolver_SOURCES = ./dsf.c ./malloc.c ./maxflow.c ./maxflow.h ./misc.c \
+               ./nullfe.c ./puzzles.h ./random.c ./tree234.c ./tree234.h
+
+keensolver_LDADD = libkeen2_a-keen.$(OBJEXT) liblatin6_a-latin.$(OBJEXT) -lm
+latincheck_SOURCES = ./malloc.c ./maxflow.c ./maxflow.h ./misc.c ./nullfe.c \
+               ./puzzles.h ./random.c ./tree234.c ./tree234.h
+
+latincheck_LDADD = liblatin8_a-latin.$(OBJEXT) -lm
+lightup_SOURCES = ./combi.c ./drawing.c ./gtk.c ./lightup.c ./malloc.c \
+               ./midend.c ./misc.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./version.c ./version.h icons/lightup-icon.c
+
+lightup_LDADD = $(GTK_LIBS) -lm
+lightupsolver_SOURCES = ./combi.c ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+
+lightupsolver_LDADD = liblightup2_a-lightup.$(OBJEXT) -lm
+loopy_SOURCES = ./drawing.c ./dsf.c ./grid.c ./grid.h ./gtk.c ./loopgen.c \
+               ./loopgen.h ./loopy.c ./malloc.c ./midend.c ./misc.c \
+               ./penrose.c ./penrose.h ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./tree234.c ./tree234.h ./version.c ./version.h \
+               icons/loopy-icon.c
+
+loopy_LDADD = $(GTK_LIBS) -lm
+loopysolver_SOURCES = ./dsf.c ./grid.c ./grid.h ./loopgen.c ./loopgen.h \
+               ./malloc.c ./misc.c ./nullfe.c ./penrose.c ./penrose.h \
+               ./puzzles.h ./random.c ./tree234.c ./tree234.h
+
+loopysolver_LDADD = libloopy2_a-loopy.$(OBJEXT) -lm
+magnets_SOURCES = ./drawing.c ./gtk.c ./laydomino.c ./magnets.c ./malloc.c \
+               ./midend.c ./misc.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./version.c ./version.h icons/magnets-icon.c
+
+magnets_LDADD = $(GTK_LIBS) -lm
+magnetssolver_SOURCES = ./laydomino.c ./malloc.c ./misc.c ./nullfe.c \
+               ./puzzles.h ./random.c
+
+magnetssolver_LDADD = libmagnets2_a-magnets.$(OBJEXT) -lm
+map_SOURCES = ./drawing.c ./dsf.c ./gtk.c ./malloc.c ./map.c ./midend.c \
+               ./misc.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./version.c ./version.h icons/map-icon.c
+
+map_LDADD = $(GTK_LIBS) -lm
+mapsolver_SOURCES = ./dsf.c ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+
+mapsolver_LDADD = libmap2_a-map.$(OBJEXT) -lm
+mineobfusc_SOURCES = ./malloc.c ./misc.c ./nullfe.c ./puzzles.h ./random.c \
+               ./tree234.c ./tree234.h
+
+mineobfusc_LDADD = libmines2_a-mines.$(OBJEXT) -lm
+mines_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./mines.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./tree234.c \
+               ./tree234.h ./version.c ./version.h icons/mines-icon.c
+
+mines_LDADD = $(GTK_LIBS) -lm
+net_SOURCES = ./drawing.c ./dsf.c ./findloop.c ./gtk.c ./malloc.c ./midend.c \
+               ./misc.c ./net.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./tree234.c ./tree234.h ./version.c ./version.h \
+               icons/net-icon.c
+
+net_LDADD = $(GTK_LIBS) -lm
+netslide_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./netslide.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./tree234.c ./tree234.h ./version.c ./version.h \
+               icons/netslide-icon.c
+
+netslide_LDADD = $(GTK_LIBS) -lm
+nullgame_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./no-icon.c ./nullgame.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./version.c ./version.h
+
+nullgame_LDADD = $(GTK_LIBS) -lm
+obfusc_SOURCES = ./malloc.c ./misc.c ./nullfe.c ./obfusc.c ./puzzles.h \
+               ./random.c
+
+obfusc_LDADD = -lm
+palisade_SOURCES = ./divvy.c ./drawing.c ./dsf.c ./gtk.c ./malloc.c \
+               ./midend.c ./misc.c ./palisade.c ./printing.c ./ps.c \
+               ./puzzles.h ./random.c ./version.c ./version.h \
+               icons/palisade-icon.c
+
+palisade_LDADD = $(GTK_LIBS) -lm
+pattern_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./pattern.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./version.c ./version.h icons/pattern-icon.c
+
+pattern_LDADD = $(GTK_LIBS) -lm
+patternpicture_SOURCES = ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+
+patternpicture_LDADD = libpattern4_a-pattern.$(OBJEXT) -lm
+patternsolver_SOURCES = ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+
+patternsolver_LDADD = libpattern2_a-pattern.$(OBJEXT) -lm
+pearl_SOURCES = ./drawing.c ./dsf.c ./grid.c ./grid.h ./gtk.c ./loopgen.c \
+               ./loopgen.h ./malloc.c ./midend.c ./misc.c ./pearl.c \
+               ./penrose.c ./penrose.h ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./tdq.c ./tree234.c ./tree234.h ./version.c \
+               ./version.h icons/pearl-icon.c
+
+pearl_LDADD = $(GTK_LIBS) -lm
+pearlbench_SOURCES = ./dsf.c ./grid.c ./grid.h ./loopgen.c ./loopgen.h \
+               ./malloc.c ./misc.c ./nullfe.c ./penrose.c ./penrose.h \
+               ./puzzles.h ./random.c ./tdq.c ./tree234.c ./tree234.h
+
+pearlbench_LDADD = libpearl2_a-pearl.$(OBJEXT) -lm
+pegs_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c ./pegs.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./tree234.c \
+               ./tree234.h ./version.c ./version.h icons/pegs-icon.c
+
+pegs_LDADD = $(GTK_LIBS) -lm
+range_SOURCES = ./drawing.c ./dsf.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./range.c \
+               ./version.c ./version.h icons/range-icon.c
+
+range_LDADD = $(GTK_LIBS) -lm
+rect_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./rect.c \
+               ./version.c ./version.h icons/rect-icon.c
+
+rect_LDADD = $(GTK_LIBS) -lm
+samegame_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./samegame.c \
+               ./version.c ./version.h icons/samegame-icon.c
+
+samegame_LDADD = $(GTK_LIBS) -lm
+signpost_SOURCES = ./drawing.c ./dsf.c ./gtk.c ./malloc.c ./midend.c \
+               ./misc.c ./printing.c ./ps.c ./puzzles.h ./random.c \
+               ./signpost.c ./version.c ./version.h icons/signpost-icon.c
+
+signpost_LDADD = $(GTK_LIBS) -lm
+signpostsolver_SOURCES = ./dsf.c ./malloc.c ./misc.c ./nullfe.c ./puzzles.h \
+               ./random.c
+
+signpostsolver_LDADD = libsignpos2_a-signpost.$(OBJEXT) -lm
+singles_SOURCES = ./drawing.c ./dsf.c ./gtk.c ./latin.c ./latin.h ./malloc.c \
+               ./maxflow.c ./maxflow.h ./midend.c ./misc.c ./printing.c \
+               ./ps.c ./puzzles.h ./random.c ./singles.c ./tree234.c \
+               ./tree234.h ./version.c ./version.h icons/singles-icon.c
+
+singles_LDADD = $(GTK_LIBS) -lm
+singlessolver_SOURCES = ./dsf.c ./latin.c ./latin.h ./malloc.c ./maxflow.c \
+               ./maxflow.h ./misc.c ./nullfe.c ./puzzles.h ./random.c \
+               ./tree234.c ./tree234.h
+
+singlessolver_LDADD = libsingles3_a-singles.$(OBJEXT) -lm
+sixteen_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./sixteen.c \
+               ./version.c ./version.h icons/sixteen-icon.c
+
+sixteen_LDADD = $(GTK_LIBS) -lm
+slant_SOURCES = ./drawing.c ./dsf.c ./findloop.c ./gtk.c ./malloc.c \
+               ./midend.c ./misc.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./slant.c ./version.c ./version.h \
+               icons/slant-icon.c
+
+slant_LDADD = $(GTK_LIBS) -lm
+slantsolver_SOURCES = ./dsf.c ./findloop.c ./malloc.c ./misc.c ./nullfe.c \
+               ./puzzles.h ./random.c
+
+slantsolver_LDADD = libslant2_a-slant.$(OBJEXT) -lm
+solo_SOURCES = ./divvy.c ./drawing.c ./dsf.c ./gtk.c ./malloc.c ./midend.c \
+               ./misc.c ./printing.c ./ps.c ./puzzles.h ./random.c ./solo.c \
+               ./version.c ./version.h icons/solo-icon.c
+
+solo_LDADD = $(GTK_LIBS) -lm
+solosolver_SOURCES = ./divvy.c ./dsf.c ./malloc.c ./misc.c ./nullfe.c \
+               ./puzzles.h ./random.c
+
+solosolver_LDADD = libsolo2_a-solo.$(OBJEXT) -lm
+tents_SOURCES = ./drawing.c ./dsf.c ./gtk.c ./malloc.c ./maxflow.c \
+               ./maxflow.h ./midend.c ./misc.c ./printing.c ./ps.c \
+               ./puzzles.h ./random.c ./tents.c ./version.c ./version.h \
+               icons/tents-icon.c
+
+tents_LDADD = $(GTK_LIBS) -lm
+tentssolver_SOURCES = ./dsf.c ./malloc.c ./maxflow.c ./maxflow.h ./misc.c \
+               ./nullfe.c ./puzzles.h ./random.c
+
+tentssolver_LDADD = libtents3_a-tents.$(OBJEXT) -lm
+towers_SOURCES = ./drawing.c ./gtk.c ./latin.c ./latin.h ./malloc.c \
+               ./maxflow.c ./maxflow.h ./midend.c ./misc.c ./printing.c \
+               ./ps.c ./puzzles.h ./random.c ./towers.c ./tree234.c \
+               ./tree234.h ./version.c ./version.h icons/towers-icon.c
+
+towers_LDADD = $(GTK_LIBS) -lm
+towerssolver_SOURCES = ./malloc.c ./maxflow.c ./maxflow.h ./misc.c \
+               ./nullfe.c ./puzzles.h ./random.c ./tree234.c ./tree234.h
+
+towerssolver_LDADD = liblatin6_a-latin.$(OBJEXT) \
+               libtowers2_a-towers.$(OBJEXT) -lm
+
+tracks_SOURCES = ./drawing.c ./dsf.c ./findloop.c ./gtk.c ./malloc.c \
+               ./midend.c ./misc.c ./printing.c ./ps.c ./puzzles.h \
+               ./random.c ./tracks.c ./version.c ./version.h \
+               icons/tracks-icon.c
+
+tracks_LDADD = $(GTK_LIBS) -lm
+twiddle_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./twiddle.c \
+               ./version.c ./version.h icons/twiddle-icon.c
+
+twiddle_LDADD = $(GTK_LIBS) -lm
+undead_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./undead.c \
+               ./version.c ./version.h icons/undead-icon.c
+
+undead_LDADD = $(GTK_LIBS) -lm
+unequal_SOURCES = ./drawing.c ./gtk.c ./latin.c ./latin.h ./malloc.c \
+               ./maxflow.c ./maxflow.h ./midend.c ./misc.c ./printing.c \
+               ./ps.c ./puzzles.h ./random.c ./tree234.c ./tree234.h \
+               ./unequal.c ./version.c ./version.h icons/unequal-icon.c
+
+unequal_LDADD = $(GTK_LIBS) -lm
+unequalsolver_SOURCES = ./malloc.c ./maxflow.c ./maxflow.h ./misc.c \
+               ./nullfe.c ./puzzles.h ./random.c ./tree234.c ./tree234.h
+
+unequalsolver_LDADD = liblatin6_a-latin.$(OBJEXT) \
+               libunequal2_a-unequal.$(OBJEXT) -lm
+
+unruly_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./unruly.c \
+               ./version.c ./version.h icons/unruly-icon.c
+
+unruly_LDADD = $(GTK_LIBS) -lm
+unrulysolver_SOURCES = ./malloc.c ./misc.c ./nullfe.c ./puzzles.h ./random.c
+unrulysolver_LDADD = libunruly2_a-unruly.$(OBJEXT) -lm
+untangle_SOURCES = ./drawing.c ./gtk.c ./malloc.c ./midend.c ./misc.c \
+               ./printing.c ./ps.c ./puzzles.h ./random.c ./tree234.c \
+               ./tree234.h ./untangle.c ./version.c ./version.h \
+               icons/untangle-icon.c
+
+untangle_LDADD = $(GTK_LIBS) -lm
+libfifteen2_a_SOURCES = ./fifteen.c ./puzzles.h
+libfifteen2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libfilling2_a_SOURCES = ./filling.c ./puzzles.h
+libfilling2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libgalaxie2_a_SOURCES = ./galaxies.c ./puzzles.h
+libgalaxie2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libgalaxie4_a_SOURCES = ./galaxies.c ./puzzles.h
+libgalaxie4_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  \
+               -DSTANDALONE_PICTURE_GENERATOR
+
+libkeen2_a_SOURCES = ./keen.c ./puzzles.h ./latin.h
+libkeen2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+liblatin6_a_SOURCES = ./latin.c ./puzzles.h ./tree234.h ./maxflow.h \
+               ./latin.h
+
+liblatin6_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+liblatin8_a_SOURCES = ./latin.c ./puzzles.h ./tree234.h ./maxflow.h \
+               ./latin.h
+
+liblatin8_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_LATIN_TEST
+liblightup2_a_SOURCES = ./lightup.c ./puzzles.h
+liblightup2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libloopy2_a_SOURCES = ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+libloopy2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libmagnets2_a_SOURCES = ./magnets.c ./puzzles.h
+libmagnets2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libmap2_a_SOURCES = ./map.c ./puzzles.h
+libmap2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libmines2_a_SOURCES = ./mines.c ./tree234.h ./puzzles.h
+libmines2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_OBFUSCATOR
+libpattern2_a_SOURCES = ./pattern.c ./puzzles.h
+libpattern2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libpattern4_a_SOURCES = ./pattern.c ./puzzles.h
+libpattern4_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  \
+               -DSTANDALONE_PICTURE_GENERATOR
+
+libpearl2_a_SOURCES = ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+libpearl2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libsignpos2_a_SOURCES = ./signpost.c ./puzzles.h
+libsignpos2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libsingles3_a_SOURCES = ./singles.c ./puzzles.h ./latin.h
+libsingles3_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libslant2_a_SOURCES = ./slant.c ./puzzles.h
+libslant2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libsolo2_a_SOURCES = ./solo.c ./puzzles.h
+libsolo2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libtents3_a_SOURCES = ./tents.c ./puzzles.h ./maxflow.h
+libtents3_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libtowers2_a_SOURCES = ./towers.c ./puzzles.h ./latin.h
+libtowers2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libunequal2_a_SOURCES = ./unequal.c ./puzzles.h ./latin.h
+libunequal2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+libunruly2_a_SOURCES = ./unruly.c ./puzzles.h
+libunruly2_a_CPPFLAGS = $(GTK_CFLAGS) $(WARNINGOPTS)  -DSTANDALONE_SOLVER
+noinst_LIBRARIES = libfifteen2.a libfilling2.a libgalaxie2.a libgalaxie4.a \
+               libkeen2.a liblatin6.a liblatin8.a liblightup2.a libloopy2.a \
+               libmagnets2.a libmap2.a libmines2.a libpattern2.a \
+               libpattern4.a libpearl2.a libsignpos2.a libsingles3.a \
+               libslant2.a libsolo2.a libtents3.a libtowers2.a \
+               libunequal2.a libunruly2.a
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+am--refresh: Makefile
+       @:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+             $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+       $(am__cd) $(top_srcdir) && \
+         $(AUTOMAKE) --foreign Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           echo ' $(SHELL) ./config.status'; \
+           $(SHELL) ./config.status;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+       $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+       $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+./$(am__dirstamp):
+       @$(MKDIR_P) .
+       @: > ./$(am__dirstamp)
+$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) ./$(DEPDIR)
+       @: > $(DEPDIR)/$(am__dirstamp)
+./libfifteen2_a-fifteen.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libfifteen2.a: $(libfifteen2_a_OBJECTS) $(libfifteen2_a_DEPENDENCIES) $(EXTRA_libfifteen2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libfifteen2.a
+       $(AM_V_AR)$(libfifteen2_a_AR) libfifteen2.a $(libfifteen2_a_OBJECTS) $(libfifteen2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libfifteen2.a
+./libfilling2_a-filling.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libfilling2.a: $(libfilling2_a_OBJECTS) $(libfilling2_a_DEPENDENCIES) $(EXTRA_libfilling2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libfilling2.a
+       $(AM_V_AR)$(libfilling2_a_AR) libfilling2.a $(libfilling2_a_OBJECTS) $(libfilling2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libfilling2.a
+./libgalaxie2_a-galaxies.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libgalaxie2.a: $(libgalaxie2_a_OBJECTS) $(libgalaxie2_a_DEPENDENCIES) $(EXTRA_libgalaxie2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libgalaxie2.a
+       $(AM_V_AR)$(libgalaxie2_a_AR) libgalaxie2.a $(libgalaxie2_a_OBJECTS) $(libgalaxie2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libgalaxie2.a
+./libgalaxie4_a-galaxies.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libgalaxie4.a: $(libgalaxie4_a_OBJECTS) $(libgalaxie4_a_DEPENDENCIES) $(EXTRA_libgalaxie4_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libgalaxie4.a
+       $(AM_V_AR)$(libgalaxie4_a_AR) libgalaxie4.a $(libgalaxie4_a_OBJECTS) $(libgalaxie4_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libgalaxie4.a
+./libkeen2_a-keen.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libkeen2.a: $(libkeen2_a_OBJECTS) $(libkeen2_a_DEPENDENCIES) $(EXTRA_libkeen2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libkeen2.a
+       $(AM_V_AR)$(libkeen2_a_AR) libkeen2.a $(libkeen2_a_OBJECTS) $(libkeen2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libkeen2.a
+./liblatin6_a-latin.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+liblatin6.a: $(liblatin6_a_OBJECTS) $(liblatin6_a_DEPENDENCIES) $(EXTRA_liblatin6_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f liblatin6.a
+       $(AM_V_AR)$(liblatin6_a_AR) liblatin6.a $(liblatin6_a_OBJECTS) $(liblatin6_a_LIBADD)
+       $(AM_V_at)$(RANLIB) liblatin6.a
+./liblatin8_a-latin.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+liblatin8.a: $(liblatin8_a_OBJECTS) $(liblatin8_a_DEPENDENCIES) $(EXTRA_liblatin8_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f liblatin8.a
+       $(AM_V_AR)$(liblatin8_a_AR) liblatin8.a $(liblatin8_a_OBJECTS) $(liblatin8_a_LIBADD)
+       $(AM_V_at)$(RANLIB) liblatin8.a
+./liblightup2_a-lightup.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+liblightup2.a: $(liblightup2_a_OBJECTS) $(liblightup2_a_DEPENDENCIES) $(EXTRA_liblightup2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f liblightup2.a
+       $(AM_V_AR)$(liblightup2_a_AR) liblightup2.a $(liblightup2_a_OBJECTS) $(liblightup2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) liblightup2.a
+./libloopy2_a-loopy.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libloopy2.a: $(libloopy2_a_OBJECTS) $(libloopy2_a_DEPENDENCIES) $(EXTRA_libloopy2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libloopy2.a
+       $(AM_V_AR)$(libloopy2_a_AR) libloopy2.a $(libloopy2_a_OBJECTS) $(libloopy2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libloopy2.a
+./libmagnets2_a-magnets.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libmagnets2.a: $(libmagnets2_a_OBJECTS) $(libmagnets2_a_DEPENDENCIES) $(EXTRA_libmagnets2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libmagnets2.a
+       $(AM_V_AR)$(libmagnets2_a_AR) libmagnets2.a $(libmagnets2_a_OBJECTS) $(libmagnets2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libmagnets2.a
+./libmap2_a-map.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+
+libmap2.a: $(libmap2_a_OBJECTS) $(libmap2_a_DEPENDENCIES) $(EXTRA_libmap2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libmap2.a
+       $(AM_V_AR)$(libmap2_a_AR) libmap2.a $(libmap2_a_OBJECTS) $(libmap2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libmap2.a
+./libmines2_a-mines.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libmines2.a: $(libmines2_a_OBJECTS) $(libmines2_a_DEPENDENCIES) $(EXTRA_libmines2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libmines2.a
+       $(AM_V_AR)$(libmines2_a_AR) libmines2.a $(libmines2_a_OBJECTS) $(libmines2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libmines2.a
+./libpattern2_a-pattern.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libpattern2.a: $(libpattern2_a_OBJECTS) $(libpattern2_a_DEPENDENCIES) $(EXTRA_libpattern2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libpattern2.a
+       $(AM_V_AR)$(libpattern2_a_AR) libpattern2.a $(libpattern2_a_OBJECTS) $(libpattern2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libpattern2.a
+./libpattern4_a-pattern.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libpattern4.a: $(libpattern4_a_OBJECTS) $(libpattern4_a_DEPENDENCIES) $(EXTRA_libpattern4_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libpattern4.a
+       $(AM_V_AR)$(libpattern4_a_AR) libpattern4.a $(libpattern4_a_OBJECTS) $(libpattern4_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libpattern4.a
+./libpearl2_a-pearl.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libpearl2.a: $(libpearl2_a_OBJECTS) $(libpearl2_a_DEPENDENCIES) $(EXTRA_libpearl2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libpearl2.a
+       $(AM_V_AR)$(libpearl2_a_AR) libpearl2.a $(libpearl2_a_OBJECTS) $(libpearl2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libpearl2.a
+./libsignpos2_a-signpost.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libsignpos2.a: $(libsignpos2_a_OBJECTS) $(libsignpos2_a_DEPENDENCIES) $(EXTRA_libsignpos2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libsignpos2.a
+       $(AM_V_AR)$(libsignpos2_a_AR) libsignpos2.a $(libsignpos2_a_OBJECTS) $(libsignpos2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libsignpos2.a
+./libsingles3_a-singles.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libsingles3.a: $(libsingles3_a_OBJECTS) $(libsingles3_a_DEPENDENCIES) $(EXTRA_libsingles3_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libsingles3.a
+       $(AM_V_AR)$(libsingles3_a_AR) libsingles3.a $(libsingles3_a_OBJECTS) $(libsingles3_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libsingles3.a
+./libslant2_a-slant.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libslant2.a: $(libslant2_a_OBJECTS) $(libslant2_a_DEPENDENCIES) $(EXTRA_libslant2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libslant2.a
+       $(AM_V_AR)$(libslant2_a_AR) libslant2.a $(libslant2_a_OBJECTS) $(libslant2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libslant2.a
+./libsolo2_a-solo.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libsolo2.a: $(libsolo2_a_OBJECTS) $(libsolo2_a_DEPENDENCIES) $(EXTRA_libsolo2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libsolo2.a
+       $(AM_V_AR)$(libsolo2_a_AR) libsolo2.a $(libsolo2_a_OBJECTS) $(libsolo2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libsolo2.a
+./libtents3_a-tents.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libtents3.a: $(libtents3_a_OBJECTS) $(libtents3_a_DEPENDENCIES) $(EXTRA_libtents3_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libtents3.a
+       $(AM_V_AR)$(libtents3_a_AR) libtents3.a $(libtents3_a_OBJECTS) $(libtents3_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libtents3.a
+./libtowers2_a-towers.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libtowers2.a: $(libtowers2_a_OBJECTS) $(libtowers2_a_DEPENDENCIES) $(EXTRA_libtowers2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libtowers2.a
+       $(AM_V_AR)$(libtowers2_a_AR) libtowers2.a $(libtowers2_a_OBJECTS) $(libtowers2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libtowers2.a
+./libunequal2_a-unequal.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libunequal2.a: $(libunequal2_a_OBJECTS) $(libunequal2_a_DEPENDENCIES) $(EXTRA_libunequal2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libunequal2.a
+       $(AM_V_AR)$(libunequal2_a_AR) libunequal2.a $(libunequal2_a_OBJECTS) $(libunequal2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libunequal2.a
+./libunruly2_a-unruly.$(OBJEXT): ./$(am__dirstamp) \
+       $(DEPDIR)/$(am__dirstamp)
+
+libunruly2.a: $(libunruly2_a_OBJECTS) $(libunruly2_a_DEPENDENCIES) $(EXTRA_libunruly2_a_DEPENDENCIES) 
+       $(AM_V_at)-rm -f libunruly2.a
+       $(AM_V_AR)$(libunruly2_a_AR) libunruly2.a $(libunruly2_a_OBJECTS) $(libunruly2_a_LIBADD)
+       $(AM_V_at)$(RANLIB) libunruly2.a
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+       if test -n "$$list"; then \
+         echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+         $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+       fi; \
+       for p in $$list; do echo "$$p $$p"; done | \
+       sed 's/$(EXEEXT)$$//' | \
+       while read p p1; do if test -f $$p \
+         ; then echo "$$p"; echo "$$p"; else :; fi; \
+       done | \
+       sed -e 'p;s,.*/,,;n;h' \
+           -e 's|.*|.|' \
+           -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+       sed 'N;N;N;s,\n, ,g' | \
+       $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+         { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+           if ($$2 == $$4) files[d] = files[d] " " $$1; \
+           else { print "f", $$3 "/" $$4, $$1; } } \
+         END { for (d in files) print "f", d, files[d] }' | \
+       while read type dir files; do \
+           if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+           test -z "$$files" || { \
+             echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+             $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+           } \
+       ; done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+       files=`for p in $$list; do echo "$$p"; done | \
+         sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+             -e 's/$$/$(EXEEXT)/' \
+       `; \
+       test -n "$$list" || exit 0; \
+       echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+       cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+clean-noinstPROGRAMS:
+       -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+./blackbox.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./drawing.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./gtk.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./malloc.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./midend.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./misc.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./printing.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./ps.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./random.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./version.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/$(am__dirstamp):
+       @$(MKDIR_P) icons
+       @: > icons/$(am__dirstamp)
+icons/$(DEPDIR)/$(am__dirstamp):
+       @$(MKDIR_P) icons/$(DEPDIR)
+       @: > icons/$(DEPDIR)/$(am__dirstamp)
+icons/blackbox-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+blackbox$(EXEEXT): $(blackbox_OBJECTS) $(blackbox_DEPENDENCIES) $(EXTRA_blackbox_DEPENDENCIES) 
+       @rm -f blackbox$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(blackbox_OBJECTS) $(blackbox_LDADD) $(LIBS)
+./bridges.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./dsf.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./findloop.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/bridges-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+bridges$(EXEEXT): $(bridges_OBJECTS) $(bridges_DEPENDENCIES) $(EXTRA_bridges_DEPENDENCIES) 
+       @rm -f bridges$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(bridges_OBJECTS) $(bridges_LDADD) $(LIBS)
+./cube.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/cube-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+cube$(EXEEXT): $(cube_OBJECTS) $(cube_DEPENDENCIES) $(EXTRA_cube_DEPENDENCIES) 
+       @rm -f cube$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(cube_OBJECTS) $(cube_LDADD) $(LIBS)
+./dominosa.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./laydomino.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/dominosa-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+dominosa$(EXEEXT): $(dominosa_OBJECTS) $(dominosa_DEPENDENCIES) $(EXTRA_dominosa_DEPENDENCIES) 
+       @rm -f dominosa$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(dominosa_OBJECTS) $(dominosa_LDADD) $(LIBS)
+./fifteen.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/fifteen-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+fifteen$(EXEEXT): $(fifteen_OBJECTS) $(fifteen_DEPENDENCIES) $(EXTRA_fifteen_DEPENDENCIES) 
+       @rm -f fifteen$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(fifteen_OBJECTS) $(fifteen_LDADD) $(LIBS)
+./nullfe.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+
+fifteensolver$(EXEEXT): $(fifteensolver_OBJECTS) $(fifteensolver_DEPENDENCIES) $(EXTRA_fifteensolver_DEPENDENCIES) 
+       @rm -f fifteensolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(fifteensolver_OBJECTS) $(fifteensolver_LDADD) $(LIBS)
+./filling.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/filling-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+filling$(EXEEXT): $(filling_OBJECTS) $(filling_DEPENDENCIES) $(EXTRA_filling_DEPENDENCIES) 
+       @rm -f filling$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(filling_OBJECTS) $(filling_LDADD) $(LIBS)
+
+fillingsolver$(EXEEXT): $(fillingsolver_OBJECTS) $(fillingsolver_DEPENDENCIES) $(EXTRA_fillingsolver_DEPENDENCIES) 
+       @rm -f fillingsolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(fillingsolver_OBJECTS) $(fillingsolver_LDADD) $(LIBS)
+./flip.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./tree234.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/flip-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+flip$(EXEEXT): $(flip_OBJECTS) $(flip_DEPENDENCIES) $(EXTRA_flip_DEPENDENCIES) 
+       @rm -f flip$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(flip_OBJECTS) $(flip_LDADD) $(LIBS)
+./flood.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/flood-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+flood$(EXEEXT): $(flood_OBJECTS) $(flood_DEPENDENCIES) $(EXTRA_flood_DEPENDENCIES) 
+       @rm -f flood$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(flood_OBJECTS) $(flood_LDADD) $(LIBS)
+./galaxies.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/galaxies-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+galaxies$(EXEEXT): $(galaxies_OBJECTS) $(galaxies_DEPENDENCIES) $(EXTRA_galaxies_DEPENDENCIES) 
+       @rm -f galaxies$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(galaxies_OBJECTS) $(galaxies_LDADD) $(LIBS)
+
+galaxiespicture$(EXEEXT): $(galaxiespicture_OBJECTS) $(galaxiespicture_DEPENDENCIES) $(EXTRA_galaxiespicture_DEPENDENCIES) 
+       @rm -f galaxiespicture$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(galaxiespicture_OBJECTS) $(galaxiespicture_LDADD) $(LIBS)
+
+galaxiessolver$(EXEEXT): $(galaxiessolver_OBJECTS) $(galaxiessolver_DEPENDENCIES) $(EXTRA_galaxiessolver_DEPENDENCIES) 
+       @rm -f galaxiessolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(galaxiessolver_OBJECTS) $(galaxiessolver_LDADD) $(LIBS)
+./guess.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/guess-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+guess$(EXEEXT): $(guess_OBJECTS) $(guess_DEPENDENCIES) $(EXTRA_guess_DEPENDENCIES) 
+       @rm -f guess$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(guess_OBJECTS) $(guess_LDADD) $(LIBS)
+./inertia.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/inertia-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+inertia$(EXEEXT): $(inertia_OBJECTS) $(inertia_DEPENDENCIES) $(EXTRA_inertia_DEPENDENCIES) 
+       @rm -f inertia$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(inertia_OBJECTS) $(inertia_LDADD) $(LIBS)
+./keen.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./latin.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./maxflow.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/keen-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+keen$(EXEEXT): $(keen_OBJECTS) $(keen_DEPENDENCIES) $(EXTRA_keen_DEPENDENCIES) 
+       @rm -f keen$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(keen_OBJECTS) $(keen_LDADD) $(LIBS)
+
+keensolver$(EXEEXT): $(keensolver_OBJECTS) $(keensolver_DEPENDENCIES) $(EXTRA_keensolver_DEPENDENCIES) 
+       @rm -f keensolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(keensolver_OBJECTS) $(keensolver_LDADD) $(LIBS)
+
+latincheck$(EXEEXT): $(latincheck_OBJECTS) $(latincheck_DEPENDENCIES) $(EXTRA_latincheck_DEPENDENCIES) 
+       @rm -f latincheck$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(latincheck_OBJECTS) $(latincheck_LDADD) $(LIBS)
+./combi.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./lightup.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/lightup-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+lightup$(EXEEXT): $(lightup_OBJECTS) $(lightup_DEPENDENCIES) $(EXTRA_lightup_DEPENDENCIES) 
+       @rm -f lightup$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lightup_OBJECTS) $(lightup_LDADD) $(LIBS)
+
+lightupsolver$(EXEEXT): $(lightupsolver_OBJECTS) $(lightupsolver_DEPENDENCIES) $(EXTRA_lightupsolver_DEPENDENCIES) 
+       @rm -f lightupsolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(lightupsolver_OBJECTS) $(lightupsolver_LDADD) $(LIBS)
+./grid.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./loopgen.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./loopy.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./penrose.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/loopy-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+loopy$(EXEEXT): $(loopy_OBJECTS) $(loopy_DEPENDENCIES) $(EXTRA_loopy_DEPENDENCIES) 
+       @rm -f loopy$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(loopy_OBJECTS) $(loopy_LDADD) $(LIBS)
+
+loopysolver$(EXEEXT): $(loopysolver_OBJECTS) $(loopysolver_DEPENDENCIES) $(EXTRA_loopysolver_DEPENDENCIES) 
+       @rm -f loopysolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(loopysolver_OBJECTS) $(loopysolver_LDADD) $(LIBS)
+./magnets.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/magnets-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+magnets$(EXEEXT): $(magnets_OBJECTS) $(magnets_DEPENDENCIES) $(EXTRA_magnets_DEPENDENCIES) 
+       @rm -f magnets$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(magnets_OBJECTS) $(magnets_LDADD) $(LIBS)
+
+magnetssolver$(EXEEXT): $(magnetssolver_OBJECTS) $(magnetssolver_DEPENDENCIES) $(EXTRA_magnetssolver_DEPENDENCIES) 
+       @rm -f magnetssolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(magnetssolver_OBJECTS) $(magnetssolver_LDADD) $(LIBS)
+./map.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/map-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+map$(EXEEXT): $(map_OBJECTS) $(map_DEPENDENCIES) $(EXTRA_map_DEPENDENCIES) 
+       @rm -f map$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(map_OBJECTS) $(map_LDADD) $(LIBS)
+
+mapsolver$(EXEEXT): $(mapsolver_OBJECTS) $(mapsolver_DEPENDENCIES) $(EXTRA_mapsolver_DEPENDENCIES) 
+       @rm -f mapsolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(mapsolver_OBJECTS) $(mapsolver_LDADD) $(LIBS)
+
+mineobfusc$(EXEEXT): $(mineobfusc_OBJECTS) $(mineobfusc_DEPENDENCIES) $(EXTRA_mineobfusc_DEPENDENCIES) 
+       @rm -f mineobfusc$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(mineobfusc_OBJECTS) $(mineobfusc_LDADD) $(LIBS)
+./mines.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/mines-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+mines$(EXEEXT): $(mines_OBJECTS) $(mines_DEPENDENCIES) $(EXTRA_mines_DEPENDENCIES) 
+       @rm -f mines$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(mines_OBJECTS) $(mines_LDADD) $(LIBS)
+./net.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/net-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+net$(EXEEXT): $(net_OBJECTS) $(net_DEPENDENCIES) $(EXTRA_net_DEPENDENCIES) 
+       @rm -f net$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(net_OBJECTS) $(net_LDADD) $(LIBS)
+./netslide.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/netslide-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+netslide$(EXEEXT): $(netslide_OBJECTS) $(netslide_DEPENDENCIES) $(EXTRA_netslide_DEPENDENCIES) 
+       @rm -f netslide$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(netslide_OBJECTS) $(netslide_LDADD) $(LIBS)
+./no-icon.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./nullgame.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+
+nullgame$(EXEEXT): $(nullgame_OBJECTS) $(nullgame_DEPENDENCIES) $(EXTRA_nullgame_DEPENDENCIES) 
+       @rm -f nullgame$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(nullgame_OBJECTS) $(nullgame_LDADD) $(LIBS)
+./obfusc.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+
+obfusc$(EXEEXT): $(obfusc_OBJECTS) $(obfusc_DEPENDENCIES) $(EXTRA_obfusc_DEPENDENCIES) 
+       @rm -f obfusc$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(obfusc_OBJECTS) $(obfusc_LDADD) $(LIBS)
+./divvy.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./palisade.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/palisade-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+palisade$(EXEEXT): $(palisade_OBJECTS) $(palisade_DEPENDENCIES) $(EXTRA_palisade_DEPENDENCIES) 
+       @rm -f palisade$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(palisade_OBJECTS) $(palisade_LDADD) $(LIBS)
+./pattern.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/pattern-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+pattern$(EXEEXT): $(pattern_OBJECTS) $(pattern_DEPENDENCIES) $(EXTRA_pattern_DEPENDENCIES) 
+       @rm -f pattern$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(pattern_OBJECTS) $(pattern_LDADD) $(LIBS)
+
+patternpicture$(EXEEXT): $(patternpicture_OBJECTS) $(patternpicture_DEPENDENCIES) $(EXTRA_patternpicture_DEPENDENCIES) 
+       @rm -f patternpicture$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(patternpicture_OBJECTS) $(patternpicture_LDADD) $(LIBS)
+
+patternsolver$(EXEEXT): $(patternsolver_OBJECTS) $(patternsolver_DEPENDENCIES) $(EXTRA_patternsolver_DEPENDENCIES) 
+       @rm -f patternsolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(patternsolver_OBJECTS) $(patternsolver_LDADD) $(LIBS)
+./pearl.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+./tdq.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/pearl-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+pearl$(EXEEXT): $(pearl_OBJECTS) $(pearl_DEPENDENCIES) $(EXTRA_pearl_DEPENDENCIES) 
+       @rm -f pearl$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(pearl_OBJECTS) $(pearl_LDADD) $(LIBS)
+
+pearlbench$(EXEEXT): $(pearlbench_OBJECTS) $(pearlbench_DEPENDENCIES) $(EXTRA_pearlbench_DEPENDENCIES) 
+       @rm -f pearlbench$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(pearlbench_OBJECTS) $(pearlbench_LDADD) $(LIBS)
+./pegs.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/pegs-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+pegs$(EXEEXT): $(pegs_OBJECTS) $(pegs_DEPENDENCIES) $(EXTRA_pegs_DEPENDENCIES) 
+       @rm -f pegs$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(pegs_OBJECTS) $(pegs_LDADD) $(LIBS)
+./range.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/range-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+range$(EXEEXT): $(range_OBJECTS) $(range_DEPENDENCIES) $(EXTRA_range_DEPENDENCIES) 
+       @rm -f range$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(range_OBJECTS) $(range_LDADD) $(LIBS)
+./rect.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/rect-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+rect$(EXEEXT): $(rect_OBJECTS) $(rect_DEPENDENCIES) $(EXTRA_rect_DEPENDENCIES) 
+       @rm -f rect$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(rect_OBJECTS) $(rect_LDADD) $(LIBS)
+./samegame.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/samegame-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+samegame$(EXEEXT): $(samegame_OBJECTS) $(samegame_DEPENDENCIES) $(EXTRA_samegame_DEPENDENCIES) 
+       @rm -f samegame$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(samegame_OBJECTS) $(samegame_LDADD) $(LIBS)
+./signpost.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/signpost-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+signpost$(EXEEXT): $(signpost_OBJECTS) $(signpost_DEPENDENCIES) $(EXTRA_signpost_DEPENDENCIES) 
+       @rm -f signpost$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(signpost_OBJECTS) $(signpost_LDADD) $(LIBS)
+
+signpostsolver$(EXEEXT): $(signpostsolver_OBJECTS) $(signpostsolver_DEPENDENCIES) $(EXTRA_signpostsolver_DEPENDENCIES) 
+       @rm -f signpostsolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(signpostsolver_OBJECTS) $(signpostsolver_LDADD) $(LIBS)
+./singles.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/singles-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+singles$(EXEEXT): $(singles_OBJECTS) $(singles_DEPENDENCIES) $(EXTRA_singles_DEPENDENCIES) 
+       @rm -f singles$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(singles_OBJECTS) $(singles_LDADD) $(LIBS)
+
+singlessolver$(EXEEXT): $(singlessolver_OBJECTS) $(singlessolver_DEPENDENCIES) $(EXTRA_singlessolver_DEPENDENCIES) 
+       @rm -f singlessolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(singlessolver_OBJECTS) $(singlessolver_LDADD) $(LIBS)
+./sixteen.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/sixteen-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+sixteen$(EXEEXT): $(sixteen_OBJECTS) $(sixteen_DEPENDENCIES) $(EXTRA_sixteen_DEPENDENCIES) 
+       @rm -f sixteen$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(sixteen_OBJECTS) $(sixteen_LDADD) $(LIBS)
+./slant.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/slant-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+slant$(EXEEXT): $(slant_OBJECTS) $(slant_DEPENDENCIES) $(EXTRA_slant_DEPENDENCIES) 
+       @rm -f slant$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(slant_OBJECTS) $(slant_LDADD) $(LIBS)
+
+slantsolver$(EXEEXT): $(slantsolver_OBJECTS) $(slantsolver_DEPENDENCIES) $(EXTRA_slantsolver_DEPENDENCIES) 
+       @rm -f slantsolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(slantsolver_OBJECTS) $(slantsolver_LDADD) $(LIBS)
+./solo.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/solo-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+solo$(EXEEXT): $(solo_OBJECTS) $(solo_DEPENDENCIES) $(EXTRA_solo_DEPENDENCIES) 
+       @rm -f solo$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(solo_OBJECTS) $(solo_LDADD) $(LIBS)
+
+solosolver$(EXEEXT): $(solosolver_OBJECTS) $(solosolver_DEPENDENCIES) $(EXTRA_solosolver_DEPENDENCIES) 
+       @rm -f solosolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(solosolver_OBJECTS) $(solosolver_LDADD) $(LIBS)
+./tents.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/tents-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+tents$(EXEEXT): $(tents_OBJECTS) $(tents_DEPENDENCIES) $(EXTRA_tents_DEPENDENCIES) 
+       @rm -f tents$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tents_OBJECTS) $(tents_LDADD) $(LIBS)
+
+tentssolver$(EXEEXT): $(tentssolver_OBJECTS) $(tentssolver_DEPENDENCIES) $(EXTRA_tentssolver_DEPENDENCIES) 
+       @rm -f tentssolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tentssolver_OBJECTS) $(tentssolver_LDADD) $(LIBS)
+./towers.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/towers-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+towers$(EXEEXT): $(towers_OBJECTS) $(towers_DEPENDENCIES) $(EXTRA_towers_DEPENDENCIES) 
+       @rm -f towers$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(towers_OBJECTS) $(towers_LDADD) $(LIBS)
+
+towerssolver$(EXEEXT): $(towerssolver_OBJECTS) $(towerssolver_DEPENDENCIES) $(EXTRA_towerssolver_DEPENDENCIES) 
+       @rm -f towerssolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(towerssolver_OBJECTS) $(towerssolver_LDADD) $(LIBS)
+./tracks.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/tracks-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+tracks$(EXEEXT): $(tracks_OBJECTS) $(tracks_DEPENDENCIES) $(EXTRA_tracks_DEPENDENCIES) 
+       @rm -f tracks$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(tracks_OBJECTS) $(tracks_LDADD) $(LIBS)
+./twiddle.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/twiddle-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+twiddle$(EXEEXT): $(twiddle_OBJECTS) $(twiddle_DEPENDENCIES) $(EXTRA_twiddle_DEPENDENCIES) 
+       @rm -f twiddle$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(twiddle_OBJECTS) $(twiddle_LDADD) $(LIBS)
+./undead.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/undead-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+undead$(EXEEXT): $(undead_OBJECTS) $(undead_DEPENDENCIES) $(EXTRA_undead_DEPENDENCIES) 
+       @rm -f undead$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(undead_OBJECTS) $(undead_LDADD) $(LIBS)
+./unequal.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/unequal-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+unequal$(EXEEXT): $(unequal_OBJECTS) $(unequal_DEPENDENCIES) $(EXTRA_unequal_DEPENDENCIES) 
+       @rm -f unequal$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(unequal_OBJECTS) $(unequal_LDADD) $(LIBS)
+
+unequalsolver$(EXEEXT): $(unequalsolver_OBJECTS) $(unequalsolver_DEPENDENCIES) $(EXTRA_unequalsolver_DEPENDENCIES) 
+       @rm -f unequalsolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(unequalsolver_OBJECTS) $(unequalsolver_LDADD) $(LIBS)
+./unruly.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/unruly-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+unruly$(EXEEXT): $(unruly_OBJECTS) $(unruly_DEPENDENCIES) $(EXTRA_unruly_DEPENDENCIES) 
+       @rm -f unruly$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(unruly_OBJECTS) $(unruly_LDADD) $(LIBS)
+
+unrulysolver$(EXEEXT): $(unrulysolver_OBJECTS) $(unrulysolver_DEPENDENCIES) $(EXTRA_unrulysolver_DEPENDENCIES) 
+       @rm -f unrulysolver$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(unrulysolver_OBJECTS) $(unrulysolver_LDADD) $(LIBS)
+./untangle.$(OBJEXT): ./$(am__dirstamp) $(DEPDIR)/$(am__dirstamp)
+icons/untangle-icon.$(OBJEXT): icons/$(am__dirstamp) \
+       icons/$(DEPDIR)/$(am__dirstamp)
+
+untangle$(EXEEXT): $(untangle_OBJECTS) $(untangle_DEPENDENCIES) $(EXTRA_untangle_DEPENDENCIES) 
+       @rm -f untangle$(EXEEXT)
+       $(AM_V_CCLD)$(LINK) $(untangle_OBJECTS) $(untangle_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+       -rm -f ./*.$(OBJEXT)
+       -rm -f icons/*.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blackbox.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bridges.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/combi.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cube.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/divvy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dominosa.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drawing.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fifteen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filling.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/findloop.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flip.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flood.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/galaxies.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grid.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtk.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/guess.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inertia.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/latin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laydomino.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfifteen2_a-fifteen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfilling2_a-filling.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgalaxie2_a-galaxies.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgalaxie4_a-galaxies.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkeen2_a-keen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liblatin6_a-latin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liblatin8_a-latin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liblightup2_a-lightup.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libloopy2_a-loopy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmagnets2_a-magnets.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmap2_a-map.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libmines2_a-mines.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpattern2_a-pattern.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpattern4_a-pattern.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpearl2_a-pearl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsignpos2_a-signpost.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsingles3_a-singles.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libslant2_a-slant.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsolo2_a-solo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtents3_a-tents.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtowers2_a-towers.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunequal2_a-unequal.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libunruly2_a-unruly.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lightup.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loopgen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loopy.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/magnets.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/malloc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/maxflow.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/midend.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mines.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netslide.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/no-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nullfe.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nullgame.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/obfusc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/palisade.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pattern.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pearl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pegs.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/penrose.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printing.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ps.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/range.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rect.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/samegame.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signpost.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/singles.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sixteen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slant.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/solo.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tdq.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tents.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/towers.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tracks.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tree234.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/twiddle.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/undead.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unequal.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unruly.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/untangle.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/blackbox-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/bridges-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/cube-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/dominosa-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/fifteen-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/filling-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/flip-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/flood-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/galaxies-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/guess-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/inertia-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/keen-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/lightup-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/loopy-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/magnets-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/map-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/mines-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/net-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/netslide-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/palisade-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/pattern-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/pearl-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/pegs-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/range-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/rect-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/samegame-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/signpost-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/singles-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/sixteen-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/slant-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/solo-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/tents-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/towers-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/tracks-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/twiddle-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/undead-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/unequal-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/unruly-icon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@icons/$(DEPDIR)/untangle-icon.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+./libfifteen2_a-fifteen.o: ./fifteen.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libfifteen2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libfifteen2_a-fifteen.o -MD -MP -MF $(DEPDIR)/libfifteen2_a-fifteen.Tpo -c -o ./libfifteen2_a-fifteen.o `test -f './fifteen.c' || echo '$(srcdir)/'`./fifteen.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libfifteen2_a-fifteen.Tpo $(DEPDIR)/libfifteen2_a-fifteen.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./fifteen.c' object='./libfifteen2_a-fifteen.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libfifteen2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libfifteen2_a-fifteen.o `test -f './fifteen.c' || echo '$(srcdir)/'`./fifteen.c
+
+./libfifteen2_a-fifteen.obj: ./fifteen.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libfifteen2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libfifteen2_a-fifteen.obj -MD -MP -MF $(DEPDIR)/libfifteen2_a-fifteen.Tpo -c -o ./libfifteen2_a-fifteen.obj `if test -f './fifteen.c'; then $(CYGPATH_W) './fifteen.c'; else $(CYGPATH_W) '$(srcdir)/./fifteen.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libfifteen2_a-fifteen.Tpo $(DEPDIR)/libfifteen2_a-fifteen.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./fifteen.c' object='./libfifteen2_a-fifteen.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libfifteen2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libfifteen2_a-fifteen.obj `if test -f './fifteen.c'; then $(CYGPATH_W) './fifteen.c'; else $(CYGPATH_W) '$(srcdir)/./fifteen.c'; fi`
+
+./libfilling2_a-filling.o: ./filling.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libfilling2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libfilling2_a-filling.o -MD -MP -MF $(DEPDIR)/libfilling2_a-filling.Tpo -c -o ./libfilling2_a-filling.o `test -f './filling.c' || echo '$(srcdir)/'`./filling.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libfilling2_a-filling.Tpo $(DEPDIR)/libfilling2_a-filling.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./filling.c' object='./libfilling2_a-filling.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libfilling2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libfilling2_a-filling.o `test -f './filling.c' || echo '$(srcdir)/'`./filling.c
+
+./libfilling2_a-filling.obj: ./filling.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libfilling2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libfilling2_a-filling.obj -MD -MP -MF $(DEPDIR)/libfilling2_a-filling.Tpo -c -o ./libfilling2_a-filling.obj `if test -f './filling.c'; then $(CYGPATH_W) './filling.c'; else $(CYGPATH_W) '$(srcdir)/./filling.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libfilling2_a-filling.Tpo $(DEPDIR)/libfilling2_a-filling.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./filling.c' object='./libfilling2_a-filling.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libfilling2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libfilling2_a-filling.obj `if test -f './filling.c'; then $(CYGPATH_W) './filling.c'; else $(CYGPATH_W) '$(srcdir)/./filling.c'; fi`
+
+./libgalaxie2_a-galaxies.o: ./galaxies.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgalaxie2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libgalaxie2_a-galaxies.o -MD -MP -MF $(DEPDIR)/libgalaxie2_a-galaxies.Tpo -c -o ./libgalaxie2_a-galaxies.o `test -f './galaxies.c' || echo '$(srcdir)/'`./galaxies.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgalaxie2_a-galaxies.Tpo $(DEPDIR)/libgalaxie2_a-galaxies.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./galaxies.c' object='./libgalaxie2_a-galaxies.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgalaxie2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libgalaxie2_a-galaxies.o `test -f './galaxies.c' || echo '$(srcdir)/'`./galaxies.c
+
+./libgalaxie2_a-galaxies.obj: ./galaxies.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgalaxie2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libgalaxie2_a-galaxies.obj -MD -MP -MF $(DEPDIR)/libgalaxie2_a-galaxies.Tpo -c -o ./libgalaxie2_a-galaxies.obj `if test -f './galaxies.c'; then $(CYGPATH_W) './galaxies.c'; else $(CYGPATH_W) '$(srcdir)/./galaxies.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgalaxie2_a-galaxies.Tpo $(DEPDIR)/libgalaxie2_a-galaxies.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./galaxies.c' object='./libgalaxie2_a-galaxies.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgalaxie2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libgalaxie2_a-galaxies.obj `if test -f './galaxies.c'; then $(CYGPATH_W) './galaxies.c'; else $(CYGPATH_W) '$(srcdir)/./galaxies.c'; fi`
+
+./libgalaxie4_a-galaxies.o: ./galaxies.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgalaxie4_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libgalaxie4_a-galaxies.o -MD -MP -MF $(DEPDIR)/libgalaxie4_a-galaxies.Tpo -c -o ./libgalaxie4_a-galaxies.o `test -f './galaxies.c' || echo '$(srcdir)/'`./galaxies.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgalaxie4_a-galaxies.Tpo $(DEPDIR)/libgalaxie4_a-galaxies.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./galaxies.c' object='./libgalaxie4_a-galaxies.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgalaxie4_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libgalaxie4_a-galaxies.o `test -f './galaxies.c' || echo '$(srcdir)/'`./galaxies.c
+
+./libgalaxie4_a-galaxies.obj: ./galaxies.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgalaxie4_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libgalaxie4_a-galaxies.obj -MD -MP -MF $(DEPDIR)/libgalaxie4_a-galaxies.Tpo -c -o ./libgalaxie4_a-galaxies.obj `if test -f './galaxies.c'; then $(CYGPATH_W) './galaxies.c'; else $(CYGPATH_W) '$(srcdir)/./galaxies.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libgalaxie4_a-galaxies.Tpo $(DEPDIR)/libgalaxie4_a-galaxies.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./galaxies.c' object='./libgalaxie4_a-galaxies.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgalaxie4_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libgalaxie4_a-galaxies.obj `if test -f './galaxies.c'; then $(CYGPATH_W) './galaxies.c'; else $(CYGPATH_W) '$(srcdir)/./galaxies.c'; fi`
+
+./libkeen2_a-keen.o: ./keen.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkeen2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libkeen2_a-keen.o -MD -MP -MF $(DEPDIR)/libkeen2_a-keen.Tpo -c -o ./libkeen2_a-keen.o `test -f './keen.c' || echo '$(srcdir)/'`./keen.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libkeen2_a-keen.Tpo $(DEPDIR)/libkeen2_a-keen.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./keen.c' object='./libkeen2_a-keen.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkeen2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libkeen2_a-keen.o `test -f './keen.c' || echo '$(srcdir)/'`./keen.c
+
+./libkeen2_a-keen.obj: ./keen.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkeen2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libkeen2_a-keen.obj -MD -MP -MF $(DEPDIR)/libkeen2_a-keen.Tpo -c -o ./libkeen2_a-keen.obj `if test -f './keen.c'; then $(CYGPATH_W) './keen.c'; else $(CYGPATH_W) '$(srcdir)/./keen.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libkeen2_a-keen.Tpo $(DEPDIR)/libkeen2_a-keen.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./keen.c' object='./libkeen2_a-keen.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkeen2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libkeen2_a-keen.obj `if test -f './keen.c'; then $(CYGPATH_W) './keen.c'; else $(CYGPATH_W) '$(srcdir)/./keen.c'; fi`
+
+./liblatin6_a-latin.o: ./latin.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liblatin6_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./liblatin6_a-latin.o -MD -MP -MF $(DEPDIR)/liblatin6_a-latin.Tpo -c -o ./liblatin6_a-latin.o `test -f './latin.c' || echo '$(srcdir)/'`./latin.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/liblatin6_a-latin.Tpo $(DEPDIR)/liblatin6_a-latin.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./latin.c' object='./liblatin6_a-latin.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liblatin6_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./liblatin6_a-latin.o `test -f './latin.c' || echo '$(srcdir)/'`./latin.c
+
+./liblatin6_a-latin.obj: ./latin.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liblatin6_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./liblatin6_a-latin.obj -MD -MP -MF $(DEPDIR)/liblatin6_a-latin.Tpo -c -o ./liblatin6_a-latin.obj `if test -f './latin.c'; then $(CYGPATH_W) './latin.c'; else $(CYGPATH_W) '$(srcdir)/./latin.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/liblatin6_a-latin.Tpo $(DEPDIR)/liblatin6_a-latin.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./latin.c' object='./liblatin6_a-latin.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liblatin6_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./liblatin6_a-latin.obj `if test -f './latin.c'; then $(CYGPATH_W) './latin.c'; else $(CYGPATH_W) '$(srcdir)/./latin.c'; fi`
+
+./liblatin8_a-latin.o: ./latin.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liblatin8_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./liblatin8_a-latin.o -MD -MP -MF $(DEPDIR)/liblatin8_a-latin.Tpo -c -o ./liblatin8_a-latin.o `test -f './latin.c' || echo '$(srcdir)/'`./latin.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/liblatin8_a-latin.Tpo $(DEPDIR)/liblatin8_a-latin.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./latin.c' object='./liblatin8_a-latin.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liblatin8_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./liblatin8_a-latin.o `test -f './latin.c' || echo '$(srcdir)/'`./latin.c
+
+./liblatin8_a-latin.obj: ./latin.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liblatin8_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./liblatin8_a-latin.obj -MD -MP -MF $(DEPDIR)/liblatin8_a-latin.Tpo -c -o ./liblatin8_a-latin.obj `if test -f './latin.c'; then $(CYGPATH_W) './latin.c'; else $(CYGPATH_W) '$(srcdir)/./latin.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/liblatin8_a-latin.Tpo $(DEPDIR)/liblatin8_a-latin.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./latin.c' object='./liblatin8_a-latin.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liblatin8_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./liblatin8_a-latin.obj `if test -f './latin.c'; then $(CYGPATH_W) './latin.c'; else $(CYGPATH_W) '$(srcdir)/./latin.c'; fi`
+
+./liblightup2_a-lightup.o: ./lightup.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liblightup2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./liblightup2_a-lightup.o -MD -MP -MF $(DEPDIR)/liblightup2_a-lightup.Tpo -c -o ./liblightup2_a-lightup.o `test -f './lightup.c' || echo '$(srcdir)/'`./lightup.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/liblightup2_a-lightup.Tpo $(DEPDIR)/liblightup2_a-lightup.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./lightup.c' object='./liblightup2_a-lightup.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liblightup2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./liblightup2_a-lightup.o `test -f './lightup.c' || echo '$(srcdir)/'`./lightup.c
+
+./liblightup2_a-lightup.obj: ./lightup.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liblightup2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./liblightup2_a-lightup.obj -MD -MP -MF $(DEPDIR)/liblightup2_a-lightup.Tpo -c -o ./liblightup2_a-lightup.obj `if test -f './lightup.c'; then $(CYGPATH_W) './lightup.c'; else $(CYGPATH_W) '$(srcdir)/./lightup.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/liblightup2_a-lightup.Tpo $(DEPDIR)/liblightup2_a-lightup.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./lightup.c' object='./liblightup2_a-lightup.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(liblightup2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./liblightup2_a-lightup.obj `if test -f './lightup.c'; then $(CYGPATH_W) './lightup.c'; else $(CYGPATH_W) '$(srcdir)/./lightup.c'; fi`
+
+./libloopy2_a-loopy.o: ./loopy.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libloopy2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libloopy2_a-loopy.o -MD -MP -MF $(DEPDIR)/libloopy2_a-loopy.Tpo -c -o ./libloopy2_a-loopy.o `test -f './loopy.c' || echo '$(srcdir)/'`./loopy.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libloopy2_a-loopy.Tpo $(DEPDIR)/libloopy2_a-loopy.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./loopy.c' object='./libloopy2_a-loopy.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libloopy2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libloopy2_a-loopy.o `test -f './loopy.c' || echo '$(srcdir)/'`./loopy.c
+
+./libloopy2_a-loopy.obj: ./loopy.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libloopy2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libloopy2_a-loopy.obj -MD -MP -MF $(DEPDIR)/libloopy2_a-loopy.Tpo -c -o ./libloopy2_a-loopy.obj `if test -f './loopy.c'; then $(CYGPATH_W) './loopy.c'; else $(CYGPATH_W) '$(srcdir)/./loopy.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libloopy2_a-loopy.Tpo $(DEPDIR)/libloopy2_a-loopy.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./loopy.c' object='./libloopy2_a-loopy.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libloopy2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libloopy2_a-loopy.obj `if test -f './loopy.c'; then $(CYGPATH_W) './loopy.c'; else $(CYGPATH_W) '$(srcdir)/./loopy.c'; fi`
+
+./libmagnets2_a-magnets.o: ./magnets.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmagnets2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libmagnets2_a-magnets.o -MD -MP -MF $(DEPDIR)/libmagnets2_a-magnets.Tpo -c -o ./libmagnets2_a-magnets.o `test -f './magnets.c' || echo '$(srcdir)/'`./magnets.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libmagnets2_a-magnets.Tpo $(DEPDIR)/libmagnets2_a-magnets.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./magnets.c' object='./libmagnets2_a-magnets.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmagnets2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libmagnets2_a-magnets.o `test -f './magnets.c' || echo '$(srcdir)/'`./magnets.c
+
+./libmagnets2_a-magnets.obj: ./magnets.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmagnets2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libmagnets2_a-magnets.obj -MD -MP -MF $(DEPDIR)/libmagnets2_a-magnets.Tpo -c -o ./libmagnets2_a-magnets.obj `if test -f './magnets.c'; then $(CYGPATH_W) './magnets.c'; else $(CYGPATH_W) '$(srcdir)/./magnets.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libmagnets2_a-magnets.Tpo $(DEPDIR)/libmagnets2_a-magnets.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./magnets.c' object='./libmagnets2_a-magnets.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmagnets2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libmagnets2_a-magnets.obj `if test -f './magnets.c'; then $(CYGPATH_W) './magnets.c'; else $(CYGPATH_W) '$(srcdir)/./magnets.c'; fi`
+
+./libmap2_a-map.o: ./map.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmap2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libmap2_a-map.o -MD -MP -MF $(DEPDIR)/libmap2_a-map.Tpo -c -o ./libmap2_a-map.o `test -f './map.c' || echo '$(srcdir)/'`./map.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libmap2_a-map.Tpo $(DEPDIR)/libmap2_a-map.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./map.c' object='./libmap2_a-map.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmap2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libmap2_a-map.o `test -f './map.c' || echo '$(srcdir)/'`./map.c
+
+./libmap2_a-map.obj: ./map.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmap2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libmap2_a-map.obj -MD -MP -MF $(DEPDIR)/libmap2_a-map.Tpo -c -o ./libmap2_a-map.obj `if test -f './map.c'; then $(CYGPATH_W) './map.c'; else $(CYGPATH_W) '$(srcdir)/./map.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libmap2_a-map.Tpo $(DEPDIR)/libmap2_a-map.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./map.c' object='./libmap2_a-map.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmap2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libmap2_a-map.obj `if test -f './map.c'; then $(CYGPATH_W) './map.c'; else $(CYGPATH_W) '$(srcdir)/./map.c'; fi`
+
+./libmines2_a-mines.o: ./mines.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmines2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libmines2_a-mines.o -MD -MP -MF $(DEPDIR)/libmines2_a-mines.Tpo -c -o ./libmines2_a-mines.o `test -f './mines.c' || echo '$(srcdir)/'`./mines.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libmines2_a-mines.Tpo $(DEPDIR)/libmines2_a-mines.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./mines.c' object='./libmines2_a-mines.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmines2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libmines2_a-mines.o `test -f './mines.c' || echo '$(srcdir)/'`./mines.c
+
+./libmines2_a-mines.obj: ./mines.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmines2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libmines2_a-mines.obj -MD -MP -MF $(DEPDIR)/libmines2_a-mines.Tpo -c -o ./libmines2_a-mines.obj `if test -f './mines.c'; then $(CYGPATH_W) './mines.c'; else $(CYGPATH_W) '$(srcdir)/./mines.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libmines2_a-mines.Tpo $(DEPDIR)/libmines2_a-mines.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./mines.c' object='./libmines2_a-mines.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmines2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libmines2_a-mines.obj `if test -f './mines.c'; then $(CYGPATH_W) './mines.c'; else $(CYGPATH_W) '$(srcdir)/./mines.c'; fi`
+
+./libpattern2_a-pattern.o: ./pattern.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpattern2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libpattern2_a-pattern.o -MD -MP -MF $(DEPDIR)/libpattern2_a-pattern.Tpo -c -o ./libpattern2_a-pattern.o `test -f './pattern.c' || echo '$(srcdir)/'`./pattern.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libpattern2_a-pattern.Tpo $(DEPDIR)/libpattern2_a-pattern.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./pattern.c' object='./libpattern2_a-pattern.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpattern2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libpattern2_a-pattern.o `test -f './pattern.c' || echo '$(srcdir)/'`./pattern.c
+
+./libpattern2_a-pattern.obj: ./pattern.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpattern2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libpattern2_a-pattern.obj -MD -MP -MF $(DEPDIR)/libpattern2_a-pattern.Tpo -c -o ./libpattern2_a-pattern.obj `if test -f './pattern.c'; then $(CYGPATH_W) './pattern.c'; else $(CYGPATH_W) '$(srcdir)/./pattern.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libpattern2_a-pattern.Tpo $(DEPDIR)/libpattern2_a-pattern.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./pattern.c' object='./libpattern2_a-pattern.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpattern2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libpattern2_a-pattern.obj `if test -f './pattern.c'; then $(CYGPATH_W) './pattern.c'; else $(CYGPATH_W) '$(srcdir)/./pattern.c'; fi`
+
+./libpattern4_a-pattern.o: ./pattern.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpattern4_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libpattern4_a-pattern.o -MD -MP -MF $(DEPDIR)/libpattern4_a-pattern.Tpo -c -o ./libpattern4_a-pattern.o `test -f './pattern.c' || echo '$(srcdir)/'`./pattern.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libpattern4_a-pattern.Tpo $(DEPDIR)/libpattern4_a-pattern.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./pattern.c' object='./libpattern4_a-pattern.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpattern4_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libpattern4_a-pattern.o `test -f './pattern.c' || echo '$(srcdir)/'`./pattern.c
+
+./libpattern4_a-pattern.obj: ./pattern.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpattern4_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libpattern4_a-pattern.obj -MD -MP -MF $(DEPDIR)/libpattern4_a-pattern.Tpo -c -o ./libpattern4_a-pattern.obj `if test -f './pattern.c'; then $(CYGPATH_W) './pattern.c'; else $(CYGPATH_W) '$(srcdir)/./pattern.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libpattern4_a-pattern.Tpo $(DEPDIR)/libpattern4_a-pattern.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./pattern.c' object='./libpattern4_a-pattern.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpattern4_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libpattern4_a-pattern.obj `if test -f './pattern.c'; then $(CYGPATH_W) './pattern.c'; else $(CYGPATH_W) '$(srcdir)/./pattern.c'; fi`
+
+./libpearl2_a-pearl.o: ./pearl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpearl2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libpearl2_a-pearl.o -MD -MP -MF $(DEPDIR)/libpearl2_a-pearl.Tpo -c -o ./libpearl2_a-pearl.o `test -f './pearl.c' || echo '$(srcdir)/'`./pearl.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libpearl2_a-pearl.Tpo $(DEPDIR)/libpearl2_a-pearl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./pearl.c' object='./libpearl2_a-pearl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpearl2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libpearl2_a-pearl.o `test -f './pearl.c' || echo '$(srcdir)/'`./pearl.c
+
+./libpearl2_a-pearl.obj: ./pearl.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpearl2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libpearl2_a-pearl.obj -MD -MP -MF $(DEPDIR)/libpearl2_a-pearl.Tpo -c -o ./libpearl2_a-pearl.obj `if test -f './pearl.c'; then $(CYGPATH_W) './pearl.c'; else $(CYGPATH_W) '$(srcdir)/./pearl.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libpearl2_a-pearl.Tpo $(DEPDIR)/libpearl2_a-pearl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./pearl.c' object='./libpearl2_a-pearl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpearl2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libpearl2_a-pearl.obj `if test -f './pearl.c'; then $(CYGPATH_W) './pearl.c'; else $(CYGPATH_W) '$(srcdir)/./pearl.c'; fi`
+
+./libsignpos2_a-signpost.o: ./signpost.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsignpos2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libsignpos2_a-signpost.o -MD -MP -MF $(DEPDIR)/libsignpos2_a-signpost.Tpo -c -o ./libsignpos2_a-signpost.o `test -f './signpost.c' || echo '$(srcdir)/'`./signpost.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libsignpos2_a-signpost.Tpo $(DEPDIR)/libsignpos2_a-signpost.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./signpost.c' object='./libsignpos2_a-signpost.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsignpos2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libsignpos2_a-signpost.o `test -f './signpost.c' || echo '$(srcdir)/'`./signpost.c
+
+./libsignpos2_a-signpost.obj: ./signpost.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsignpos2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libsignpos2_a-signpost.obj -MD -MP -MF $(DEPDIR)/libsignpos2_a-signpost.Tpo -c -o ./libsignpos2_a-signpost.obj `if test -f './signpost.c'; then $(CYGPATH_W) './signpost.c'; else $(CYGPATH_W) '$(srcdir)/./signpost.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libsignpos2_a-signpost.Tpo $(DEPDIR)/libsignpos2_a-signpost.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./signpost.c' object='./libsignpos2_a-signpost.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsignpos2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libsignpos2_a-signpost.obj `if test -f './signpost.c'; then $(CYGPATH_W) './signpost.c'; else $(CYGPATH_W) '$(srcdir)/./signpost.c'; fi`
+
+./libsingles3_a-singles.o: ./singles.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsingles3_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libsingles3_a-singles.o -MD -MP -MF $(DEPDIR)/libsingles3_a-singles.Tpo -c -o ./libsingles3_a-singles.o `test -f './singles.c' || echo '$(srcdir)/'`./singles.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libsingles3_a-singles.Tpo $(DEPDIR)/libsingles3_a-singles.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./singles.c' object='./libsingles3_a-singles.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsingles3_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libsingles3_a-singles.o `test -f './singles.c' || echo '$(srcdir)/'`./singles.c
+
+./libsingles3_a-singles.obj: ./singles.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsingles3_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libsingles3_a-singles.obj -MD -MP -MF $(DEPDIR)/libsingles3_a-singles.Tpo -c -o ./libsingles3_a-singles.obj `if test -f './singles.c'; then $(CYGPATH_W) './singles.c'; else $(CYGPATH_W) '$(srcdir)/./singles.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libsingles3_a-singles.Tpo $(DEPDIR)/libsingles3_a-singles.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./singles.c' object='./libsingles3_a-singles.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsingles3_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libsingles3_a-singles.obj `if test -f './singles.c'; then $(CYGPATH_W) './singles.c'; else $(CYGPATH_W) '$(srcdir)/./singles.c'; fi`
+
+./libslant2_a-slant.o: ./slant.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libslant2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libslant2_a-slant.o -MD -MP -MF $(DEPDIR)/libslant2_a-slant.Tpo -c -o ./libslant2_a-slant.o `test -f './slant.c' || echo '$(srcdir)/'`./slant.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libslant2_a-slant.Tpo $(DEPDIR)/libslant2_a-slant.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./slant.c' object='./libslant2_a-slant.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libslant2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libslant2_a-slant.o `test -f './slant.c' || echo '$(srcdir)/'`./slant.c
+
+./libslant2_a-slant.obj: ./slant.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libslant2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libslant2_a-slant.obj -MD -MP -MF $(DEPDIR)/libslant2_a-slant.Tpo -c -o ./libslant2_a-slant.obj `if test -f './slant.c'; then $(CYGPATH_W) './slant.c'; else $(CYGPATH_W) '$(srcdir)/./slant.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libslant2_a-slant.Tpo $(DEPDIR)/libslant2_a-slant.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./slant.c' object='./libslant2_a-slant.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libslant2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libslant2_a-slant.obj `if test -f './slant.c'; then $(CYGPATH_W) './slant.c'; else $(CYGPATH_W) '$(srcdir)/./slant.c'; fi`
+
+./libsolo2_a-solo.o: ./solo.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsolo2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libsolo2_a-solo.o -MD -MP -MF $(DEPDIR)/libsolo2_a-solo.Tpo -c -o ./libsolo2_a-solo.o `test -f './solo.c' || echo '$(srcdir)/'`./solo.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libsolo2_a-solo.Tpo $(DEPDIR)/libsolo2_a-solo.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./solo.c' object='./libsolo2_a-solo.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsolo2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libsolo2_a-solo.o `test -f './solo.c' || echo '$(srcdir)/'`./solo.c
+
+./libsolo2_a-solo.obj: ./solo.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsolo2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libsolo2_a-solo.obj -MD -MP -MF $(DEPDIR)/libsolo2_a-solo.Tpo -c -o ./libsolo2_a-solo.obj `if test -f './solo.c'; then $(CYGPATH_W) './solo.c'; else $(CYGPATH_W) '$(srcdir)/./solo.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libsolo2_a-solo.Tpo $(DEPDIR)/libsolo2_a-solo.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./solo.c' object='./libsolo2_a-solo.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsolo2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libsolo2_a-solo.obj `if test -f './solo.c'; then $(CYGPATH_W) './solo.c'; else $(CYGPATH_W) '$(srcdir)/./solo.c'; fi`
+
+./libtents3_a-tents.o: ./tents.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtents3_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libtents3_a-tents.o -MD -MP -MF $(DEPDIR)/libtents3_a-tents.Tpo -c -o ./libtents3_a-tents.o `test -f './tents.c' || echo '$(srcdir)/'`./tents.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libtents3_a-tents.Tpo $(DEPDIR)/libtents3_a-tents.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./tents.c' object='./libtents3_a-tents.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtents3_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libtents3_a-tents.o `test -f './tents.c' || echo '$(srcdir)/'`./tents.c
+
+./libtents3_a-tents.obj: ./tents.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtents3_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libtents3_a-tents.obj -MD -MP -MF $(DEPDIR)/libtents3_a-tents.Tpo -c -o ./libtents3_a-tents.obj `if test -f './tents.c'; then $(CYGPATH_W) './tents.c'; else $(CYGPATH_W) '$(srcdir)/./tents.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libtents3_a-tents.Tpo $(DEPDIR)/libtents3_a-tents.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./tents.c' object='./libtents3_a-tents.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtents3_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libtents3_a-tents.obj `if test -f './tents.c'; then $(CYGPATH_W) './tents.c'; else $(CYGPATH_W) '$(srcdir)/./tents.c'; fi`
+
+./libtowers2_a-towers.o: ./towers.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtowers2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libtowers2_a-towers.o -MD -MP -MF $(DEPDIR)/libtowers2_a-towers.Tpo -c -o ./libtowers2_a-towers.o `test -f './towers.c' || echo '$(srcdir)/'`./towers.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libtowers2_a-towers.Tpo $(DEPDIR)/libtowers2_a-towers.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./towers.c' object='./libtowers2_a-towers.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtowers2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libtowers2_a-towers.o `test -f './towers.c' || echo '$(srcdir)/'`./towers.c
+
+./libtowers2_a-towers.obj: ./towers.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtowers2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libtowers2_a-towers.obj -MD -MP -MF $(DEPDIR)/libtowers2_a-towers.Tpo -c -o ./libtowers2_a-towers.obj `if test -f './towers.c'; then $(CYGPATH_W) './towers.c'; else $(CYGPATH_W) '$(srcdir)/./towers.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libtowers2_a-towers.Tpo $(DEPDIR)/libtowers2_a-towers.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./towers.c' object='./libtowers2_a-towers.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libtowers2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libtowers2_a-towers.obj `if test -f './towers.c'; then $(CYGPATH_W) './towers.c'; else $(CYGPATH_W) '$(srcdir)/./towers.c'; fi`
+
+./libunequal2_a-unequal.o: ./unequal.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunequal2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libunequal2_a-unequal.o -MD -MP -MF $(DEPDIR)/libunequal2_a-unequal.Tpo -c -o ./libunequal2_a-unequal.o `test -f './unequal.c' || echo '$(srcdir)/'`./unequal.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libunequal2_a-unequal.Tpo $(DEPDIR)/libunequal2_a-unequal.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./unequal.c' object='./libunequal2_a-unequal.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunequal2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libunequal2_a-unequal.o `test -f './unequal.c' || echo '$(srcdir)/'`./unequal.c
+
+./libunequal2_a-unequal.obj: ./unequal.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunequal2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libunequal2_a-unequal.obj -MD -MP -MF $(DEPDIR)/libunequal2_a-unequal.Tpo -c -o ./libunequal2_a-unequal.obj `if test -f './unequal.c'; then $(CYGPATH_W) './unequal.c'; else $(CYGPATH_W) '$(srcdir)/./unequal.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libunequal2_a-unequal.Tpo $(DEPDIR)/libunequal2_a-unequal.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./unequal.c' object='./libunequal2_a-unequal.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunequal2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libunequal2_a-unequal.obj `if test -f './unequal.c'; then $(CYGPATH_W) './unequal.c'; else $(CYGPATH_W) '$(srcdir)/./unequal.c'; fi`
+
+./libunruly2_a-unruly.o: ./unruly.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunruly2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libunruly2_a-unruly.o -MD -MP -MF $(DEPDIR)/libunruly2_a-unruly.Tpo -c -o ./libunruly2_a-unruly.o `test -f './unruly.c' || echo '$(srcdir)/'`./unruly.c
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libunruly2_a-unruly.Tpo $(DEPDIR)/libunruly2_a-unruly.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./unruly.c' object='./libunruly2_a-unruly.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunruly2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libunruly2_a-unruly.o `test -f './unruly.c' || echo '$(srcdir)/'`./unruly.c
+
+./libunruly2_a-unruly.obj: ./unruly.c
+@am__fastdepCC_TRUE@   $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunruly2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ./libunruly2_a-unruly.obj -MD -MP -MF $(DEPDIR)/libunruly2_a-unruly.Tpo -c -o ./libunruly2_a-unruly.obj `if test -f './unruly.c'; then $(CYGPATH_W) './unruly.c'; else $(CYGPATH_W) '$(srcdir)/./unruly.c'; fi`
+@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/libunruly2_a-unruly.Tpo $(DEPDIR)/libunruly2_a-unruly.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='./unruly.c' object='./libunruly2_a-unruly.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libunruly2_a_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ./libunruly2_a-unruly.obj `if test -f './unruly.c'; then $(CYGPATH_W) './unruly.c'; else $(CYGPATH_W) '$(srcdir)/./unruly.c'; fi`
+
+ID: $(am__tagged_files)
+       $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       set x; \
+       here=`pwd`; \
+       $(am__define_uniq_tagged_files); \
+       shift; \
+       if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         if test $$# -gt 0; then \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             "$$@" $$unique; \
+         else \
+           $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+             $$unique; \
+         fi; \
+       fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+       $(am__define_uniq_tagged_files); \
+       test -z "$(CTAGS_ARGS)$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && $(am__cd) $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+       test ! -s cscope.files \
+         || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+       -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+       list='$(am__tagged_files)'; \
+       case "$(srcdir)" in \
+         [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+         *) sdir=$(subdir)/$(srcdir) ;; \
+       esac; \
+       for i in $$list; do \
+         if test -f "$$i"; then \
+           echo "$(subdir)/$$i"; \
+         else \
+           echo "$$sdir/$$i"; \
+         fi; \
+       done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+       -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+distdir: $(DISTFILES)
+       $(am__remove_distdir)
+       test -d "$(distdir)" || mkdir "$(distdir)"
+       @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+       list='$(DISTFILES)'; \
+         dist_files=`for file in $$list; do echo $$file; done | \
+         sed -e "s|^$$srcdirstrip/||;t" \
+             -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+       case $$dist_files in \
+         */*) $(MKDIR_P) `echo "$$dist_files" | \
+                          sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+                          sort -u` ;; \
+       esac; \
+       for file in $$dist_files; do \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         if test -d $$d/$$file; then \
+           dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+           if test -d "$(distdir)/$$file"; then \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+             find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+           fi; \
+           cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+         else \
+           test -f "$(distdir)/$$file" \
+           || cp -p $$d/$$file "$(distdir)/$$file" \
+           || exit 1; \
+         fi; \
+       done
+       -test -n "$(am__skip_mode_fix)" \
+       || find "$(distdir)" -type d ! -perm -755 \
+               -exec chmod u+rwx,go+rx {} \; -o \
+         ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+       || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       $(am__post_remove_distdir)
+
+dist-bzip2: distdir
+       tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+       $(am__post_remove_distdir)
+
+dist-lzip: distdir
+       tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+       $(am__post_remove_distdir)
+
+dist-xz: distdir
+       tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+       $(am__post_remove_distdir)
+
+dist-tarZ: distdir
+       @echo WARNING: "Support for distribution archives compressed with" \
+                      "legacy program 'compress' is deprecated." >&2
+       @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+       tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+       $(am__post_remove_distdir)
+
+dist-shar: distdir
+       @echo WARNING: "Support for shar distribution archives is" \
+                      "deprecated." >&2
+       @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+       shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+       $(am__post_remove_distdir)
+
+dist-zip: distdir
+       -rm -f $(distdir).zip
+       zip -rq $(distdir).zip $(distdir)
+       $(am__post_remove_distdir)
+
+dist dist-all:
+       $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+       $(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       case '$(DIST_ARCHIVES)' in \
+       *.tar.gz*) \
+         GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+       *.tar.bz2*) \
+         bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+       *.tar.lz*) \
+         lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+       *.tar.xz*) \
+         xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+       *.tar.Z*) \
+         uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+       *.shar.gz*) \
+         GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+       *.zip*) \
+         unzip $(distdir).zip ;;\
+       esac
+       chmod -R a-w $(distdir)
+       chmod u+w $(distdir)
+       mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+       chmod a-w $(distdir)
+       test -d $(distdir)/_build || exit 0; \
+       dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+         && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+         && am__cwd=`pwd` \
+         && $(am__cd) $(distdir)/_build/sub \
+         && ../../configure \
+           $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+           $(DISTCHECK_CONFIGURE_FLAGS) \
+           --srcdir=../.. --prefix="$$dc_install_base" \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+         && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+               distuninstallcheck \
+         && chmod -R a-w "$$dc_install_base" \
+         && ({ \
+              (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+                   distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+             } || { rm -rf "$$dc_destdir"; exit 1; }) \
+         && rm -rf "$$dc_destdir" \
+         && $(MAKE) $(AM_MAKEFLAGS) dist \
+         && rm -rf $(DIST_ARCHIVES) \
+         && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+         && cd "$$am__cwd" \
+         || exit 1
+       $(am__post_remove_distdir)
+       @(echo "$(distdir) archives ready for distribution: "; \
+         list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+         sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+       @test -n '$(distuninstallcheck_dir)' || { \
+         echo 'ERROR: trying to run $@ with an empty' \
+              '$$(distuninstallcheck_dir)' >&2; \
+         exit 1; \
+       }; \
+       $(am__cd) '$(distuninstallcheck_dir)' || { \
+         echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+         exit 1; \
+       }; \
+       test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+          || { echo "ERROR: files left after uninstall:" ; \
+               if test -n "$(DESTDIR)"; then \
+                 echo "  (check DESTDIR support)"; \
+               fi ; \
+               $(distuninstallcheck_listfiles) ; \
+               exit 1; } >&2
+distcleancheck: distclean
+       @if test '$(srcdir)' = . ; then \
+         echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+         exit 1 ; \
+       fi
+       @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+         || { echo "ERROR: files left in build directory after distclean:" ; \
+              $(distcleancheck_listfiles) ; \
+              exit 1; } >&2
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES) $(PROGRAMS)
+installdirs:
+       for dir in "$(DESTDIR)$(bindir)"; do \
+         test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       if test -z '$(STRIP)'; then \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+             install; \
+       else \
+         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+       fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+       -rm -f ./$(am__dirstamp)
+       -rm -f icons/$(DEPDIR)/$(am__dirstamp)
+       -rm -f icons/$(am__dirstamp)
+       -test -z "$(DEPDIR)/$(am__dirstamp)" || rm -f $(DEPDIR)/$(am__dirstamp)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-noinstLIBRARIES \
+       clean-noinstPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf ./$(DEPDIR) icons/$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf $(top_srcdir)/autom4te.cache
+       -rm -rf ./$(DEPDIR) icons/$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \
+       clean-binPROGRAMS clean-cscope clean-generic \
+       clean-noinstLIBRARIES clean-noinstPROGRAMS cscope \
+       cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
+       dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
+       distcheck distclean distclean-compile distclean-generic \
+       distclean-tags distcleancheck distdir distuninstallcheck dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-binPROGRAMS install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+       tags tags-am uninstall uninstall-am uninstall-binPROGRAMS
+
+.PRECIOUS: Makefile
+
+test: benchmark.html benchmark.txt
+
+benchmark.html: benchmark.txt benchmark.pl
+       ./benchmark.pl benchmark.txt > $@
+
+benchmark.txt: benchmark.sh $(GAMES)
+       ./benchmark.sh > $@
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Makefile.nestedvm b/Makefile.nestedvm
new file mode 100644 (file)
index 0000000..b163699
--- /dev/null
@@ -0,0 +1,637 @@
+# Makefile for puzzles under NestedVM.
+#
+# This file was created by `mkfiles.pl' from the `Recipe' file.
+# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.
+
+# This path points at the nestedvm root directory
+NESTEDVM = /opt/nestedvm
+# You can define this path to point at your tools if you need to
+TOOLPATH = $(NESTEDVM)/upstream/install/bin
+CC = $(TOOLPATH)/mips-unknown-elf-gcc
+
+CFLAGS = -O2 -Wall -Werror -DSLOW_SYSTEM -g -I./ -Iicons/
+
+all: blackbox.jar bridges.jar cube.jar dominosa.jar fifteen.jar filling.jar \
+               flip.jar flood.jar galaxies.jar guess.jar inertia.jar \
+               keen.jar lightup.jar loopy.jar magnets.jar map.jar mines.jar \
+               net.jar netslide.jar nullgame.jar palisade.jar pattern.jar \
+               pearl.jar pegs.jar range.jar rect.jar samegame.jar \
+               signpost.jar singles.jar sixteen.jar slant.jar solo.jar \
+               tents.jar towers.jar tracks.jar twiddle.jar undead.jar \
+               unequal.jar unruly.jar untangle.jar
+
+blackbox.mips: blackbox.o blackbox-icon.o drawing.o nestedvm.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ blackbox.o blackbox-icon.o drawing.o \
+               nestedvm.o malloc.o midend.o misc.o printing.o ps.o random.o \
+               version.o  -lm
+
+bridges.mips: bridges.o bridges-icon.o drawing.o dsf.o findloop.o nestedvm.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ bridges.o bridges-icon.o drawing.o dsf.o \
+               findloop.o nestedvm.o malloc.o midend.o misc.o printing.o \
+               ps.o random.o version.o  -lm
+
+cube.mips: cube.o cube-icon.o drawing.o nestedvm.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ cube.o cube-icon.o drawing.o nestedvm.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o  \
+               -lm
+
+dominosa.mips: dominosa.o dominosa-icon.o drawing.o nestedvm.o laydomino.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ dominosa.o dominosa-icon.o drawing.o \
+               nestedvm.o laydomino.o malloc.o midend.o misc.o printing.o \
+               ps.o random.o version.o  -lm
+
+fifteen.mips: drawing.o fifteen.o fifteen-icon.o nestedvm.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o fifteen.o fifteen-icon.o \
+               nestedvm.o malloc.o midend.o misc.o printing.o ps.o random.o \
+               version.o  -lm
+
+filling.mips: drawing.o dsf.o filling.o filling-icon.o nestedvm.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o dsf.o filling.o filling-icon.o \
+               nestedvm.o malloc.o midend.o misc.o printing.o ps.o random.o \
+               version.o  -lm
+
+flip.mips: drawing.o flip.o flip-icon.o nestedvm.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o tree234.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o flip.o flip-icon.o nestedvm.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o tree234.o \
+               version.o  -lm
+
+flood.mips: drawing.o flood.o flood-icon.o nestedvm.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o flood.o flood-icon.o nestedvm.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o  \
+               -lm
+
+galaxies.mips: drawing.o dsf.o galaxies.o galaxies-icon.o nestedvm.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o dsf.o galaxies.o galaxies-icon.o \
+               nestedvm.o malloc.o midend.o misc.o printing.o ps.o random.o \
+               version.o  -lm
+
+guess.mips: drawing.o nestedvm.o guess.o guess-icon.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o guess.o guess-icon.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o  \
+               -lm
+
+inertia.mips: drawing.o nestedvm.o inertia.o inertia-icon.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o inertia.o \
+               inertia-icon.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o version.o  -lm
+
+keen.mips: drawing.o dsf.o nestedvm.o keen.o keen-icon.o latin.o malloc.o \
+               maxflow.o midend.o misc.o printing.o ps.o random.o tree234.o \
+               version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o dsf.o nestedvm.o keen.o \
+               keen-icon.o latin.o malloc.o maxflow.o midend.o misc.o \
+               printing.o ps.o random.o tree234.o version.o  -lm
+
+lightup.mips: combi.o drawing.o nestedvm.o lightup.o lightup-icon.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ combi.o drawing.o nestedvm.o lightup.o \
+               lightup-icon.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o version.o  -lm
+
+loopy.mips: drawing.o dsf.o grid.o nestedvm.o loopgen.o loopy.o loopy-icon.o \
+               malloc.o midend.o misc.o penrose.o printing.o ps.o random.o \
+               tree234.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o dsf.o grid.o nestedvm.o loopgen.o \
+               loopy.o loopy-icon.o malloc.o midend.o misc.o penrose.o \
+               printing.o ps.o random.o tree234.o version.o  -lm
+
+magnets.mips: drawing.o nestedvm.o laydomino.o magnets.o magnets-icon.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o laydomino.o magnets.o \
+               magnets-icon.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o version.o  -lm
+
+map.mips: drawing.o dsf.o nestedvm.o malloc.o map.o map-icon.o midend.o \
+               misc.o printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o dsf.o nestedvm.o malloc.o map.o \
+               map-icon.o midend.o misc.o printing.o ps.o random.o \
+               version.o  -lm
+
+mines.mips: drawing.o nestedvm.o malloc.o midend.o mines.o mines-icon.o \
+               misc.o printing.o ps.o random.o tree234.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o malloc.o midend.o \
+               mines.o mines-icon.o misc.o printing.o ps.o random.o \
+               tree234.o version.o  -lm
+
+net.mips: drawing.o dsf.o findloop.o nestedvm.o malloc.o midend.o misc.o \
+               net.o net-icon.o printing.o ps.o random.o tree234.o \
+               version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o dsf.o findloop.o nestedvm.o \
+               malloc.o midend.o misc.o net.o net-icon.o printing.o ps.o \
+               random.o tree234.o version.o  -lm
+
+netslide.mips: drawing.o nestedvm.o malloc.o midend.o misc.o netslide.o \
+               netslide-icon.o printing.o ps.o random.o tree234.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o malloc.o midend.o \
+               misc.o netslide.o netslide-icon.o printing.o ps.o random.o \
+               tree234.o version.o  -lm
+
+nullgame.mips: drawing.o nestedvm.o malloc.o midend.o misc.o no-icon.o \
+               nullgame.o printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o malloc.o midend.o \
+               misc.o no-icon.o nullgame.o printing.o ps.o random.o \
+               version.o  -lm
+
+palisade.mips: divvy.o drawing.o dsf.o nestedvm.o malloc.o midend.o misc.o \
+               palisade.o palisade-icon.o printing.o ps.o random.o \
+               version.o
+       $(CC) $(XLDFLAGS) -o $@ divvy.o drawing.o dsf.o nestedvm.o malloc.o \
+               midend.o misc.o palisade.o palisade-icon.o printing.o ps.o \
+               random.o version.o  -lm
+
+pattern.mips: drawing.o nestedvm.o malloc.o midend.o misc.o pattern.o \
+               pattern-icon.o printing.o ps.o random.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o malloc.o midend.o \
+               misc.o pattern.o pattern-icon.o printing.o ps.o random.o \
+               version.o  -lm
+
+pearl.mips: drawing.o dsf.o grid.o nestedvm.o loopgen.o malloc.o midend.o \
+               misc.o pearl.o pearl-icon.o penrose.o printing.o ps.o \
+               random.o tdq.o tree234.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o dsf.o grid.o nestedvm.o loopgen.o \
+               malloc.o midend.o misc.o pearl.o pearl-icon.o penrose.o \
+               printing.o ps.o random.o tdq.o tree234.o version.o  -lm
+
+pegs.mips: drawing.o nestedvm.o malloc.o midend.o misc.o pegs.o pegs-icon.o \
+               printing.o ps.o random.o tree234.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o malloc.o midend.o \
+               misc.o pegs.o pegs-icon.o printing.o ps.o random.o tree234.o \
+               version.o  -lm
+
+range.mips: drawing.o dsf.o nestedvm.o malloc.o midend.o misc.o printing.o \
+               ps.o random.o range.o range-icon.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o dsf.o nestedvm.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o range.o range-icon.o \
+               version.o  -lm
+
+rect.mips: drawing.o nestedvm.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o rect.o rect-icon.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o rect.o rect-icon.o version.o \
+                -lm
+
+samegame.mips: drawing.o nestedvm.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o samegame.o samegame-icon.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o samegame.o samegame-icon.o \
+               version.o  -lm
+
+signpost.mips: drawing.o dsf.o nestedvm.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o signpost.o signpost-icon.o \
+               version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o dsf.o nestedvm.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o signpost.o signpost-icon.o \
+               version.o  -lm
+
+singles.mips: drawing.o dsf.o nestedvm.o latin.o malloc.o maxflow.o midend.o \
+               misc.o printing.o ps.o random.o singles.o singles-icon.o \
+               tree234.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o dsf.o nestedvm.o latin.o malloc.o \
+               maxflow.o midend.o misc.o printing.o ps.o random.o singles.o \
+               singles-icon.o tree234.o version.o  -lm
+
+sixteen.mips: drawing.o nestedvm.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o sixteen.o sixteen-icon.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o sixteen.o sixteen-icon.o \
+               version.o  -lm
+
+slant.mips: drawing.o dsf.o findloop.o nestedvm.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o slant.o slant-icon.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o dsf.o findloop.o nestedvm.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o slant.o \
+               slant-icon.o version.o  -lm
+
+solo.mips: divvy.o drawing.o dsf.o nestedvm.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o solo.o solo-icon.o version.o
+       $(CC) $(XLDFLAGS) -o $@ divvy.o drawing.o dsf.o nestedvm.o malloc.o \
+               midend.o misc.o printing.o ps.o random.o solo.o solo-icon.o \
+               version.o  -lm
+
+tents.mips: drawing.o dsf.o nestedvm.o malloc.o maxflow.o midend.o misc.o \
+               printing.o ps.o random.o tents.o tents-icon.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o dsf.o nestedvm.o malloc.o \
+               maxflow.o midend.o misc.o printing.o ps.o random.o tents.o \
+               tents-icon.o version.o  -lm
+
+towers.mips: drawing.o nestedvm.o latin.o malloc.o maxflow.o midend.o misc.o \
+               printing.o ps.o random.o towers.o towers-icon.o tree234.o \
+               version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o latin.o malloc.o \
+               maxflow.o midend.o misc.o printing.o ps.o random.o towers.o \
+               towers-icon.o tree234.o version.o  -lm
+
+tracks.mips: drawing.o dsf.o findloop.o nestedvm.o malloc.o midend.o misc.o \
+               printing.o ps.o random.o tracks.o tracks-icon.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o dsf.o findloop.o nestedvm.o \
+               malloc.o midend.o misc.o printing.o ps.o random.o tracks.o \
+               tracks-icon.o version.o  -lm
+
+twiddle.mips: drawing.o nestedvm.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o twiddle.o twiddle-icon.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o twiddle.o twiddle-icon.o \
+               version.o  -lm
+
+undead.mips: drawing.o nestedvm.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o undead.o undead-icon.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o undead.o undead-icon.o \
+               version.o  -lm
+
+unequal.mips: drawing.o nestedvm.o latin.o malloc.o maxflow.o midend.o \
+               misc.o printing.o ps.o random.o tree234.o unequal.o \
+               unequal-icon.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o latin.o malloc.o \
+               maxflow.o midend.o misc.o printing.o ps.o random.o tree234.o \
+               unequal.o unequal-icon.o version.o  -lm
+
+unruly.mips: drawing.o nestedvm.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o unruly.o unruly-icon.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o unruly.o unruly-icon.o \
+               version.o  -lm
+
+untangle.mips: drawing.o nestedvm.o malloc.o midend.o misc.o printing.o ps.o \
+               random.o tree234.o untangle.o untangle-icon.o version.o
+       $(CC) $(XLDFLAGS) -o $@ drawing.o nestedvm.o malloc.o midend.o \
+               misc.o printing.o ps.o random.o tree234.o untangle.o \
+               untangle-icon.o version.o  -lm
+
+blackbox.o: ./blackbox.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+blackbox-icon.o: icons/blackbox-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+blackbo3.o: ./blackbox.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+bridges.o: ./bridges.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+bridges-icon.o: icons/bridges-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+bridges3.o: ./bridges.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+combi.o: ./combi.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube.o: ./cube.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube-icon.o: icons/cube-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube3.o: ./cube.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+divvy.o: ./divvy.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominosa.o: ./dominosa.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominosa-icon.o: icons/dominosa-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominos3.o: ./dominosa.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+drawing.o: ./drawing.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dsf.o: ./dsf.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen.o: ./fifteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen-icon.o: icons/fifteen-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen5.o: ./fifteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+fifteen2.o: ./fifteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+filling.o: ./filling.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+filling-icon.o: icons/filling-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+filling5.o: ./filling.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+filling2.o: ./filling.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+findloop.o: ./findloop.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip.o: ./flip.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip-icon.o: icons/flip-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip3.o: ./flip.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+flood.o: ./flood.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flood-icon.o: icons/flood-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flood3.o: ./flood.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+galaxies.o: ./galaxies.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+galaxies-icon.o: icons/galaxies-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+galaxie7.o: ./galaxies.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+galaxie4.o: ./galaxies.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_PICTURE_GENERATOR -c $< -o $@
+galaxie2.o: ./galaxies.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+grid.o: ./grid.c ./puzzles.h ./tree234.h ./grid.h ./penrose.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+nestedvm.o: ./nestedvm.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess.o: ./guess.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess-icon.o: icons/guess-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess3.o: ./guess.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+inertia.o: ./inertia.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+inertia-icon.o: icons/inertia-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+inertia3.o: ./inertia.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+keen.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+keen-icon.o: icons/keen-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+keen5.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+keen2.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+latin.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+latin8.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_LATIN_TEST -c $< -o $@
+latin6.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+laydomino.o: ./laydomino.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup.o: ./lightup.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup-icon.o: icons/lightup-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup5.o: ./lightup.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+lightup2.o: ./lightup.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+list.o: ./list.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopgen.o: ./loopgen.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy-icon.o: icons/loopy-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy5.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+loopy2.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+magnets.o: ./magnets.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+magnets-icon.o: icons/magnets-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+magnets5.o: ./magnets.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+magnets2.o: ./magnets.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+malloc.o: ./malloc.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map.o: ./map.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map-icon.o: icons/map-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map5.o: ./map.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+map2.o: ./map.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+maxflow.o: ./maxflow.c ./maxflow.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+midend.o: ./midend.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines-icon.o: icons/mines-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines5.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+mines2.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_OBFUSCATOR -c $< -o $@
+misc.o: ./misc.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net.o: ./net.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net-icon.o: icons/net-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net3.o: ./net.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+netslide.o: ./netslide.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+netslide-icon.o: icons/netslide-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+netslid3.o: ./netslide.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+no-icon.o: ./no-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+nullfe.o: ./nullfe.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+nullgame.o: ./nullgame.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+obfusc.o: ./obfusc.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+osx.o: ./osx.m ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisade.o: ./palisade.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisade-icon.o: icons/palisade-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisad3.o: ./palisade.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pattern.o: ./pattern.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pattern-icon.o: icons/pattern-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pattern7.o: ./pattern.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pattern4.o: ./pattern.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_PICTURE_GENERATOR -c $< -o $@
+pattern2.o: ./pattern.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+pearl.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pearl-icon.o: icons/pearl-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pearl5.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pearl2.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+pegs.o: ./pegs.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pegs-icon.o: icons/pegs-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pegs3.o: ./pegs.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+penrose.o: ./penrose.c ./puzzles.h ./penrose.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+printing.o: ./printing.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+ps.o: ./ps.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+random.o: ./random.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range.o: ./range.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range-icon.o: icons/range-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range3.o: ./range.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+rect.o: ./rect.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+rect-icon.o: icons/rect-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+rect3.o: ./rect.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+samegame.o: ./samegame.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+samegame-icon.o: icons/samegame-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+samegam3.o: ./samegame.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+signpost.o: ./signpost.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+signpost-icon.o: icons/signpost-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+signpos5.o: ./signpost.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+signpos2.o: ./signpost.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+singles.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+singles-icon.o: icons/singles-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+singles5.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+singles3.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+sixteen.o: ./sixteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+sixteen-icon.o: icons/sixteen-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+sixteen3.o: ./sixteen.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+slant.o: ./slant.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+slant-icon.o: icons/slant-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+slant5.o: ./slant.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+slant2.o: ./slant.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+solo.o: ./solo.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+solo-icon.o: icons/solo-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+solo5.o: ./solo.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+solo2.o: ./solo.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+tdq.o: ./tdq.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents-icon.o: icons/tents-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents5.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+tents3.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+towers.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+towers-icon.o: icons/towers-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+towers5.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+towers2.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+tracks.o: ./tracks.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tracks-icon.o: icons/tracks-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tracks3.o: ./tracks.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+tree234.o: ./tree234.c ./tree234.h ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle.o: ./twiddle.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle-icon.o: icons/twiddle-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle3.o: ./twiddle.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+undead.o: ./undead.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+undead-icon.o: icons/undead-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+undead3.o: ./undead.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unequal.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unequal-icon.o: icons/unequal-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unequal5.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unequal2.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+unruly.o: ./unruly.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unruly-icon.o: icons/unruly-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unruly5.o: ./unruly.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unruly2.o: ./unruly.c ./puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+untangle.o: ./untangle.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+untangle-icon.o: icons/untangle-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+untangl3.o: ./untangle.c ./puzzles.h ./tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+version.o: ./version.c ./version.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+windows.o: ./windows.c ./puzzles.h ./resource.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+windows1.o: ./windows.c ./puzzles.h ./resource.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+
+.PRECIOUS: %.class
+%.class: %.mips
+       java -cp $(NESTEDVM)/build:$(NESTEDVM)/upstream/build/classgen/build \
+               org.ibex.nestedvm.Compiler -outformat class -d . \
+               PuzzleEngine $<
+               mv PuzzleEngine.class $@
+
+org:
+       mkdir -p org/ibex/nestedvm/util
+       cp $(NESTEDVM)/build/org/ibex/nestedvm/Registers.class org/ibex/nestedvm
+       cp $(NESTEDVM)/build/org/ibex/nestedvm/UsermodeConstants.class org/ibex/nestedvm
+       cp $(NESTEDVM)/build/org/ibex/nestedvm/Runtime*.class org/ibex/nestedvm
+       cp $(NESTEDVM)/build/org/ibex/nestedvm/util/Platform*.class org/ibex/nestedvm/util
+       cp $(NESTEDVM)/build/org/ibex/nestedvm/util/Seekable*.class org/ibex/nestedvm/util
+       echo "Main-Class: PuzzleApplet" >applet.manifest
+
+PuzzleApplet.class: PuzzleApplet.java org
+       javac -source 1.3 -target 1.3 PuzzleApplet.java
+
+%.jar: %.class PuzzleApplet.class org
+       mv $< PuzzleEngine.class
+       jar cfm $@ applet.manifest PuzzleEngine.class PuzzleApplet*.class org
+       echo '<applet archive="'$@'" code="PuzzleApplet" width="700" height="500"></applet>' >$*.html
+       mv PuzzleEngine.class $<
+
+clean:
+       rm -rf *.o *.mips *.class *.html *.jar org applet.manifest
diff --git a/Makefile.osx b/Makefile.osx
new file mode 100644 (file)
index 0000000..5316913
--- /dev/null
@@ -0,0 +1,652 @@
+# Makefile for puzzles under Mac OS X.
+#
+# This file was created by `mkfiles.pl' from the `Recipe' file.
+# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.
+CC = $(TOOLPATH)gcc
+LIPO = $(TOOLPATH)lipo
+
+CFLAGS = -O2 -Wall -Werror -g -I./ -Iicons/
+LDFLAGS = -framework Cocoa
+all: Puzzles fifteensolver fillingsolver galaxiespicture galaxiessolver \
+               keensolver latincheck lightupsolver loopysolver \
+               magnetssolver mapsolver mineobfusc obfusc patternpicture \
+               patternsolver pearlbench signpostsolver singlessolver \
+               slantsolver solosolver tentssolver towerssolver \
+               unequalsolver unrulysolver
+Puzzles_extra = Puzzles.app/Contents/Resources/Help/index.html
+Puzzles.app/Contents/Resources/Help/index.html: \
+       Puzzles.app/Contents/Resources/Help osx-help.but puzzles.but
+       cd Puzzles.app/Contents/Resources/Help; \
+               halibut --html ../../../../osx-help.but ../../../../puzzles.but
+Puzzles.app/Contents/Resources/Help: Puzzles.app/Contents/Resources
+       mkdir -p Puzzles.app/Contents/Resources/Help
+
+release: Puzzles.dmg
+Puzzles.dmg: Puzzles
+       rm -f raw.dmg
+       hdiutil create -megabytes 5 -layout NONE raw.dmg
+       hdid -nomount raw.dmg > devicename
+       newfs_hfs -v "Simon Tatham's Puzzle Collection" `cat devicename`
+       hdiutil eject `cat devicename`
+       hdid raw.dmg | cut -f1 -d' ' > devicename
+       cp -R Puzzles.app /Volumes/"Simon Tatham's Puzzle Collection"
+       hdiutil eject `cat devicename`
+       rm -f Puzzles.dmg
+       hdiutil convert -format UDCO raw.dmg -o Puzzles.dmg
+       rm -f raw.dmg devicename
+
+.SUFFIXES: .o .c .m
+
+
+
+Puzzles.app:
+       mkdir -p $@
+Puzzles.app/Contents: Puzzles.app
+       mkdir -p $@
+Puzzles.app/Contents/MacOS: Puzzles.app/Contents
+       mkdir -p $@
+Puzzles.app/Contents/Resources: Puzzles.app/Contents
+       mkdir -p $@
+Puzzles.app/Contents/Resources/Puzzles.icns: Puzzles.app/Contents/Resources osx.icns
+       cp osx.icns $@
+Puzzles.app/Contents/Info.plist: Puzzles.app/Contents/Resources osx-info.plist
+       cp osx-info.plist $@
+Puzzles: Puzzles.app/Contents/MacOS/Puzzles \
+               Puzzles.app/Contents/Resources/Puzzles.icns \
+               Puzzles.app/Contents/Info.plist $(Puzzles_extra)
+
+Puzzles.i386.bin: blackbo3.i386.o bridges3.i386.o combi.i386.o cube3.i386.o \
+               divvy.i386.o dominos3.i386.o drawing.i386.o dsf.i386.o \
+               fifteen5.i386.o filling5.i386.o findloop.i386.o flip3.i386.o \
+               flood3.i386.o galaxie7.i386.o grid.i386.o guess3.i386.o \
+               inertia3.i386.o keen5.i386.o latin.i386.o laydomino.i386.o \
+               lightup5.i386.o list.i386.o loopgen.i386.o loopy5.i386.o \
+               magnets5.i386.o malloc.i386.o map5.i386.o maxflow.i386.o \
+               midend.i386.o mines5.i386.o misc.i386.o net3.i386.o \
+               netslid3.i386.o osx.i386.o palisad3.i386.o pattern7.i386.o \
+               pearl5.i386.o pegs3.i386.o penrose.i386.o random.i386.o \
+               range3.i386.o rect3.i386.o samegam3.i386.o signpos5.i386.o \
+               singles5.i386.o sixteen3.i386.o slant5.i386.o solo5.i386.o \
+               tdq.i386.o tents5.i386.o towers5.i386.o tracks3.i386.o \
+               tree234.i386.o twiddle3.i386.o undead3.i386.o \
+               unequal5.i386.o unruly5.i386.o untangl3.i386.o \
+               version.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(LDFLAGS) -o $@ \
+               blackbo3.i386.o bridges3.i386.o combi.i386.o cube3.i386.o \
+               divvy.i386.o dominos3.i386.o drawing.i386.o dsf.i386.o \
+               fifteen5.i386.o filling5.i386.o findloop.i386.o flip3.i386.o \
+               flood3.i386.o galaxie7.i386.o grid.i386.o guess3.i386.o \
+               inertia3.i386.o keen5.i386.o latin.i386.o laydomino.i386.o \
+               lightup5.i386.o list.i386.o loopgen.i386.o loopy5.i386.o \
+               magnets5.i386.o malloc.i386.o map5.i386.o maxflow.i386.o \
+               midend.i386.o mines5.i386.o misc.i386.o net3.i386.o \
+               netslid3.i386.o osx.i386.o palisad3.i386.o pattern7.i386.o \
+               pearl5.i386.o pegs3.i386.o penrose.i386.o random.i386.o \
+               range3.i386.o rect3.i386.o samegam3.i386.o signpos5.i386.o \
+               singles5.i386.o sixteen3.i386.o slant5.i386.o solo5.i386.o \
+               tdq.i386.o tents5.i386.o towers5.i386.o tracks3.i386.o \
+               tree234.i386.o twiddle3.i386.o undead3.i386.o \
+               unequal5.i386.o unruly5.i386.o untangl3.i386.o \
+               version.i386.o 
+
+Puzzles.app/Contents/MacOS/Puzzles: Puzzles.app/Contents/MacOS \
+               Puzzles.i386.bin
+       $(LIPO) -create  Puzzles.i386.bin -output $@
+
+fifteensolver.i386: fifteen2.i386.o malloc.i386.o misc.i386.o nullfe.i386.o \
+               random.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               fifteen2.i386.o malloc.i386.o misc.i386.o nullfe.i386.o \
+               random.i386.o 
+
+fifteensolver: fifteensolver.i386
+       $(LIPO) -create  fifteensolver.i386 -output $@
+
+fillingsolver.i386: dsf.i386.o filling2.i386.o malloc.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               dsf.i386.o filling2.i386.o malloc.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o 
+
+fillingsolver: fillingsolver.i386
+       $(LIPO) -create  fillingsolver.i386 -output $@
+
+galaxiespicture.i386: dsf.i386.o galaxie4.i386.o malloc.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               dsf.i386.o galaxie4.i386.o malloc.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o -lm
+
+galaxiespicture: galaxiespicture.i386
+       $(LIPO) -create  galaxiespicture.i386 -output $@
+
+galaxiessolver.i386: dsf.i386.o galaxie2.i386.o malloc.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               dsf.i386.o galaxie2.i386.o malloc.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o -lm
+
+galaxiessolver: galaxiessolver.i386
+       $(LIPO) -create  galaxiessolver.i386 -output $@
+
+keensolver.i386: dsf.i386.o keen2.i386.o latin6.i386.o malloc.i386.o \
+               maxflow.i386.o misc.i386.o nullfe.i386.o random.i386.o \
+               tree234.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               dsf.i386.o keen2.i386.o latin6.i386.o malloc.i386.o \
+               maxflow.i386.o misc.i386.o nullfe.i386.o random.i386.o \
+               tree234.i386.o 
+
+keensolver: keensolver.i386
+       $(LIPO) -create  keensolver.i386 -output $@
+
+latincheck.i386: latin8.i386.o malloc.i386.o maxflow.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o tree234.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               latin8.i386.o malloc.i386.o maxflow.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o tree234.i386.o 
+
+latincheck: latincheck.i386
+       $(LIPO) -create  latincheck.i386 -output $@
+
+lightupsolver.i386: combi.i386.o lightup2.i386.o malloc.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               combi.i386.o lightup2.i386.o malloc.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o 
+
+lightupsolver: lightupsolver.i386
+       $(LIPO) -create  lightupsolver.i386 -output $@
+
+loopysolver.i386: dsf.i386.o grid.i386.o loopgen.i386.o loopy2.i386.o \
+               malloc.i386.o misc.i386.o nullfe.i386.o penrose.i386.o \
+               random.i386.o tree234.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               dsf.i386.o grid.i386.o loopgen.i386.o loopy2.i386.o \
+               malloc.i386.o misc.i386.o nullfe.i386.o penrose.i386.o \
+               random.i386.o tree234.i386.o -lm
+
+loopysolver: loopysolver.i386
+       $(LIPO) -create  loopysolver.i386 -output $@
+
+magnetssolver.i386: laydomino.i386.o magnets2.i386.o malloc.i386.o \
+               misc.i386.o nullfe.i386.o random.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               laydomino.i386.o magnets2.i386.o malloc.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o -lm
+
+magnetssolver: magnetssolver.i386
+       $(LIPO) -create  magnetssolver.i386 -output $@
+
+mapsolver.i386: dsf.i386.o malloc.i386.o map2.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               dsf.i386.o malloc.i386.o map2.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o -lm
+
+mapsolver: mapsolver.i386
+       $(LIPO) -create  mapsolver.i386 -output $@
+
+mineobfusc.i386: malloc.i386.o mines2.i386.o misc.i386.o nullfe.i386.o \
+               random.i386.o tree234.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               malloc.i386.o mines2.i386.o misc.i386.o nullfe.i386.o \
+               random.i386.o tree234.i386.o 
+
+mineobfusc: mineobfusc.i386
+       $(LIPO) -create  mineobfusc.i386 -output $@
+
+obfusc.i386: malloc.i386.o misc.i386.o nullfe.i386.o obfusc.i386.o \
+               random.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               malloc.i386.o misc.i386.o nullfe.i386.o obfusc.i386.o \
+               random.i386.o 
+
+obfusc: obfusc.i386
+       $(LIPO) -create  obfusc.i386 -output $@
+
+patternpicture.i386: malloc.i386.o misc.i386.o nullfe.i386.o pattern4.i386.o \
+               random.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               malloc.i386.o misc.i386.o nullfe.i386.o pattern4.i386.o \
+               random.i386.o 
+
+patternpicture: patternpicture.i386
+       $(LIPO) -create  patternpicture.i386 -output $@
+
+patternsolver.i386: malloc.i386.o misc.i386.o nullfe.i386.o pattern2.i386.o \
+               random.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               malloc.i386.o misc.i386.o nullfe.i386.o pattern2.i386.o \
+               random.i386.o 
+
+patternsolver: patternsolver.i386
+       $(LIPO) -create  patternsolver.i386 -output $@
+
+pearlbench.i386: dsf.i386.o grid.i386.o loopgen.i386.o malloc.i386.o \
+               misc.i386.o nullfe.i386.o pearl2.i386.o penrose.i386.o \
+               random.i386.o tdq.i386.o tree234.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               dsf.i386.o grid.i386.o loopgen.i386.o malloc.i386.o \
+               misc.i386.o nullfe.i386.o pearl2.i386.o penrose.i386.o \
+               random.i386.o tdq.i386.o tree234.i386.o -lm
+
+pearlbench: pearlbench.i386
+       $(LIPO) -create  pearlbench.i386 -output $@
+
+signpostsolver.i386: dsf.i386.o malloc.i386.o misc.i386.o nullfe.i386.o \
+               random.i386.o signpos2.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               dsf.i386.o malloc.i386.o misc.i386.o nullfe.i386.o \
+               random.i386.o signpos2.i386.o -lm
+
+signpostsolver: signpostsolver.i386
+       $(LIPO) -create  signpostsolver.i386 -output $@
+
+singlessolver.i386: dsf.i386.o latin.i386.o malloc.i386.o maxflow.i386.o \
+               misc.i386.o nullfe.i386.o random.i386.o singles3.i386.o \
+               tree234.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               dsf.i386.o latin.i386.o malloc.i386.o maxflow.i386.o \
+               misc.i386.o nullfe.i386.o random.i386.o singles3.i386.o \
+               tree234.i386.o 
+
+singlessolver: singlessolver.i386
+       $(LIPO) -create  singlessolver.i386 -output $@
+
+slantsolver.i386: dsf.i386.o findloop.i386.o malloc.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o slant2.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               dsf.i386.o findloop.i386.o malloc.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o slant2.i386.o 
+
+slantsolver: slantsolver.i386
+       $(LIPO) -create  slantsolver.i386 -output $@
+
+solosolver.i386: divvy.i386.o dsf.i386.o malloc.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o solo2.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               divvy.i386.o dsf.i386.o malloc.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o solo2.i386.o 
+
+solosolver: solosolver.i386
+       $(LIPO) -create  solosolver.i386 -output $@
+
+tentssolver.i386: dsf.i386.o malloc.i386.o maxflow.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o tents3.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               dsf.i386.o malloc.i386.o maxflow.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o tents3.i386.o 
+
+tentssolver: tentssolver.i386
+       $(LIPO) -create  tentssolver.i386 -output $@
+
+towerssolver.i386: latin6.i386.o malloc.i386.o maxflow.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o towers2.i386.o tree234.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               latin6.i386.o malloc.i386.o maxflow.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o towers2.i386.o tree234.i386.o 
+
+towerssolver: towerssolver.i386
+       $(LIPO) -create  towerssolver.i386 -output $@
+
+unequalsolver.i386: latin6.i386.o malloc.i386.o maxflow.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o tree234.i386.o unequal2.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               latin6.i386.o malloc.i386.o maxflow.i386.o misc.i386.o \
+               nullfe.i386.o random.i386.o tree234.i386.o unequal2.i386.o 
+
+unequalsolver: unequalsolver.i386
+       $(LIPO) -create  unequalsolver.i386 -output $@
+
+unrulysolver.i386: malloc.i386.o misc.i386.o nullfe.i386.o random.i386.o \
+               unruly2.i386.o
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(ULDFLAGS) -o $@ \
+               malloc.i386.o misc.i386.o nullfe.i386.o random.i386.o \
+               unruly2.i386.o 
+
+unrulysolver: unrulysolver.i386
+       $(LIPO) -create  unrulysolver.i386 -output $@
+
+blackbox.i386.o: ./blackbox.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+blackbox-icon.i386.o: icons/blackbox-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+blackbo3.i386.o: ./blackbox.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+bridges.i386.o: ./bridges.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+bridges-icon.i386.o: icons/bridges-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+bridges3.i386.o: ./bridges.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+combi.i386.o: ./combi.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube.i386.o: ./cube.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube-icon.i386.o: icons/cube-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+cube3.i386.o: ./cube.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+divvy.i386.o: ./divvy.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominosa.i386.o: ./dominosa.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominosa-icon.i386.o: icons/dominosa-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dominos3.i386.o: ./dominosa.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+drawing.i386.o: ./drawing.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+dsf.i386.o: ./dsf.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen.i386.o: ./fifteen.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen-icon.i386.o: icons/fifteen-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+fifteen5.i386.o: ./fifteen.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+fifteen2.i386.o: ./fifteen.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+filling.i386.o: ./filling.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+filling-icon.i386.o: icons/filling-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+filling5.i386.o: ./filling.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+filling2.i386.o: ./filling.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+findloop.i386.o: ./findloop.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip.i386.o: ./flip.c ./puzzles.h ./tree234.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip-icon.i386.o: icons/flip-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flip3.i386.o: ./flip.c ./puzzles.h ./tree234.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+flood.i386.o: ./flood.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flood-icon.i386.o: icons/flood-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+flood3.i386.o: ./flood.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+galaxies.i386.o: ./galaxies.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+galaxies-icon.i386.o: icons/galaxies-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+galaxie7.i386.o: ./galaxies.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+galaxie4.i386.o: ./galaxies.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_PICTURE_GENERATOR -c $< -o $@
+galaxie2.i386.o: ./galaxies.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+grid.i386.o: ./grid.c ./puzzles.h ./tree234.h ./grid.h ./penrose.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+gtk.i386.o: ./gtk.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess.i386.o: ./guess.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess-icon.i386.o: icons/guess-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+guess3.i386.o: ./guess.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+inertia.i386.o: ./inertia.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+inertia-icon.i386.o: icons/inertia-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+inertia3.i386.o: ./inertia.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+keen.i386.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+keen-icon.i386.o: icons/keen-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+keen5.i386.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+keen2.i386.o: ./keen.c ./puzzles.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+latin.i386.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+latin8.i386.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_LATIN_TEST -c $< -o $@
+latin6.i386.o: ./latin.c ./puzzles.h ./tree234.h ./maxflow.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+laydomino.i386.o: ./laydomino.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup.i386.o: ./lightup.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup-icon.i386.o: icons/lightup-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+lightup5.i386.o: ./lightup.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+lightup2.i386.o: ./lightup.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+list.i386.o: ./list.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopgen.i386.o: ./loopgen.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy.i386.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy-icon.i386.o: icons/loopy-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+loopy5.i386.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+loopy2.i386.o: ./loopy.c ./puzzles.h ./tree234.h ./grid.h ./loopgen.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+magnets.i386.o: ./magnets.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+magnets-icon.i386.o: icons/magnets-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+magnets5.i386.o: ./magnets.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+magnets2.i386.o: ./magnets.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+malloc.i386.o: ./malloc.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map.i386.o: ./map.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map-icon.i386.o: icons/map-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+map5.i386.o: ./map.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+map2.i386.o: ./map.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+maxflow.i386.o: ./maxflow.c ./maxflow.h ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+midend.i386.o: ./midend.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines.i386.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines-icon.i386.o: icons/mines-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+mines5.i386.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+mines2.i386.o: ./mines.c ./tree234.h ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_OBFUSCATOR -c $< -o $@
+misc.i386.o: ./misc.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net.i386.o: ./net.c ./puzzles.h ./tree234.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net-icon.i386.o: icons/net-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+net3.i386.o: ./net.c ./puzzles.h ./tree234.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+netslide.i386.o: ./netslide.c ./puzzles.h ./tree234.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+netslide-icon.i386.o: icons/netslide-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+netslid3.i386.o: ./netslide.c ./puzzles.h ./tree234.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+no-icon.i386.o: ./no-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+nullfe.i386.o: ./nullfe.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+nullgame.i386.o: ./nullgame.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+obfusc.i386.o: ./obfusc.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+osx.i386.o: ./osx.m ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 -x objective-c $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisade.i386.o: ./palisade.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisade-icon.i386.o: icons/palisade-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+palisad3.i386.o: ./palisade.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pattern.i386.o: ./pattern.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pattern-icon.i386.o: icons/pattern-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pattern7.i386.o: ./pattern.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pattern4.i386.o: ./pattern.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_PICTURE_GENERATOR -c $< -o $@
+pattern2.i386.o: ./pattern.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+pearl.i386.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pearl-icon.i386.o: icons/pearl-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pearl5.i386.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+pearl2.i386.o: ./pearl.c ./puzzles.h ./grid.h ./loopgen.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+pegs.i386.o: ./pegs.c ./puzzles.h ./tree234.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pegs-icon.i386.o: icons/pegs-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+pegs3.i386.o: ./pegs.c ./puzzles.h ./tree234.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+penrose.i386.o: ./penrose.c ./puzzles.h ./penrose.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+printing.i386.o: ./printing.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+ps.i386.o: ./ps.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+random.i386.o: ./random.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range.i386.o: ./range.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range-icon.i386.o: icons/range-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+range3.i386.o: ./range.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+rect.i386.o: ./rect.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+rect-icon.i386.o: icons/rect-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+rect3.i386.o: ./rect.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+samegame.i386.o: ./samegame.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+samegame-icon.i386.o: icons/samegame-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+samegam3.i386.o: ./samegame.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+signpost.i386.o: ./signpost.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+signpost-icon.i386.o: icons/signpost-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+signpos5.i386.o: ./signpost.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+signpos2.i386.o: ./signpost.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+singles.i386.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+singles-icon.i386.o: icons/singles-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+singles5.i386.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+singles3.i386.o: ./singles.c ./puzzles.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+sixteen.i386.o: ./sixteen.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+sixteen-icon.i386.o: icons/sixteen-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+sixteen3.i386.o: ./sixteen.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+slant.i386.o: ./slant.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+slant-icon.i386.o: icons/slant-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+slant5.i386.o: ./slant.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+slant2.i386.o: ./slant.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+solo.i386.o: ./solo.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+solo-icon.i386.o: icons/solo-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+solo5.i386.o: ./solo.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+solo2.i386.o: ./solo.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+tdq.i386.o: ./tdq.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents.i386.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents-icon.i386.o: icons/tents-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tents5.i386.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+tents3.i386.o: ./tents.c ./puzzles.h ./maxflow.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+towers.i386.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+towers-icon.i386.o: icons/towers-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+towers5.i386.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+towers2.i386.o: ./towers.c ./puzzles.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+tracks.i386.o: ./tracks.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tracks-icon.i386.o: icons/tracks-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+tracks3.i386.o: ./tracks.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+tree234.i386.o: ./tree234.c ./tree234.h ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle.i386.o: ./twiddle.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle-icon.i386.o: icons/twiddle-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+twiddle3.i386.o: ./twiddle.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+undead.i386.o: ./undead.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+undead-icon.i386.o: icons/undead-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+undead3.i386.o: ./undead.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unequal.i386.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unequal-icon.i386.o: icons/unequal-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unequal5.i386.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unequal2.i386.o: ./unequal.c ./puzzles.h ./latin.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+unruly.i386.o: ./unruly.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unruly-icon.i386.o: icons/unruly-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+unruly5.i386.o: ./unruly.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+unruly2.i386.o: ./unruly.c ./puzzles.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DSTANDALONE_SOLVER -c $< -o $@
+untangle.i386.o: ./untangle.c ./puzzles.h ./tree234.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+untangle-icon.i386.o: icons/untangle-icon.c
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+untangl3.i386.o: ./untangle.c ./puzzles.h ./tree234.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+version.i386.o: ./version.c ./version.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+windows.i386.o: ./windows.c ./puzzles.h ./resource.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -c $< -o $@
+windows1.i386.o: ./windows.c ./puzzles.h ./resource.h
+       $(CC) -arch i386 -mmacosx-version-min=10.4 $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) -DCOMBINED -c $< -o $@
+
+clean:
+       rm -f *.o *.dmg fifteensolver fifteensolver.i386 fillingsolver fillingsolver.i386 galaxiespicture galaxiespicture.i386 galaxiessolver galaxiessolver.i386 keensolver keensolver.i386 latincheck latincheck.i386 lightupsolver lightupsolver.i386 loopysolver loopysolver.i386 magnetssolver magnetssolver.i386 mapsolver mapsolver.i386 mineobfusc mineobfusc.i386 obfusc obfusc.i386 patternpicture patternpicture.i386 patternsolver patternsolver.i386 pearlbench pearlbench.i386 signpostsolver signpostsolver.i386 singlessolver singlessolver.i386 slantsolver slantsolver.i386 solosolver solosolver.i386 tentssolver tentssolver.i386 towerssolver towerssolver.i386 unequalsolver unequalsolver.i386 unrulysolver unrulysolver.i386
+       rm -rf *.app
diff --git a/Makefile.vc b/Makefile.vc
new file mode 100644 (file)
index 0000000..7fda755
--- /dev/null
@@ -0,0 +1,1205 @@
+# Makefile for puzzles under Visual C.
+#
+# This file was created by `mkfiles.pl' from the `Recipe' file.
+# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.
+
+# If you rename this file to `Makefile', you should change this line,
+# so that the .rsp files still depend on the correct makefile.
+MAKEFILE = Makefile.vc
+
+# C compilation flags
+CFLAGS = /nologo /W3 /O1 /D_WINDOWS /D_WIN32_WINDOWS=0x401 /DWINVER=0x401 /I.
+LFLAGS = /incremental:no /fixed
+
+all: blackbox.exe bridges.exe cube.exe dominosa.exe fifteen.exe \
+               fifteensolver.exe filling.exe fillingsolver.exe flip.exe \
+               flood.exe galaxies.exe galaxiespicture.exe \
+               galaxiessolver.exe guess.exe inertia.exe keen.exe \
+               keensolver.exe latincheck.exe lightup.exe lightupsolver.exe \
+               loopy.exe loopysolver.exe magnets.exe magnetssolver.exe \
+               map.exe mapsolver.exe mineobfusc.exe mines.exe netgame.exe \
+               netslide.exe nullgame.exe palisade.exe pattern.exe \
+               patternpicture.exe patternsolver.exe pearl.exe \
+               pearlbench.exe pegs.exe puzzles.exe range.exe rect.exe \
+               samegame.exe signpost.exe signpostsolver.exe singles.exe \
+               singlessolver.exe sixteen.exe slant.exe slantsolver.exe \
+               solo.exe solosolver.exe tents.exe tentssolver.exe towers.exe \
+               towerssolver.exe tracks.exe twiddle.exe undead.exe \
+               unequal.exe unequalsolver.exe unruly.exe unrulysolver.exe \
+               untangle.exe
+
+blackbox.exe: blackbox.obj blackbox.res drawing.obj malloc.obj midend.obj \
+               misc.obj printing.obj random.obj version.obj windows.obj \
+               blackbox.rsp
+       link $(LFLAGS) -out:blackbox.exe -map:blackbox.map @blackbox.rsp
+
+bridges.exe: bridges.obj bridges.res drawing.obj dsf.obj findloop.obj \
+               malloc.obj midend.obj misc.obj printing.obj random.obj \
+               version.obj windows.obj bridges.rsp
+       link $(LFLAGS) -out:bridges.exe -map:bridges.map @bridges.rsp
+
+cube.exe: cube.obj cube.res drawing.obj malloc.obj midend.obj misc.obj \
+               printing.obj random.obj version.obj windows.obj cube.rsp
+       link $(LFLAGS) -out:cube.exe -map:cube.map @cube.rsp
+
+dominosa.exe: dominosa.obj dominosa.res drawing.obj laydomino.obj malloc.obj \
+               midend.obj misc.obj printing.obj random.obj version.obj \
+               windows.obj dominosa.rsp
+       link $(LFLAGS) -out:dominosa.exe -map:dominosa.map @dominosa.rsp
+
+fifteen.exe: drawing.obj fifteen.obj fifteen.res malloc.obj midend.obj \
+               misc.obj printing.obj random.obj version.obj windows.obj \
+               fifteen.rsp
+       link $(LFLAGS) -out:fifteen.exe -map:fifteen.map @fifteen.rsp
+
+fifteensolver.exe: fifteen2.obj malloc.obj misc.obj nullfe.obj random.obj \
+               fifteensolver.rsp
+       link $(LFLAGS) -out:fifteensolver.exe -map:fifteensolver.map @fifteensolver.rsp
+
+filling.exe: drawing.obj dsf.obj filling.obj filling.res malloc.obj \
+               midend.obj misc.obj printing.obj random.obj version.obj \
+               windows.obj filling.rsp
+       link $(LFLAGS) -out:filling.exe -map:filling.map @filling.rsp
+
+fillingsolver.exe: dsf.obj filling2.obj malloc.obj misc.obj nullfe.obj \
+               random.obj fillingsolver.rsp
+       link $(LFLAGS) -out:fillingsolver.exe -map:fillingsolver.map @fillingsolver.rsp
+
+flip.exe: drawing.obj flip.obj flip.res malloc.obj midend.obj misc.obj \
+               printing.obj random.obj tree234.obj version.obj windows.obj \
+               flip.rsp
+       link $(LFLAGS) -out:flip.exe -map:flip.map @flip.rsp
+
+flood.exe: drawing.obj flood.obj flood.res malloc.obj midend.obj misc.obj \
+               printing.obj random.obj version.obj windows.obj flood.rsp
+       link $(LFLAGS) -out:flood.exe -map:flood.map @flood.rsp
+
+galaxies.exe: drawing.obj dsf.obj galaxies.obj galaxies.res malloc.obj \
+               midend.obj misc.obj printing.obj random.obj version.obj \
+               windows.obj galaxies.rsp
+       link $(LFLAGS) -out:galaxies.exe -map:galaxies.map @galaxies.rsp
+
+galaxiespicture.exe: dsf.obj galaxie4.obj malloc.obj misc.obj nullfe.obj \
+               random.obj galaxiespicture.rsp
+       link $(LFLAGS) -out:galaxiespicture.exe -map:galaxiespicture.map @galaxiespicture.rsp
+
+galaxiessolver.exe: dsf.obj galaxie2.obj malloc.obj misc.obj nullfe.obj \
+               random.obj galaxiessolver.rsp
+       link $(LFLAGS) -out:galaxiessolver.exe -map:galaxiessolver.map @galaxiessolver.rsp
+
+guess.exe: drawing.obj guess.obj guess.res malloc.obj midend.obj misc.obj \
+               printing.obj random.obj version.obj windows.obj guess.rsp
+       link $(LFLAGS) -out:guess.exe -map:guess.map @guess.rsp
+
+inertia.exe: drawing.obj inertia.obj inertia.res malloc.obj midend.obj \
+               misc.obj printing.obj random.obj version.obj windows.obj \
+               inertia.rsp
+       link $(LFLAGS) -out:inertia.exe -map:inertia.map @inertia.rsp
+
+keen.exe: drawing.obj dsf.obj keen.obj keen.res latin.obj malloc.obj \
+               maxflow.obj midend.obj misc.obj printing.obj random.obj \
+               tree234.obj version.obj windows.obj keen.rsp
+       link $(LFLAGS) -out:keen.exe -map:keen.map @keen.rsp
+
+keensolver.exe: dsf.obj keen2.obj latin6.obj malloc.obj maxflow.obj misc.obj \
+               nullfe.obj random.obj tree234.obj keensolver.rsp
+       link $(LFLAGS) -out:keensolver.exe -map:keensolver.map @keensolver.rsp
+
+latincheck.exe: latin8.obj malloc.obj maxflow.obj misc.obj nullfe.obj \
+               random.obj tree234.obj latincheck.rsp
+       link $(LFLAGS) -out:latincheck.exe -map:latincheck.map @latincheck.rsp
+
+lightup.exe: combi.obj drawing.obj lightup.obj lightup.res malloc.obj \
+               midend.obj misc.obj printing.obj random.obj version.obj \
+               windows.obj lightup.rsp
+       link $(LFLAGS) -out:lightup.exe -map:lightup.map @lightup.rsp
+
+lightupsolver.exe: combi.obj lightup2.obj malloc.obj misc.obj nullfe.obj \
+               random.obj lightupsolver.rsp
+       link $(LFLAGS) -out:lightupsolver.exe -map:lightupsolver.map @lightupsolver.rsp
+
+loopy.exe: drawing.obj dsf.obj grid.obj loopgen.obj loopy.obj loopy.res \
+               malloc.obj midend.obj misc.obj penrose.obj printing.obj \
+               random.obj tree234.obj version.obj windows.obj loopy.rsp
+       link $(LFLAGS) -out:loopy.exe -map:loopy.map @loopy.rsp
+
+loopysolver.exe: dsf.obj grid.obj loopgen.obj loopy2.obj malloc.obj misc.obj \
+               nullfe.obj penrose.obj random.obj tree234.obj \
+               loopysolver.rsp
+       link $(LFLAGS) -out:loopysolver.exe -map:loopysolver.map @loopysolver.rsp
+
+magnets.exe: drawing.obj laydomino.obj magnets.obj magnets.res malloc.obj \
+               midend.obj misc.obj printing.obj random.obj version.obj \
+               windows.obj magnets.rsp
+       link $(LFLAGS) -out:magnets.exe -map:magnets.map @magnets.rsp
+
+magnetssolver.exe: laydomino.obj magnets2.obj malloc.obj misc.obj nullfe.obj \
+               random.obj magnetssolver.rsp
+       link $(LFLAGS) -out:magnetssolver.exe -map:magnetssolver.map @magnetssolver.rsp
+
+map.exe: drawing.obj dsf.obj malloc.obj map.obj map.res midend.obj misc.obj \
+               printing.obj random.obj version.obj windows.obj map.rsp
+       link $(LFLAGS) -out:map.exe -map:map.map @map.rsp
+
+mapsolver.exe: dsf.obj malloc.obj map2.obj misc.obj nullfe.obj random.obj \
+               mapsolver.rsp
+       link $(LFLAGS) -out:mapsolver.exe -map:mapsolver.map @mapsolver.rsp
+
+mineobfusc.exe: malloc.obj mines2.obj misc.obj nullfe.obj random.obj \
+               tree234.obj mineobfusc.rsp
+       link $(LFLAGS) -out:mineobfusc.exe -map:mineobfusc.map @mineobfusc.rsp
+
+mines.exe: drawing.obj malloc.obj midend.obj mines.obj mines.res misc.obj \
+               printing.obj random.obj tree234.obj version.obj windows.obj \
+               mines.rsp
+       link $(LFLAGS) -out:mines.exe -map:mines.map @mines.rsp
+
+netgame.exe: drawing.obj dsf.obj findloop.obj malloc.obj midend.obj misc.obj \
+               net.obj net.res printing.obj random.obj tree234.obj \
+               version.obj windows.obj netgame.rsp
+       link $(LFLAGS) -out:netgame.exe -map:netgame.map @netgame.rsp
+
+netslide.exe: drawing.obj malloc.obj midend.obj misc.obj netslide.obj \
+               netslide.res printing.obj random.obj tree234.obj version.obj \
+               windows.obj netslide.rsp
+       link $(LFLAGS) -out:netslide.exe -map:netslide.map @netslide.rsp
+
+nullgame.exe: drawing.obj malloc.obj midend.obj misc.obj noicon.res \
+               nullgame.obj printing.obj random.obj version.obj windows.obj \
+               nullgame.rsp
+       link $(LFLAGS) -out:nullgame.exe -map:nullgame.map @nullgame.rsp
+
+palisade.exe: divvy.obj drawing.obj dsf.obj malloc.obj midend.obj misc.obj \
+               palisade.obj palisade.res printing.obj random.obj \
+               version.obj windows.obj palisade.rsp
+       link $(LFLAGS) -out:palisade.exe -map:palisade.map @palisade.rsp
+
+pattern.exe: drawing.obj malloc.obj midend.obj misc.obj pattern.obj \
+               pattern.res printing.obj random.obj version.obj windows.obj \
+               pattern.rsp
+       link $(LFLAGS) -out:pattern.exe -map:pattern.map @pattern.rsp
+
+patternpicture.exe: malloc.obj misc.obj nullfe.obj pattern4.obj random.obj \
+               patternpicture.rsp
+       link $(LFLAGS) -out:patternpicture.exe -map:patternpicture.map @patternpicture.rsp
+
+patternsolver.exe: malloc.obj misc.obj nullfe.obj pattern2.obj random.obj \
+               patternsolver.rsp
+       link $(LFLAGS) -out:patternsolver.exe -map:patternsolver.map @patternsolver.rsp
+
+pearl.exe: drawing.obj dsf.obj grid.obj loopgen.obj malloc.obj midend.obj \
+               misc.obj pearl.obj pearl.res penrose.obj printing.obj \
+               random.obj tdq.obj tree234.obj version.obj windows.obj \
+               pearl.rsp
+       link $(LFLAGS) -out:pearl.exe -map:pearl.map @pearl.rsp
+
+pearlbench.exe: dsf.obj grid.obj loopgen.obj malloc.obj misc.obj nullfe.obj \
+               pearl2.obj penrose.obj random.obj tdq.obj tree234.obj \
+               pearlbench.rsp
+       link $(LFLAGS) -out:pearlbench.exe -map:pearlbench.map @pearlbench.rsp
+
+pegs.exe: drawing.obj malloc.obj midend.obj misc.obj pegs.obj pegs.res \
+               printing.obj random.obj tree234.obj version.obj windows.obj \
+               pegs.rsp
+       link $(LFLAGS) -out:pegs.exe -map:pegs.map @pegs.rsp
+
+puzzles.exe: blackbo3.obj bridges3.obj combi.obj cube3.obj divvy.obj \
+               dominos3.obj drawing.obj dsf.obj fifteen5.obj filling5.obj \
+               findloop.obj flip3.obj flood3.obj galaxie7.obj grid.obj \
+               guess3.obj inertia3.obj keen5.obj latin.obj laydomino.obj \
+               lightup5.obj list.obj loopgen.obj loopy5.obj magnets5.obj \
+               malloc.obj map5.obj maxflow.obj midend.obj mines5.obj \
+               misc.obj net3.obj netslid3.obj noicon.res palisad3.obj \
+               pattern7.obj pearl5.obj pegs3.obj penrose.obj printing.obj \
+               random.obj range3.obj rect3.obj samegam3.obj signpos5.obj \
+               singles5.obj sixteen3.obj slant5.obj solo5.obj tdq.obj \
+               tents5.obj towers5.obj tracks3.obj tree234.obj twiddle3.obj \
+               undead3.obj unequal5.obj unruly5.obj untangl3.obj \
+               version.obj windows1.obj puzzles.rsp
+       link $(LFLAGS) -out:puzzles.exe -map:puzzles.map @puzzles.rsp
+
+range.exe: drawing.obj dsf.obj malloc.obj midend.obj misc.obj printing.obj \
+               random.obj range.obj range.res version.obj windows.obj \
+               range.rsp
+       link $(LFLAGS) -out:range.exe -map:range.map @range.rsp
+
+rect.exe: drawing.obj malloc.obj midend.obj misc.obj printing.obj random.obj \
+               rect.obj rect.res version.obj windows.obj rect.rsp
+       link $(LFLAGS) -out:rect.exe -map:rect.map @rect.rsp
+
+samegame.exe: drawing.obj malloc.obj midend.obj misc.obj printing.obj \
+               random.obj samegame.obj samegame.res version.obj windows.obj \
+               samegame.rsp
+       link $(LFLAGS) -out:samegame.exe -map:samegame.map @samegame.rsp
+
+signpost.exe: drawing.obj dsf.obj malloc.obj midend.obj misc.obj \
+               printing.obj random.obj signpost.obj signpost.res \
+               version.obj windows.obj signpost.rsp
+       link $(LFLAGS) -out:signpost.exe -map:signpost.map @signpost.rsp
+
+signpostsolver.exe: dsf.obj malloc.obj misc.obj nullfe.obj random.obj \
+               signpos2.obj signpostsolver.rsp
+       link $(LFLAGS) -out:signpostsolver.exe -map:signpostsolver.map @signpostsolver.rsp
+
+singles.exe: drawing.obj dsf.obj latin.obj malloc.obj maxflow.obj midend.obj \
+               misc.obj printing.obj random.obj singles.obj singles.res \
+               tree234.obj version.obj windows.obj singles.rsp
+       link $(LFLAGS) -out:singles.exe -map:singles.map @singles.rsp
+
+singlessolver.exe: dsf.obj latin.obj malloc.obj maxflow.obj misc.obj \
+               nullfe.obj random.obj singles3.obj tree234.obj \
+               singlessolver.rsp
+       link $(LFLAGS) -out:singlessolver.exe -map:singlessolver.map @singlessolver.rsp
+
+sixteen.exe: drawing.obj malloc.obj midend.obj misc.obj printing.obj \
+               random.obj sixteen.obj sixteen.res version.obj windows.obj \
+               sixteen.rsp
+       link $(LFLAGS) -out:sixteen.exe -map:sixteen.map @sixteen.rsp
+
+slant.exe: drawing.obj dsf.obj findloop.obj malloc.obj midend.obj misc.obj \
+               printing.obj random.obj slant.obj slant.res version.obj \
+               windows.obj slant.rsp
+       link $(LFLAGS) -out:slant.exe -map:slant.map @slant.rsp
+
+slantsolver.exe: dsf.obj findloop.obj malloc.obj misc.obj nullfe.obj \
+               random.obj slant2.obj slantsolver.rsp
+       link $(LFLAGS) -out:slantsolver.exe -map:slantsolver.map @slantsolver.rsp
+
+solo.exe: divvy.obj drawing.obj dsf.obj malloc.obj midend.obj misc.obj \
+               printing.obj random.obj solo.obj solo.res version.obj \
+               windows.obj solo.rsp
+       link $(LFLAGS) -out:solo.exe -map:solo.map @solo.rsp
+
+solosolver.exe: divvy.obj dsf.obj malloc.obj misc.obj nullfe.obj random.obj \
+               solo2.obj solosolver.rsp
+       link $(LFLAGS) -out:solosolver.exe -map:solosolver.map @solosolver.rsp
+
+tents.exe: drawing.obj dsf.obj malloc.obj maxflow.obj midend.obj misc.obj \
+               printing.obj random.obj tents.obj tents.res version.obj \
+               windows.obj tents.rsp
+       link $(LFLAGS) -out:tents.exe -map:tents.map @tents.rsp
+
+tentssolver.exe: dsf.obj malloc.obj maxflow.obj misc.obj nullfe.obj \
+               random.obj tents3.obj tentssolver.rsp
+       link $(LFLAGS) -out:tentssolver.exe -map:tentssolver.map @tentssolver.rsp
+
+towers.exe: drawing.obj latin.obj malloc.obj maxflow.obj midend.obj misc.obj \
+               printing.obj random.obj towers.obj towers.res tree234.obj \
+               version.obj windows.obj towers.rsp
+       link $(LFLAGS) -out:towers.exe -map:towers.map @towers.rsp
+
+towerssolver.exe: latin6.obj malloc.obj maxflow.obj misc.obj nullfe.obj \
+               random.obj towers2.obj tree234.obj towerssolver.rsp
+       link $(LFLAGS) -out:towerssolver.exe -map:towerssolver.map @towerssolver.rsp
+
+tracks.exe: drawing.obj dsf.obj findloop.obj malloc.obj midend.obj misc.obj \
+               printing.obj random.obj tracks.obj tracks.res version.obj \
+               windows.obj tracks.rsp
+       link $(LFLAGS) -out:tracks.exe -map:tracks.map @tracks.rsp
+
+twiddle.exe: drawing.obj malloc.obj midend.obj misc.obj printing.obj \
+               random.obj twiddle.obj twiddle.res version.obj windows.obj \
+               twiddle.rsp
+       link $(LFLAGS) -out:twiddle.exe -map:twiddle.map @twiddle.rsp
+
+undead.exe: drawing.obj malloc.obj midend.obj misc.obj printing.obj \
+               random.obj undead.obj undead.res version.obj windows.obj \
+               undead.rsp
+       link $(LFLAGS) -out:undead.exe -map:undead.map @undead.rsp
+
+unequal.exe: drawing.obj latin.obj malloc.obj maxflow.obj midend.obj \
+               misc.obj printing.obj random.obj tree234.obj unequal.obj \
+               unequal.res version.obj windows.obj unequal.rsp
+       link $(LFLAGS) -out:unequal.exe -map:unequal.map @unequal.rsp
+
+unequalsolver.exe: latin6.obj malloc.obj maxflow.obj misc.obj nullfe.obj \
+               random.obj tree234.obj unequal2.obj unequalsolver.rsp
+       link $(LFLAGS) -out:unequalsolver.exe -map:unequalsolver.map @unequalsolver.rsp
+
+unruly.exe: drawing.obj malloc.obj midend.obj misc.obj printing.obj \
+               random.obj unruly.obj unruly.res version.obj windows.obj \
+               unruly.rsp
+       link $(LFLAGS) -out:unruly.exe -map:unruly.map @unruly.rsp
+
+unrulysolver.exe: malloc.obj misc.obj nullfe.obj random.obj unruly2.obj \
+               unrulysolver.rsp
+       link $(LFLAGS) -out:unrulysolver.exe -map:unrulysolver.map @unrulysolver.rsp
+
+untangle.exe: drawing.obj malloc.obj midend.obj misc.obj printing.obj \
+               random.obj tree234.obj untangle.obj untangle.res version.obj \
+               windows.obj untangle.rsp
+       link $(LFLAGS) -out:untangle.exe -map:untangle.map @untangle.rsp
+
+blackbox.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > blackbox.rsp
+       echo blackbox.obj blackbox.res comctl32.lib >> blackbox.rsp
+       echo comdlg32.lib drawing.obj gdi32.lib malloc.obj >> blackbox.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> blackbox.rsp
+       echo user32.lib version.obj windows.obj winspool.lib >> blackbox.rsp
+
+bridges.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > bridges.rsp
+       echo bridges.obj bridges.res comctl32.lib comdlg32.lib >> bridges.rsp
+       echo drawing.obj dsf.obj findloop.obj gdi32.lib >> bridges.rsp
+       echo malloc.obj midend.obj misc.obj printing.obj >> bridges.rsp
+       echo random.obj user32.lib version.obj windows.obj >> bridges.rsp
+       echo winspool.lib >> bridges.rsp
+
+cube.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > cube.rsp
+       echo comctl32.lib comdlg32.lib cube.obj cube.res >> cube.rsp
+       echo drawing.obj gdi32.lib malloc.obj midend.obj >> cube.rsp
+       echo misc.obj printing.obj random.obj user32.lib >> cube.rsp
+       echo version.obj windows.obj winspool.lib >> cube.rsp
+
+dominosa.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > dominosa.rsp
+       echo comctl32.lib comdlg32.lib dominosa.obj >> dominosa.rsp
+       echo dominosa.res drawing.obj gdi32.lib laydomino.obj >> dominosa.rsp
+       echo malloc.obj midend.obj misc.obj printing.obj >> dominosa.rsp
+       echo random.obj user32.lib version.obj windows.obj >> dominosa.rsp
+       echo winspool.lib >> dominosa.rsp
+
+fifteen.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > fifteen.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj fifteen.obj >> fifteen.rsp
+       echo fifteen.res gdi32.lib malloc.obj midend.obj >> fifteen.rsp
+       echo misc.obj printing.obj random.obj user32.lib >> fifteen.rsp
+       echo version.obj windows.obj winspool.lib >> fifteen.rsp
+
+fifteensolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > fifteensolver.rsp
+       echo fifteen2.obj malloc.obj misc.obj nullfe.obj >> fifteensolver.rsp
+       echo random.obj >> fifteensolver.rsp
+
+filling.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > filling.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj dsf.obj >> filling.rsp
+       echo filling.obj filling.res gdi32.lib malloc.obj >> filling.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> filling.rsp
+       echo user32.lib version.obj windows.obj winspool.lib >> filling.rsp
+
+fillingsolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > fillingsolver.rsp
+       echo dsf.obj filling2.obj malloc.obj misc.obj >> fillingsolver.rsp
+       echo nullfe.obj random.obj >> fillingsolver.rsp
+
+flip.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > flip.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj flip.obj >> flip.rsp
+       echo flip.res gdi32.lib malloc.obj midend.obj misc.obj >> flip.rsp
+       echo printing.obj random.obj tree234.obj user32.lib >> flip.rsp
+       echo version.obj windows.obj winspool.lib >> flip.rsp
+
+flood.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > flood.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj flood.obj >> flood.rsp
+       echo flood.res gdi32.lib malloc.obj midend.obj >> flood.rsp
+       echo misc.obj printing.obj random.obj user32.lib >> flood.rsp
+       echo version.obj windows.obj winspool.lib >> flood.rsp
+
+galaxies.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > galaxies.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj dsf.obj >> galaxies.rsp
+       echo galaxies.obj galaxies.res gdi32.lib malloc.obj >> galaxies.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> galaxies.rsp
+       echo user32.lib version.obj windows.obj winspool.lib >> galaxies.rsp
+
+galaxiespicture.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > galaxiespicture.rsp
+       echo dsf.obj galaxie4.obj malloc.obj misc.obj >> galaxiespicture.rsp
+       echo nullfe.obj random.obj >> galaxiespicture.rsp
+
+galaxiessolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > galaxiessolver.rsp
+       echo dsf.obj galaxie2.obj malloc.obj misc.obj >> galaxiessolver.rsp
+       echo nullfe.obj random.obj >> galaxiessolver.rsp
+
+guess.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > guess.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> guess.rsp
+       echo guess.obj guess.res malloc.obj midend.obj >> guess.rsp
+       echo misc.obj printing.obj random.obj user32.lib >> guess.rsp
+       echo version.obj windows.obj winspool.lib >> guess.rsp
+
+inertia.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > inertia.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> inertia.rsp
+       echo inertia.obj inertia.res malloc.obj midend.obj >> inertia.rsp
+       echo misc.obj printing.obj random.obj user32.lib >> inertia.rsp
+       echo version.obj windows.obj winspool.lib >> inertia.rsp
+
+keen.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > keen.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj dsf.obj >> keen.rsp
+       echo gdi32.lib keen.obj keen.res latin.obj malloc.obj >> keen.rsp
+       echo maxflow.obj midend.obj misc.obj printing.obj >> keen.rsp
+       echo random.obj tree234.obj user32.lib version.obj >> keen.rsp
+       echo windows.obj winspool.lib >> keen.rsp
+
+keensolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > keensolver.rsp
+       echo dsf.obj keen2.obj latin6.obj malloc.obj >> keensolver.rsp
+       echo maxflow.obj misc.obj nullfe.obj random.obj >> keensolver.rsp
+       echo tree234.obj >> keensolver.rsp
+
+latincheck.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > latincheck.rsp
+       echo latin8.obj malloc.obj maxflow.obj misc.obj >> latincheck.rsp
+       echo nullfe.obj random.obj tree234.obj >> latincheck.rsp
+
+lightup.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > lightup.rsp
+       echo combi.obj comctl32.lib comdlg32.lib drawing.obj >> lightup.rsp
+       echo gdi32.lib lightup.obj lightup.res malloc.obj >> lightup.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> lightup.rsp
+       echo user32.lib version.obj windows.obj winspool.lib >> lightup.rsp
+
+lightupsolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > lightupsolver.rsp
+       echo combi.obj lightup2.obj malloc.obj misc.obj >> lightupsolver.rsp
+       echo nullfe.obj random.obj >> lightupsolver.rsp
+
+loopy.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > loopy.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj dsf.obj >> loopy.rsp
+       echo gdi32.lib grid.obj loopgen.obj loopy.obj >> loopy.rsp
+       echo loopy.res malloc.obj midend.obj misc.obj >> loopy.rsp
+       echo penrose.obj printing.obj random.obj tree234.obj >> loopy.rsp
+       echo user32.lib version.obj windows.obj winspool.lib >> loopy.rsp
+
+loopysolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > loopysolver.rsp
+       echo dsf.obj grid.obj loopgen.obj loopy2.obj >> loopysolver.rsp
+       echo malloc.obj misc.obj nullfe.obj penrose.obj >> loopysolver.rsp
+       echo random.obj tree234.obj >> loopysolver.rsp
+
+magnets.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > magnets.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> magnets.rsp
+       echo laydomino.obj magnets.obj magnets.res malloc.obj >> magnets.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> magnets.rsp
+       echo user32.lib version.obj windows.obj winspool.lib >> magnets.rsp
+
+magnetssolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > magnetssolver.rsp
+       echo laydomino.obj magnets2.obj malloc.obj misc.obj >> magnetssolver.rsp
+       echo nullfe.obj random.obj >> magnetssolver.rsp
+
+map.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > map.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj dsf.obj >> map.rsp
+       echo gdi32.lib malloc.obj map.obj map.res midend.obj >> map.rsp
+       echo misc.obj printing.obj random.obj user32.lib >> map.rsp
+       echo version.obj windows.obj winspool.lib >> map.rsp
+
+mapsolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > mapsolver.rsp
+       echo dsf.obj malloc.obj map2.obj misc.obj nullfe.obj >> mapsolver.rsp
+       echo random.obj >> mapsolver.rsp
+
+mineobfusc.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > mineobfusc.rsp
+       echo malloc.obj mines2.obj misc.obj nullfe.obj >> mineobfusc.rsp
+       echo random.obj tree234.obj >> mineobfusc.rsp
+
+mines.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > mines.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> mines.rsp
+       echo malloc.obj midend.obj mines.obj mines.res >> mines.rsp
+       echo misc.obj printing.obj random.obj tree234.obj >> mines.rsp
+       echo user32.lib version.obj windows.obj winspool.lib >> mines.rsp
+
+netgame.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > netgame.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj dsf.obj >> netgame.rsp
+       echo findloop.obj gdi32.lib malloc.obj midend.obj >> netgame.rsp
+       echo misc.obj net.obj net.res printing.obj random.obj >> netgame.rsp
+       echo tree234.obj user32.lib version.obj windows.obj >> netgame.rsp
+       echo winspool.lib >> netgame.rsp
+
+netslide.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > netslide.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> netslide.rsp
+       echo malloc.obj midend.obj misc.obj netslide.obj >> netslide.rsp
+       echo netslide.res printing.obj random.obj tree234.obj >> netslide.rsp
+       echo user32.lib version.obj windows.obj winspool.lib >> netslide.rsp
+
+nullgame.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > nullgame.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> nullgame.rsp
+       echo malloc.obj midend.obj misc.obj noicon.res >> nullgame.rsp
+       echo nullgame.obj printing.obj random.obj user32.lib >> nullgame.rsp
+       echo version.obj windows.obj winspool.lib >> nullgame.rsp
+
+palisade.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > palisade.rsp
+       echo comctl32.lib comdlg32.lib divvy.obj drawing.obj >> palisade.rsp
+       echo dsf.obj gdi32.lib malloc.obj midend.obj misc.obj >> palisade.rsp
+       echo palisade.obj palisade.res printing.obj random.obj >> palisade.rsp
+       echo user32.lib version.obj windows.obj winspool.lib >> palisade.rsp
+
+pattern.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > pattern.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> pattern.rsp
+       echo malloc.obj midend.obj misc.obj pattern.obj >> pattern.rsp
+       echo pattern.res printing.obj random.obj user32.lib >> pattern.rsp
+       echo version.obj windows.obj winspool.lib >> pattern.rsp
+
+patternpicture.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > patternpicture.rsp
+       echo malloc.obj misc.obj nullfe.obj pattern4.obj >> patternpicture.rsp
+       echo random.obj >> patternpicture.rsp
+
+patternsolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > patternsolver.rsp
+       echo malloc.obj misc.obj nullfe.obj pattern2.obj >> patternsolver.rsp
+       echo random.obj >> patternsolver.rsp
+
+pearl.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > pearl.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj dsf.obj >> pearl.rsp
+       echo gdi32.lib grid.obj loopgen.obj malloc.obj >> pearl.rsp
+       echo midend.obj misc.obj pearl.obj pearl.res >> pearl.rsp
+       echo penrose.obj printing.obj random.obj tdq.obj >> pearl.rsp
+       echo tree234.obj user32.lib version.obj windows.obj >> pearl.rsp
+       echo winspool.lib >> pearl.rsp
+
+pearlbench.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > pearlbench.rsp
+       echo dsf.obj grid.obj loopgen.obj malloc.obj misc.obj >> pearlbench.rsp
+       echo nullfe.obj pearl2.obj penrose.obj random.obj >> pearlbench.rsp
+       echo tdq.obj tree234.obj >> pearlbench.rsp
+
+pegs.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > pegs.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> pegs.rsp
+       echo malloc.obj midend.obj misc.obj pegs.obj pegs.res >> pegs.rsp
+       echo printing.obj random.obj tree234.obj user32.lib >> pegs.rsp
+       echo version.obj windows.obj winspool.lib >> pegs.rsp
+
+puzzles.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > puzzles.rsp
+       echo blackbo3.obj bridges3.obj combi.obj comctl32.lib >> puzzles.rsp
+       echo comdlg32.lib cube3.obj divvy.obj dominos3.obj >> puzzles.rsp
+       echo drawing.obj dsf.obj fifteen5.obj filling5.obj >> puzzles.rsp
+       echo findloop.obj flip3.obj flood3.obj galaxie7.obj >> puzzles.rsp
+       echo gdi32.lib grid.obj guess3.obj inertia3.obj >> puzzles.rsp
+       echo keen5.obj latin.obj laydomino.obj lightup5.obj >> puzzles.rsp
+       echo list.obj loopgen.obj loopy5.obj magnets5.obj >> puzzles.rsp
+       echo malloc.obj map5.obj maxflow.obj midend.obj >> puzzles.rsp
+       echo mines5.obj misc.obj net3.obj netslid3.obj >> puzzles.rsp
+       echo noicon.res palisad3.obj pattern7.obj pearl5.obj >> puzzles.rsp
+       echo pegs3.obj penrose.obj printing.obj random.obj >> puzzles.rsp
+       echo range3.obj rect3.obj samegam3.obj signpos5.obj >> puzzles.rsp
+       echo singles5.obj sixteen3.obj slant5.obj solo5.obj >> puzzles.rsp
+       echo tdq.obj tents5.obj towers5.obj tracks3.obj >> puzzles.rsp
+       echo tree234.obj twiddle3.obj undead3.obj unequal5.obj >> puzzles.rsp
+       echo unruly5.obj untangl3.obj user32.lib version.obj >> puzzles.rsp
+       echo windows1.obj winspool.lib >> puzzles.rsp
+
+range.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > range.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj dsf.obj >> range.rsp
+       echo gdi32.lib malloc.obj midend.obj misc.obj >> range.rsp
+       echo printing.obj random.obj range.obj range.res >> range.rsp
+       echo user32.lib version.obj windows.obj winspool.lib >> range.rsp
+
+rect.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > rect.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> rect.rsp
+       echo malloc.obj midend.obj misc.obj printing.obj >> rect.rsp
+       echo random.obj rect.obj rect.res user32.lib >> rect.rsp
+       echo version.obj windows.obj winspool.lib >> rect.rsp
+
+samegame.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > samegame.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> samegame.rsp
+       echo malloc.obj midend.obj misc.obj printing.obj >> samegame.rsp
+       echo random.obj samegame.obj samegame.res user32.lib >> samegame.rsp
+       echo version.obj windows.obj winspool.lib >> samegame.rsp
+
+signpost.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > signpost.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj dsf.obj >> signpost.rsp
+       echo gdi32.lib malloc.obj midend.obj misc.obj >> signpost.rsp
+       echo printing.obj random.obj signpost.obj signpost.res >> signpost.rsp
+       echo user32.lib version.obj windows.obj winspool.lib >> signpost.rsp
+
+signpostsolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > signpostsolver.rsp
+       echo dsf.obj malloc.obj misc.obj nullfe.obj random.obj >> signpostsolver.rsp
+       echo signpos2.obj >> signpostsolver.rsp
+
+singles.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > singles.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj dsf.obj >> singles.rsp
+       echo gdi32.lib latin.obj malloc.obj maxflow.obj >> singles.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> singles.rsp
+       echo singles.obj singles.res tree234.obj user32.lib >> singles.rsp
+       echo version.obj windows.obj winspool.lib >> singles.rsp
+
+singlessolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > singlessolver.rsp
+       echo dsf.obj latin.obj malloc.obj maxflow.obj misc.obj >> singlessolver.rsp
+       echo nullfe.obj random.obj singles3.obj tree234.obj >> singlessolver.rsp
+
+sixteen.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > sixteen.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> sixteen.rsp
+       echo malloc.obj midend.obj misc.obj printing.obj >> sixteen.rsp
+       echo random.obj sixteen.obj sixteen.res user32.lib >> sixteen.rsp
+       echo version.obj windows.obj winspool.lib >> sixteen.rsp
+
+slant.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > slant.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj dsf.obj >> slant.rsp
+       echo findloop.obj gdi32.lib malloc.obj midend.obj >> slant.rsp
+       echo misc.obj printing.obj random.obj slant.obj >> slant.rsp
+       echo slant.res user32.lib version.obj windows.obj >> slant.rsp
+       echo winspool.lib >> slant.rsp
+
+slantsolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > slantsolver.rsp
+       echo dsf.obj findloop.obj malloc.obj misc.obj >> slantsolver.rsp
+       echo nullfe.obj random.obj slant2.obj >> slantsolver.rsp
+
+solo.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > solo.rsp
+       echo comctl32.lib comdlg32.lib divvy.obj drawing.obj >> solo.rsp
+       echo dsf.obj gdi32.lib malloc.obj midend.obj misc.obj >> solo.rsp
+       echo printing.obj random.obj solo.obj solo.res >> solo.rsp
+       echo user32.lib version.obj windows.obj winspool.lib >> solo.rsp
+
+solosolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > solosolver.rsp
+       echo divvy.obj dsf.obj malloc.obj misc.obj nullfe.obj >> solosolver.rsp
+       echo random.obj solo2.obj >> solosolver.rsp
+
+tents.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > tents.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj dsf.obj >> tents.rsp
+       echo gdi32.lib malloc.obj maxflow.obj midend.obj >> tents.rsp
+       echo misc.obj printing.obj random.obj tents.obj >> tents.rsp
+       echo tents.res user32.lib version.obj windows.obj >> tents.rsp
+       echo winspool.lib >> tents.rsp
+
+tentssolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > tentssolver.rsp
+       echo dsf.obj malloc.obj maxflow.obj misc.obj >> tentssolver.rsp
+       echo nullfe.obj random.obj tents3.obj >> tentssolver.rsp
+
+towers.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > towers.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> towers.rsp
+       echo latin.obj malloc.obj maxflow.obj midend.obj >> towers.rsp
+       echo misc.obj printing.obj random.obj towers.obj >> towers.rsp
+       echo towers.res tree234.obj user32.lib version.obj >> towers.rsp
+       echo windows.obj winspool.lib >> towers.rsp
+
+towerssolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > towerssolver.rsp
+       echo latin6.obj malloc.obj maxflow.obj misc.obj >> towerssolver.rsp
+       echo nullfe.obj random.obj towers2.obj tree234.obj >> towerssolver.rsp
+
+tracks.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > tracks.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj dsf.obj >> tracks.rsp
+       echo findloop.obj gdi32.lib malloc.obj midend.obj >> tracks.rsp
+       echo misc.obj printing.obj random.obj tracks.obj >> tracks.rsp
+       echo tracks.res user32.lib version.obj windows.obj >> tracks.rsp
+       echo winspool.lib >> tracks.rsp
+
+twiddle.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > twiddle.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> twiddle.rsp
+       echo malloc.obj midend.obj misc.obj printing.obj >> twiddle.rsp
+       echo random.obj twiddle.obj twiddle.res user32.lib >> twiddle.rsp
+       echo version.obj windows.obj winspool.lib >> twiddle.rsp
+
+undead.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > undead.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> undead.rsp
+       echo malloc.obj midend.obj misc.obj printing.obj >> undead.rsp
+       echo random.obj undead.obj undead.res user32.lib >> undead.rsp
+       echo version.obj windows.obj winspool.lib >> undead.rsp
+
+unequal.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > unequal.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> unequal.rsp
+       echo latin.obj malloc.obj maxflow.obj midend.obj >> unequal.rsp
+       echo misc.obj printing.obj random.obj tree234.obj >> unequal.rsp
+       echo unequal.obj unequal.res user32.lib version.obj >> unequal.rsp
+       echo windows.obj winspool.lib >> unequal.rsp
+
+unequalsolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > unequalsolver.rsp
+       echo latin6.obj malloc.obj maxflow.obj misc.obj >> unequalsolver.rsp
+       echo nullfe.obj random.obj tree234.obj unequal2.obj >> unequalsolver.rsp
+
+unruly.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > unruly.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> unruly.rsp
+       echo malloc.obj midend.obj misc.obj printing.obj >> unruly.rsp
+       echo random.obj unruly.obj unruly.res user32.lib >> unruly.rsp
+       echo version.obj windows.obj winspool.lib >> unruly.rsp
+
+unrulysolver.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:console > unrulysolver.rsp
+       echo malloc.obj misc.obj nullfe.obj random.obj >> unrulysolver.rsp
+       echo unruly2.obj >> unrulysolver.rsp
+
+untangle.rsp: $(MAKEFILE)
+       echo /nologo /subsystem:windows > untangle.rsp
+       echo comctl32.lib comdlg32.lib drawing.obj gdi32.lib >> untangle.rsp
+       echo malloc.obj midend.obj misc.obj printing.obj >> untangle.rsp
+       echo random.obj tree234.obj untangle.obj untangle.res >> untangle.rsp
+       echo user32.lib version.obj windows.obj winspool.lib >> untangle.rsp
+
+blackbox.obj: .\blackbox.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\blackbox.c /Foblackbox.obj
+blackbox-icon.obj: icons\blackbox-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\blackbox-icon.c /Foblackbox-icon.obj
+blackbox.res: icons\blackbox.rc .\puzzles.rc2 icons\blackbox.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -foblackbox.res icons\blackbox.rc
+blackbo3.obj: .\blackbox.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\blackbox.c /Foblackbo3.obj
+bridges.obj: .\bridges.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\bridges.c /Fobridges.obj
+bridges-icon.obj: icons\bridges-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\bridges-icon.c /Fobridges-icon.obj
+bridges.res: icons\bridges.rc .\puzzles.rc2 icons\bridges.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fobridges.res icons\bridges.rc
+bridges3.obj: .\bridges.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\bridges.c /Fobridges3.obj
+combi.obj: .\combi.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\combi.c /Focombi.obj
+cube.obj: .\cube.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\cube.c /Focube.obj
+cube-icon.obj: icons\cube-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\cube-icon.c /Focube-icon.obj
+cube.res: icons\cube.rc .\puzzles.rc2 icons\cube.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -focube.res icons\cube.rc
+cube3.obj: .\cube.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\cube.c /Focube3.obj
+divvy.obj: .\divvy.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\divvy.c /Fodivvy.obj
+dominosa.obj: .\dominosa.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\dominosa.c /Fodominosa.obj
+dominosa-icon.obj: icons\dominosa-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\dominosa-icon.c /Fodominosa-icon.obj
+dominosa.res: icons\dominosa.rc .\puzzles.rc2 icons\dominosa.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fodominosa.res icons\dominosa.rc
+dominos3.obj: .\dominosa.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\dominosa.c /Fodominos3.obj
+drawing.obj: .\drawing.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\drawing.c /Fodrawing.obj
+dsf.obj: .\dsf.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\dsf.c /Fodsf.obj
+fifteen.obj: .\fifteen.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\fifteen.c /Fofifteen.obj
+fifteen-icon.obj: icons\fifteen-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\fifteen-icon.c /Fofifteen-icon.obj
+fifteen.res: icons\fifteen.rc .\puzzles.rc2 icons\fifteen.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fofifteen.res icons\fifteen.rc
+fifteen5.obj: .\fifteen.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\fifteen.c /Fofifteen5.obj
+fifteen2.obj: .\fifteen.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\fifteen.c /Fofifteen2.obj
+filling.obj: .\filling.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\filling.c /Fofilling.obj
+filling-icon.obj: icons\filling-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\filling-icon.c /Fofilling-icon.obj
+filling.res: icons\filling.rc .\puzzles.rc2 icons\filling.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fofilling.res icons\filling.rc
+filling5.obj: .\filling.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\filling.c /Fofilling5.obj
+filling2.obj: .\filling.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\filling.c /Fofilling2.obj
+findloop.obj: .\findloop.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\findloop.c /Fofindloop.obj
+flip.obj: .\flip.c .\puzzles.h .\tree234.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\flip.c /Foflip.obj
+flip-icon.obj: icons\flip-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\flip-icon.c /Foflip-icon.obj
+flip.res: icons\flip.rc .\puzzles.rc2 icons\flip.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -foflip.res icons\flip.rc
+flip3.obj: .\flip.c .\puzzles.h .\tree234.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\flip.c /Foflip3.obj
+flood.obj: .\flood.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\flood.c /Foflood.obj
+flood-icon.obj: icons\flood-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\flood-icon.c /Foflood-icon.obj
+flood.res: icons\flood.rc .\puzzles.rc2 icons\flood.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -foflood.res icons\flood.rc
+flood3.obj: .\flood.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\flood.c /Foflood3.obj
+galaxies.obj: .\galaxies.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\galaxies.c /Fogalaxies.obj
+galaxies-icon.obj: icons\galaxies-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\galaxies-icon.c /Fogalaxies-icon.obj
+galaxies.res: icons\galaxies.rc .\puzzles.rc2 icons\galaxies.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fogalaxies.res icons\galaxies.rc
+galaxie7.obj: .\galaxies.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\galaxies.c /Fogalaxie7.obj
+galaxie4.obj: .\galaxies.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_PICTURE_GENERATOR /c .\galaxies.c /Fogalaxie4.obj
+galaxie2.obj: .\galaxies.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\galaxies.c /Fogalaxie2.obj
+grid.obj: .\grid.c .\puzzles.h .\tree234.h .\grid.h .\penrose.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\grid.c /Fogrid.obj
+gtk.obj: .\gtk.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\gtk.c /Fogtk.obj
+guess.obj: .\guess.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\guess.c /Foguess.obj
+guess-icon.obj: icons\guess-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\guess-icon.c /Foguess-icon.obj
+guess.res: icons\guess.rc .\puzzles.rc2 icons\guess.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -foguess.res icons\guess.rc
+guess3.obj: .\guess.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\guess.c /Foguess3.obj
+inertia.obj: .\inertia.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\inertia.c /Foinertia.obj
+inertia-icon.obj: icons\inertia-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\inertia-icon.c /Foinertia-icon.obj
+inertia.res: icons\inertia.rc .\puzzles.rc2 icons\inertia.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -foinertia.res icons\inertia.rc
+inertia3.obj: .\inertia.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\inertia.c /Foinertia3.obj
+keen.obj: .\keen.c .\puzzles.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\keen.c /Fokeen.obj
+keen-icon.obj: icons\keen-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\keen-icon.c /Fokeen-icon.obj
+keen.res: icons\keen.rc .\puzzles.rc2 icons\keen.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fokeen.res icons\keen.rc
+keen5.obj: .\keen.c .\puzzles.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\keen.c /Fokeen5.obj
+keen2.obj: .\keen.c .\puzzles.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\keen.c /Fokeen2.obj
+latin.obj: .\latin.c .\puzzles.h .\tree234.h .\maxflow.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\latin.c /Folatin.obj
+latin8.obj: .\latin.c .\puzzles.h .\tree234.h .\maxflow.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_LATIN_TEST /c .\latin.c /Folatin8.obj
+latin6.obj: .\latin.c .\puzzles.h .\tree234.h .\maxflow.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\latin.c /Folatin6.obj
+laydomino.obj: .\laydomino.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\laydomino.c /Folaydomino.obj
+lightup.obj: .\lightup.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\lightup.c /Folightup.obj
+lightup-icon.obj: icons\lightup-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\lightup-icon.c /Folightup-icon.obj
+lightup.res: icons\lightup.rc .\puzzles.rc2 icons\lightup.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -folightup.res icons\lightup.rc
+lightup5.obj: .\lightup.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\lightup.c /Folightup5.obj
+lightup2.obj: .\lightup.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\lightup.c /Folightup2.obj
+list.obj: .\list.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\list.c /Folist.obj
+loopgen.obj: .\loopgen.c .\puzzles.h .\tree234.h .\grid.h .\loopgen.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\loopgen.c /Foloopgen.obj
+loopy.obj: .\loopy.c .\puzzles.h .\tree234.h .\grid.h .\loopgen.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\loopy.c /Foloopy.obj
+loopy-icon.obj: icons\loopy-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\loopy-icon.c /Foloopy-icon.obj
+loopy.res: icons\loopy.rc .\puzzles.rc2 icons\loopy.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -foloopy.res icons\loopy.rc
+loopy5.obj: .\loopy.c .\puzzles.h .\tree234.h .\grid.h .\loopgen.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\loopy.c /Foloopy5.obj
+loopy2.obj: .\loopy.c .\puzzles.h .\tree234.h .\grid.h .\loopgen.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\loopy.c /Foloopy2.obj
+magnets.obj: .\magnets.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\magnets.c /Fomagnets.obj
+magnets-icon.obj: icons\magnets-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\magnets-icon.c /Fomagnets-icon.obj
+magnets.res: icons\magnets.rc .\puzzles.rc2 icons\magnets.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fomagnets.res icons\magnets.rc
+magnets5.obj: .\magnets.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\magnets.c /Fomagnets5.obj
+magnets2.obj: .\magnets.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\magnets.c /Fomagnets2.obj
+malloc.obj: .\malloc.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\malloc.c /Fomalloc.obj
+map.obj: .\map.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\map.c /Fomap.obj
+map-icon.obj: icons\map-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\map-icon.c /Fomap-icon.obj
+map.res: icons\map.rc .\puzzles.rc2 icons\map.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fomap.res icons\map.rc
+map5.obj: .\map.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\map.c /Fomap5.obj
+map2.obj: .\map.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\map.c /Fomap2.obj
+maxflow.obj: .\maxflow.c .\maxflow.h .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\maxflow.c /Fomaxflow.obj
+midend.obj: .\midend.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\midend.c /Fomidend.obj
+mines.obj: .\mines.c .\tree234.h .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\mines.c /Fomines.obj
+mines-icon.obj: icons\mines-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\mines-icon.c /Fomines-icon.obj
+mines.res: icons\mines.rc .\puzzles.rc2 icons\mines.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fomines.res icons\mines.rc
+mines5.obj: .\mines.c .\tree234.h .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\mines.c /Fomines5.obj
+mines2.obj: .\mines.c .\tree234.h .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_OBFUSCATOR /c .\mines.c /Fomines2.obj
+misc.obj: .\misc.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\misc.c /Fomisc.obj
+net.obj: .\net.c .\puzzles.h .\tree234.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\net.c /Fonet.obj
+net-icon.obj: icons\net-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\net-icon.c /Fonet-icon.obj
+net.res: icons\net.rc .\puzzles.rc2 icons\net.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fonet.res icons\net.rc
+net3.obj: .\net.c .\puzzles.h .\tree234.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\net.c /Fonet3.obj
+netslide.obj: .\netslide.c .\puzzles.h .\tree234.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\netslide.c /Fonetslide.obj
+netslide-icon.obj: icons\netslide-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\netslide-icon.c /Fonetslide-icon.obj
+netslide.res: icons\netslide.rc .\puzzles.rc2 icons\netslide.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fonetslide.res icons\netslide.rc
+netslid3.obj: .\netslide.c .\puzzles.h .\tree234.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\netslide.c /Fonetslid3.obj
+no-icon.obj: .\no-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\no-icon.c /Fono-icon.obj
+noicon.res: .\noicon.rc .\puzzles.rc2 .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fonoicon.res .\noicon.rc
+nullfe.obj: .\nullfe.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\nullfe.c /Fonullfe.obj
+nullgame.obj: .\nullgame.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\nullgame.c /Fonullgame.obj
+obfusc.obj: .\obfusc.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\obfusc.c /Foobfusc.obj
+osx.obj: .\osx.m .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\osx.m /Foosx.obj
+palisade.obj: .\palisade.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\palisade.c /Fopalisade.obj
+palisade-icon.obj: icons\palisade-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\palisade-icon.c /Fopalisade-icon.obj
+palisade.res: icons\palisade.rc .\puzzles.rc2 icons\palisade.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fopalisade.res icons\palisade.rc
+palisad3.obj: .\palisade.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\palisade.c /Fopalisad3.obj
+pattern.obj: .\pattern.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\pattern.c /Fopattern.obj
+pattern-icon.obj: icons\pattern-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\pattern-icon.c /Fopattern-icon.obj
+pattern.res: icons\pattern.rc .\puzzles.rc2 icons\pattern.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fopattern.res icons\pattern.rc
+pattern7.obj: .\pattern.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\pattern.c /Fopattern7.obj
+pattern4.obj: .\pattern.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_PICTURE_GENERATOR /c .\pattern.c /Fopattern4.obj
+pattern2.obj: .\pattern.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\pattern.c /Fopattern2.obj
+pearl.obj: .\pearl.c .\puzzles.h .\grid.h .\loopgen.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\pearl.c /Fopearl.obj
+pearl-icon.obj: icons\pearl-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\pearl-icon.c /Fopearl-icon.obj
+pearl.res: icons\pearl.rc .\puzzles.rc2 icons\pearl.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fopearl.res icons\pearl.rc
+pearl5.obj: .\pearl.c .\puzzles.h .\grid.h .\loopgen.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\pearl.c /Fopearl5.obj
+pearl2.obj: .\pearl.c .\puzzles.h .\grid.h .\loopgen.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\pearl.c /Fopearl2.obj
+pegs.obj: .\pegs.c .\puzzles.h .\tree234.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\pegs.c /Fopegs.obj
+pegs-icon.obj: icons\pegs-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\pegs-icon.c /Fopegs-icon.obj
+pegs.res: icons\pegs.rc .\puzzles.rc2 icons\pegs.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fopegs.res icons\pegs.rc
+pegs3.obj: .\pegs.c .\puzzles.h .\tree234.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\pegs.c /Fopegs3.obj
+penrose.obj: .\penrose.c .\puzzles.h .\penrose.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\penrose.c /Fopenrose.obj
+printing.obj: .\printing.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\printing.c /Foprinting.obj
+ps.obj: .\ps.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\ps.c /Fops.obj
+random.obj: .\random.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\random.c /Forandom.obj
+range.obj: .\range.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\range.c /Forange.obj
+range-icon.obj: icons\range-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\range-icon.c /Forange-icon.obj
+range.res: icons\range.rc .\puzzles.rc2 icons\range.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -forange.res icons\range.rc
+range3.obj: .\range.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\range.c /Forange3.obj
+rect.obj: .\rect.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\rect.c /Forect.obj
+rect-icon.obj: icons\rect-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\rect-icon.c /Forect-icon.obj
+rect.res: icons\rect.rc .\puzzles.rc2 icons\rect.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -forect.res icons\rect.rc
+rect3.obj: .\rect.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\rect.c /Forect3.obj
+samegame.obj: .\samegame.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\samegame.c /Fosamegame.obj
+samegame-icon.obj: icons\samegame-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\samegame-icon.c /Fosamegame-icon.obj
+samegame.res: icons\samegame.rc .\puzzles.rc2 icons\samegame.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fosamegame.res icons\samegame.rc
+samegam3.obj: .\samegame.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\samegame.c /Fosamegam3.obj
+signpost.obj: .\signpost.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\signpost.c /Fosignpost.obj
+signpost-icon.obj: icons\signpost-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\signpost-icon.c /Fosignpost-icon.obj
+signpost.res: icons\signpost.rc .\puzzles.rc2 icons\signpost.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fosignpost.res icons\signpost.rc
+signpos5.obj: .\signpost.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\signpost.c /Fosignpos5.obj
+signpos2.obj: .\signpost.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\signpost.c /Fosignpos2.obj
+singles.obj: .\singles.c .\puzzles.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\singles.c /Fosingles.obj
+singles-icon.obj: icons\singles-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\singles-icon.c /Fosingles-icon.obj
+singles.res: icons\singles.rc .\puzzles.rc2 icons\singles.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fosingles.res icons\singles.rc
+singles5.obj: .\singles.c .\puzzles.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\singles.c /Fosingles5.obj
+singles3.obj: .\singles.c .\puzzles.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\singles.c /Fosingles3.obj
+sixteen.obj: .\sixteen.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\sixteen.c /Fosixteen.obj
+sixteen-icon.obj: icons\sixteen-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\sixteen-icon.c /Fosixteen-icon.obj
+sixteen.res: icons\sixteen.rc .\puzzles.rc2 icons\sixteen.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fosixteen.res icons\sixteen.rc
+sixteen3.obj: .\sixteen.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\sixteen.c /Fosixteen3.obj
+slant.obj: .\slant.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\slant.c /Foslant.obj
+slant-icon.obj: icons\slant-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\slant-icon.c /Foslant-icon.obj
+slant.res: icons\slant.rc .\puzzles.rc2 icons\slant.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -foslant.res icons\slant.rc
+slant5.obj: .\slant.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\slant.c /Foslant5.obj
+slant2.obj: .\slant.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\slant.c /Foslant2.obj
+solo.obj: .\solo.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\solo.c /Fosolo.obj
+solo-icon.obj: icons\solo-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\solo-icon.c /Fosolo-icon.obj
+solo.res: icons\solo.rc .\puzzles.rc2 icons\solo.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fosolo.res icons\solo.rc
+solo5.obj: .\solo.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\solo.c /Fosolo5.obj
+solo2.obj: .\solo.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\solo.c /Fosolo2.obj
+tdq.obj: .\tdq.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\tdq.c /Fotdq.obj
+tents.obj: .\tents.c .\puzzles.h .\maxflow.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\tents.c /Fotents.obj
+tents-icon.obj: icons\tents-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\tents-icon.c /Fotents-icon.obj
+tents.res: icons\tents.rc .\puzzles.rc2 icons\tents.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fotents.res icons\tents.rc
+tents5.obj: .\tents.c .\puzzles.h .\maxflow.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\tents.c /Fotents5.obj
+tents3.obj: .\tents.c .\puzzles.h .\maxflow.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\tents.c /Fotents3.obj
+towers.obj: .\towers.c .\puzzles.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\towers.c /Fotowers.obj
+towers-icon.obj: icons\towers-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\towers-icon.c /Fotowers-icon.obj
+towers.res: icons\towers.rc .\puzzles.rc2 icons\towers.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fotowers.res icons\towers.rc
+towers5.obj: .\towers.c .\puzzles.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\towers.c /Fotowers5.obj
+towers2.obj: .\towers.c .\puzzles.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\towers.c /Fotowers2.obj
+tracks.obj: .\tracks.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\tracks.c /Fotracks.obj
+tracks-icon.obj: icons\tracks-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\tracks-icon.c /Fotracks-icon.obj
+tracks.res: icons\tracks.rc .\puzzles.rc2 icons\tracks.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fotracks.res icons\tracks.rc
+tracks3.obj: .\tracks.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\tracks.c /Fotracks3.obj
+tree234.obj: .\tree234.c .\tree234.h .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\tree234.c /Fotree234.obj
+twiddle.obj: .\twiddle.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\twiddle.c /Fotwiddle.obj
+twiddle-icon.obj: icons\twiddle-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\twiddle-icon.c /Fotwiddle-icon.obj
+twiddle.res: icons\twiddle.rc .\puzzles.rc2 icons\twiddle.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fotwiddle.res icons\twiddle.rc
+twiddle3.obj: .\twiddle.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\twiddle.c /Fotwiddle3.obj
+undead.obj: .\undead.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\undead.c /Foundead.obj
+undead-icon.obj: icons\undead-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\undead-icon.c /Foundead-icon.obj
+undead.res: icons\undead.rc .\puzzles.rc2 icons\undead.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -foundead.res icons\undead.rc
+undead3.obj: .\undead.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\undead.c /Foundead3.obj
+unequal.obj: .\unequal.c .\puzzles.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\unequal.c /Founequal.obj
+unequal-icon.obj: icons\unequal-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\unequal-icon.c /Founequal-icon.obj
+unequal.res: icons\unequal.rc .\puzzles.rc2 icons\unequal.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -founequal.res icons\unequal.rc
+unequal5.obj: .\unequal.c .\puzzles.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\unequal.c /Founequal5.obj
+unequal2.obj: .\unequal.c .\puzzles.h .\latin.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\unequal.c /Founequal2.obj
+unruly.obj: .\unruly.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\unruly.c /Founruly.obj
+unruly-icon.obj: icons\unruly-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\unruly-icon.c /Founruly-icon.obj
+unruly.res: icons\unruly.rc .\puzzles.rc2 icons\unruly.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -founruly.res icons\unruly.rc
+unruly5.obj: .\unruly.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\unruly.c /Founruly5.obj
+unruly2.obj: .\unruly.c .\puzzles.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\unruly.c /Founruly2.obj
+untangle.obj: .\untangle.c .\puzzles.h .\tree234.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\untangle.c /Fountangle.obj
+untangle-icon.obj: icons\untangle-icon.c
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\untangle-icon.c /Fountangle-icon.obj
+untangle.res: icons\untangle.rc .\puzzles.rc2 icons\untangle.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 -fountangle.res icons\untangle.rc
+untangl3.obj: .\untangle.c .\puzzles.h .\tree234.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\untangle.c /Fountangl3.obj
+version.obj: .\version.c .\version.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\version.c /Foversion.obj
+windows.obj: .\windows.c .\puzzles.h .\resource.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\windows.c /Fowindows.obj
+windows1.obj: .\windows.c .\puzzles.h .\resource.h
+       cl $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\windows.c /Fowindows1.obj
+
+
+clean: tidy
+       -del *.exe
+
+tidy:
+       -del *.obj
+       -del *.res
+       -del *.pch
+       -del *.aps
+       -del *.ilk
+       -del *.pdb
+       -del *.rsp
+       -del *.dsp
+       -del *.dsw
+       -del *.ncb
+       -del *.opt
+       -del *.plg
+       -del *.map
+       -del *.idb
+       -del debug.log
diff --git a/Makefile.wce b/Makefile.wce
new file mode 100644 (file)
index 0000000..0bd9f7d
--- /dev/null
@@ -0,0 +1,971 @@
+# Makefile for puzzles on PocketPC using eMbedded Visual C.
+#
+# This file was created by `mkfiles.pl' from the `Recipe' file.
+# DO NOT EDIT THIS FILE DIRECTLY; edit Recipe or mkfiles.pl instead.
+
+# If you rename this file to `Makefile', you should change this line,
+# so that the .rsp files still depend on the correct makefile.
+MAKEFILE = Makefile.wce
+
+# This makefile expects the environment to have been set up by one
+# of the PocketPC batch files wcearmv4.bat and wceemulator.bat. No
+# other build targets are currently supported, because they would
+# need a section in this if statement.
+!if "$(TARGETCPU)" == "emulator"
+PLATFORM_DEFS=/D "_i386_" /D "i_386_" /D "_X86_" /D "x86"
+CC=cl
+BASELIBS=commctrl.lib coredll.lib corelibc.lib aygshell.lib
+MACHINE=IX86
+!else
+PLATFORM_DEFS=/D "ARM" /D "_ARM_" /D "ARMV4"
+CC=clarm
+BASELIBS=commctrl.lib coredll.lib aygshell.lib
+MACHINE=ARM
+!endif
+
+# C compilation flags
+CFLAGS = /nologo /W3 /O1 /MC /D _WIN32_WCE=420 /D "WIN32_PLATFORM_PSPC=400" /D UNDER_CE=420 \
+         $(PLATFORM_DEFS) \
+         /D "UNICODE" /D "_UNICODE" /D "NDEBUG" /D "NO_HTMLHELP"
+
+LFLAGS = /nologo /incremental:no \
+         /base:0x00010000 /stack:0x10000,0x1000 /entry:WinMainCRTStartup \
+         /nodefaultlib:libc.lib /nodefaultlib:libcmt.lib /nodefaultlib:msvcrt.lib /nodefaultlib:OLDNAMES.lib \
+         /subsystem:windowsce,4.20 /align:4096 /MACHINE:$(MACHINE)
+
+RCFL = /d UNDER_CE=420 /d _WIN32_WCE=420 /d "WIN32_PLATFORM_PSPC=400" \
+       $(PLATFORM_DEFS) \
+       /d "NDEBUG" /d "UNICODE" /d "_UNICODE"
+
+all: blackbox.exe bridges.exe cube.exe dominosa.exe fifteen.exe filling.exe \
+               flip.exe flood.exe galaxies.exe guess.exe inertia.exe \
+               keen.exe lightup.exe loopy.exe magnets.exe map.exe mines.exe \
+               netgame.exe netslide.exe nullgame.exe palisade.exe \
+               pattern.exe pearl.exe pegs.exe puzzles.exe range.exe \
+               rect.exe samegame.exe signpost.exe singles.exe sixteen.exe \
+               slant.exe solo.exe tents.exe towers.exe tracks.exe \
+               twiddle.exe undead.exe unequal.exe unruly.exe untangle.exe
+
+blackbox.exe: blackbox.obj blackbox.res drawing.obj malloc.obj midend.obj \
+               misc.obj printing.obj random.obj version.obj windows.obj \
+               blackbox.rsp
+       link $(LFLAGS) -out:blackbox.exe -map:blackbox.map @blackbox.rsp
+
+bridges.exe: bridges.obj bridges.res drawing.obj dsf.obj findloop.obj \
+               malloc.obj midend.obj misc.obj printing.obj random.obj \
+               version.obj windows.obj bridges.rsp
+       link $(LFLAGS) -out:bridges.exe -map:bridges.map @bridges.rsp
+
+cube.exe: cube.obj cube.res drawing.obj malloc.obj midend.obj misc.obj \
+               printing.obj random.obj version.obj windows.obj cube.rsp
+       link $(LFLAGS) -out:cube.exe -map:cube.map @cube.rsp
+
+dominosa.exe: dominosa.obj dominosa.res drawing.obj laydomino.obj malloc.obj \
+               midend.obj misc.obj printing.obj random.obj version.obj \
+               windows.obj dominosa.rsp
+       link $(LFLAGS) -out:dominosa.exe -map:dominosa.map @dominosa.rsp
+
+fifteen.exe: drawing.obj fifteen.obj fifteen.res malloc.obj midend.obj \
+               misc.obj printing.obj random.obj version.obj windows.obj \
+               fifteen.rsp
+       link $(LFLAGS) -out:fifteen.exe -map:fifteen.map @fifteen.rsp
+
+filling.exe: drawing.obj dsf.obj filling.obj filling.res malloc.obj \
+               midend.obj misc.obj printing.obj random.obj version.obj \
+               windows.obj filling.rsp
+       link $(LFLAGS) -out:filling.exe -map:filling.map @filling.rsp
+
+flip.exe: drawing.obj flip.obj flip.res malloc.obj midend.obj misc.obj \
+               printing.obj random.obj tree234.obj version.obj windows.obj \
+               flip.rsp
+       link $(LFLAGS) -out:flip.exe -map:flip.map @flip.rsp
+
+flood.exe: drawing.obj flood.obj flood.res malloc.obj midend.obj misc.obj \
+               printing.obj random.obj version.obj windows.obj flood.rsp
+       link $(LFLAGS) -out:flood.exe -map:flood.map @flood.rsp
+
+galaxies.exe: drawing.obj dsf.obj galaxies.obj galaxies.res malloc.obj \
+               midend.obj misc.obj printing.obj random.obj version.obj \
+               windows.obj galaxies.rsp
+       link $(LFLAGS) -out:galaxies.exe -map:galaxies.map @galaxies.rsp
+
+guess.exe: drawing.obj guess.obj guess.res malloc.obj midend.obj misc.obj \
+               printing.obj random.obj version.obj windows.obj guess.rsp
+       link $(LFLAGS) -out:guess.exe -map:guess.map @guess.rsp
+
+inertia.exe: drawing.obj inertia.obj inertia.res malloc.obj midend.obj \
+               misc.obj printing.obj random.obj version.obj windows.obj \
+               inertia.rsp
+       link $(LFLAGS) -out:inertia.exe -map:inertia.map @inertia.rsp
+
+keen.exe: drawing.obj dsf.obj keen.obj keen.res latin.obj malloc.obj \
+               maxflow.obj midend.obj misc.obj printing.obj random.obj \
+               tree234.obj version.obj windows.obj keen.rsp
+       link $(LFLAGS) -out:keen.exe -map:keen.map @keen.rsp
+
+lightup.exe: combi.obj drawing.obj lightup.obj lightup.res malloc.obj \
+               midend.obj misc.obj printing.obj random.obj version.obj \
+               windows.obj lightup.rsp
+       link $(LFLAGS) -out:lightup.exe -map:lightup.map @lightup.rsp
+
+loopy.exe: drawing.obj dsf.obj grid.obj loopgen.obj loopy.obj loopy.res \
+               malloc.obj midend.obj misc.obj penrose.obj printing.obj \
+               random.obj tree234.obj version.obj windows.obj loopy.rsp
+       link $(LFLAGS) -out:loopy.exe -map:loopy.map @loopy.rsp
+
+magnets.exe: drawing.obj laydomino.obj magnets.obj magnets.res malloc.obj \
+               midend.obj misc.obj printing.obj random.obj version.obj \
+               windows.obj magnets.rsp
+       link $(LFLAGS) -out:magnets.exe -map:magnets.map @magnets.rsp
+
+map.exe: drawing.obj dsf.obj malloc.obj map.obj map.res midend.obj misc.obj \
+               printing.obj random.obj version.obj windows.obj map.rsp
+       link $(LFLAGS) -out:map.exe -map:map.map @map.rsp
+
+mines.exe: drawing.obj malloc.obj midend.obj mines.obj mines.res misc.obj \
+               printing.obj random.obj tree234.obj version.obj windows.obj \
+               mines.rsp
+       link $(LFLAGS) -out:mines.exe -map:mines.map @mines.rsp
+
+netgame.exe: drawing.obj dsf.obj findloop.obj malloc.obj midend.obj misc.obj \
+               net.obj net.res printing.obj random.obj tree234.obj \
+               version.obj windows.obj netgame.rsp
+       link $(LFLAGS) -out:netgame.exe -map:netgame.map @netgame.rsp
+
+netslide.exe: drawing.obj malloc.obj midend.obj misc.obj netslide.obj \
+               netslide.res printing.obj random.obj tree234.obj version.obj \
+               windows.obj netslide.rsp
+       link $(LFLAGS) -out:netslide.exe -map:netslide.map @netslide.rsp
+
+nullgame.exe: drawing.obj malloc.obj midend.obj misc.obj noicon.res \
+               nullgame.obj printing.obj random.obj version.obj windows.obj \
+               nullgame.rsp
+       link $(LFLAGS) -out:nullgame.exe -map:nullgame.map @nullgame.rsp
+
+palisade.exe: divvy.obj drawing.obj dsf.obj malloc.obj midend.obj misc.obj \
+               palisade.obj palisade.res printing.obj random.obj \
+               version.obj windows.obj palisade.rsp
+       link $(LFLAGS) -out:palisade.exe -map:palisade.map @palisade.rsp
+
+pattern.exe: drawing.obj malloc.obj midend.obj misc.obj pattern.obj \
+               pattern.res printing.obj random.obj version.obj windows.obj \
+               pattern.rsp
+       link $(LFLAGS) -out:pattern.exe -map:pattern.map @pattern.rsp
+
+pearl.exe: drawing.obj dsf.obj grid.obj loopgen.obj malloc.obj midend.obj \
+               misc.obj pearl.obj pearl.res penrose.obj printing.obj \
+               random.obj tdq.obj tree234.obj version.obj windows.obj \
+               pearl.rsp
+       link $(LFLAGS) -out:pearl.exe -map:pearl.map @pearl.rsp
+
+pegs.exe: drawing.obj malloc.obj midend.obj misc.obj pegs.obj pegs.res \
+               printing.obj random.obj tree234.obj version.obj windows.obj \
+               pegs.rsp
+       link $(LFLAGS) -out:pegs.exe -map:pegs.map @pegs.rsp
+
+puzzles.exe: blackbo3.obj bridges3.obj combi.obj cube3.obj divvy.obj \
+               dominos3.obj drawing.obj dsf.obj fifteen5.obj filling5.obj \
+               findloop.obj flip3.obj flood3.obj galaxie7.obj grid.obj \
+               guess3.obj inertia3.obj keen5.obj latin.obj laydomino.obj \
+               lightup5.obj list.obj loopgen.obj loopy5.obj magnets5.obj \
+               malloc.obj map5.obj maxflow.obj midend.obj mines5.obj \
+               misc.obj net3.obj netslid3.obj noicon.res palisad3.obj \
+               pattern7.obj pearl5.obj pegs3.obj penrose.obj printing.obj \
+               random.obj range3.obj rect3.obj samegam3.obj signpos5.obj \
+               singles5.obj sixteen3.obj slant5.obj solo5.obj tdq.obj \
+               tents5.obj towers5.obj tracks3.obj tree234.obj twiddle3.obj \
+               undead3.obj unequal5.obj unruly5.obj untangl3.obj \
+               version.obj windows1.obj puzzles.rsp
+       link $(LFLAGS) -out:puzzles.exe -map:puzzles.map @puzzles.rsp
+
+range.exe: drawing.obj dsf.obj malloc.obj midend.obj misc.obj printing.obj \
+               random.obj range.obj range.res version.obj windows.obj \
+               range.rsp
+       link $(LFLAGS) -out:range.exe -map:range.map @range.rsp
+
+rect.exe: drawing.obj malloc.obj midend.obj misc.obj printing.obj random.obj \
+               rect.obj rect.res version.obj windows.obj rect.rsp
+       link $(LFLAGS) -out:rect.exe -map:rect.map @rect.rsp
+
+samegame.exe: drawing.obj malloc.obj midend.obj misc.obj printing.obj \
+               random.obj samegame.obj samegame.res version.obj windows.obj \
+               samegame.rsp
+       link $(LFLAGS) -out:samegame.exe -map:samegame.map @samegame.rsp
+
+signpost.exe: drawing.obj dsf.obj malloc.obj midend.obj misc.obj \
+               printing.obj random.obj signpost.obj signpost.res \
+               version.obj windows.obj signpost.rsp
+       link $(LFLAGS) -out:signpost.exe -map:signpost.map @signpost.rsp
+
+singles.exe: drawing.obj dsf.obj latin.obj malloc.obj maxflow.obj midend.obj \
+               misc.obj printing.obj random.obj singles.obj singles.res \
+               tree234.obj version.obj windows.obj singles.rsp
+       link $(LFLAGS) -out:singles.exe -map:singles.map @singles.rsp
+
+sixteen.exe: drawing.obj malloc.obj midend.obj misc.obj printing.obj \
+               random.obj sixteen.obj sixteen.res version.obj windows.obj \
+               sixteen.rsp
+       link $(LFLAGS) -out:sixteen.exe -map:sixteen.map @sixteen.rsp
+
+slant.exe: drawing.obj dsf.obj findloop.obj malloc.obj midend.obj misc.obj \
+               printing.obj random.obj slant.obj slant.res version.obj \
+               windows.obj slant.rsp
+       link $(LFLAGS) -out:slant.exe -map:slant.map @slant.rsp
+
+solo.exe: divvy.obj drawing.obj dsf.obj malloc.obj midend.obj misc.obj \
+               printing.obj random.obj solo.obj solo.res version.obj \
+               windows.obj solo.rsp
+       link $(LFLAGS) -out:solo.exe -map:solo.map @solo.rsp
+
+tents.exe: drawing.obj dsf.obj malloc.obj maxflow.obj midend.obj misc.obj \
+               printing.obj random.obj tents.obj tents.res version.obj \
+               windows.obj tents.rsp
+       link $(LFLAGS) -out:tents.exe -map:tents.map @tents.rsp
+
+towers.exe: drawing.obj latin.obj malloc.obj maxflow.obj midend.obj misc.obj \
+               printing.obj random.obj towers.obj towers.res tree234.obj \
+               version.obj windows.obj towers.rsp
+       link $(LFLAGS) -out:towers.exe -map:towers.map @towers.rsp
+
+tracks.exe: drawing.obj dsf.obj findloop.obj malloc.obj midend.obj misc.obj \
+               printing.obj random.obj tracks.obj tracks.res version.obj \
+               windows.obj tracks.rsp
+       link $(LFLAGS) -out:tracks.exe -map:tracks.map @tracks.rsp
+
+twiddle.exe: drawing.obj malloc.obj midend.obj misc.obj printing.obj \
+               random.obj twiddle.obj twiddle.res version.obj windows.obj \
+               twiddle.rsp
+       link $(LFLAGS) -out:twiddle.exe -map:twiddle.map @twiddle.rsp
+
+undead.exe: drawing.obj malloc.obj midend.obj misc.obj printing.obj \
+               random.obj undead.obj undead.res version.obj windows.obj \
+               undead.rsp
+       link $(LFLAGS) -out:undead.exe -map:undead.map @undead.rsp
+
+unequal.exe: drawing.obj latin.obj malloc.obj maxflow.obj midend.obj \
+               misc.obj printing.obj random.obj tree234.obj unequal.obj \
+               unequal.res version.obj windows.obj unequal.rsp
+       link $(LFLAGS) -out:unequal.exe -map:unequal.map @unequal.rsp
+
+unruly.exe: drawing.obj malloc.obj midend.obj misc.obj printing.obj \
+               random.obj unruly.obj unruly.res version.obj windows.obj \
+               unruly.rsp
+       link $(LFLAGS) -out:unruly.exe -map:unruly.map @unruly.rsp
+
+untangle.exe: drawing.obj malloc.obj midend.obj misc.obj printing.obj \
+               random.obj tree234.obj untangle.obj untangle.res version.obj \
+               windows.obj untangle.rsp
+       link $(LFLAGS) -out:untangle.exe -map:untangle.map @untangle.rsp
+
+blackbox.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > blackbox.rsp
+       echo blackbox.obj blackbox.res drawing.obj malloc.obj >> blackbox.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> blackbox.rsp
+       echo version.obj windows.obj >> blackbox.rsp
+
+bridges.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > bridges.rsp
+       echo bridges.obj bridges.res drawing.obj dsf.obj >> bridges.rsp
+       echo findloop.obj malloc.obj midend.obj misc.obj >> bridges.rsp
+       echo printing.obj random.obj version.obj windows.obj >> bridges.rsp
+
+cube.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > cube.rsp
+       echo cube.obj cube.res drawing.obj malloc.obj >> cube.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> cube.rsp
+       echo version.obj windows.obj >> cube.rsp
+
+dominosa.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > dominosa.rsp
+       echo dominosa.obj dominosa.res drawing.obj >> dominosa.rsp
+       echo laydomino.obj malloc.obj midend.obj misc.obj >> dominosa.rsp
+       echo printing.obj random.obj version.obj windows.obj >> dominosa.rsp
+
+fifteen.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > fifteen.rsp
+       echo drawing.obj fifteen.obj fifteen.res malloc.obj >> fifteen.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> fifteen.rsp
+       echo version.obj windows.obj >> fifteen.rsp
+
+filling.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > filling.rsp
+       echo drawing.obj dsf.obj filling.obj filling.res >> filling.rsp
+       echo malloc.obj midend.obj misc.obj printing.obj >> filling.rsp
+       echo random.obj version.obj windows.obj >> filling.rsp
+
+flip.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > flip.rsp
+       echo drawing.obj flip.obj flip.res malloc.obj >> flip.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> flip.rsp
+       echo tree234.obj version.obj windows.obj >> flip.rsp
+
+flood.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > flood.rsp
+       echo drawing.obj flood.obj flood.res malloc.obj >> flood.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> flood.rsp
+       echo version.obj windows.obj >> flood.rsp
+
+galaxies.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > galaxies.rsp
+       echo drawing.obj dsf.obj galaxies.obj galaxies.res >> galaxies.rsp
+       echo malloc.obj midend.obj misc.obj printing.obj >> galaxies.rsp
+       echo random.obj version.obj windows.obj >> galaxies.rsp
+
+guess.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > guess.rsp
+       echo drawing.obj guess.obj guess.res malloc.obj >> guess.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> guess.rsp
+       echo version.obj windows.obj >> guess.rsp
+
+inertia.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > inertia.rsp
+       echo drawing.obj inertia.obj inertia.res malloc.obj >> inertia.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> inertia.rsp
+       echo version.obj windows.obj >> inertia.rsp
+
+keen.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > keen.rsp
+       echo drawing.obj dsf.obj keen.obj keen.res latin.obj >> keen.rsp
+       echo malloc.obj maxflow.obj midend.obj misc.obj >> keen.rsp
+       echo printing.obj random.obj tree234.obj version.obj >> keen.rsp
+       echo windows.obj >> keen.rsp
+
+lightup.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > lightup.rsp
+       echo combi.obj drawing.obj lightup.obj lightup.res >> lightup.rsp
+       echo malloc.obj midend.obj misc.obj printing.obj >> lightup.rsp
+       echo random.obj version.obj windows.obj >> lightup.rsp
+
+loopy.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > loopy.rsp
+       echo drawing.obj dsf.obj grid.obj loopgen.obj >> loopy.rsp
+       echo loopy.obj loopy.res malloc.obj midend.obj >> loopy.rsp
+       echo misc.obj penrose.obj printing.obj random.obj >> loopy.rsp
+       echo tree234.obj version.obj windows.obj >> loopy.rsp
+
+magnets.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > magnets.rsp
+       echo drawing.obj laydomino.obj magnets.obj magnets.res >> magnets.rsp
+       echo malloc.obj midend.obj misc.obj printing.obj >> magnets.rsp
+       echo random.obj version.obj windows.obj >> magnets.rsp
+
+map.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > map.rsp
+       echo drawing.obj dsf.obj malloc.obj map.obj map.res >> map.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> map.rsp
+       echo version.obj windows.obj >> map.rsp
+
+mines.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > mines.rsp
+       echo drawing.obj malloc.obj midend.obj mines.obj >> mines.rsp
+       echo mines.res misc.obj printing.obj random.obj >> mines.rsp
+       echo tree234.obj version.obj windows.obj >> mines.rsp
+
+netgame.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > netgame.rsp
+       echo drawing.obj dsf.obj findloop.obj malloc.obj >> netgame.rsp
+       echo midend.obj misc.obj net.obj net.res printing.obj >> netgame.rsp
+       echo random.obj tree234.obj version.obj windows.obj >> netgame.rsp
+
+netslide.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > netslide.rsp
+       echo drawing.obj malloc.obj midend.obj misc.obj >> netslide.rsp
+       echo netslide.obj netslide.res printing.obj random.obj >> netslide.rsp
+       echo tree234.obj version.obj windows.obj >> netslide.rsp
+
+nullgame.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > nullgame.rsp
+       echo drawing.obj malloc.obj midend.obj misc.obj >> nullgame.rsp
+       echo noicon.res nullgame.obj printing.obj random.obj >> nullgame.rsp
+       echo version.obj windows.obj >> nullgame.rsp
+
+palisade.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > palisade.rsp
+       echo divvy.obj drawing.obj dsf.obj malloc.obj >> palisade.rsp
+       echo midend.obj misc.obj palisade.obj palisade.res >> palisade.rsp
+       echo printing.obj random.obj version.obj windows.obj >> palisade.rsp
+
+pattern.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > pattern.rsp
+       echo drawing.obj malloc.obj midend.obj misc.obj >> pattern.rsp
+       echo pattern.obj pattern.res printing.obj random.obj >> pattern.rsp
+       echo version.obj windows.obj >> pattern.rsp
+
+pearl.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > pearl.rsp
+       echo drawing.obj dsf.obj grid.obj loopgen.obj >> pearl.rsp
+       echo malloc.obj midend.obj misc.obj pearl.obj >> pearl.rsp
+       echo pearl.res penrose.obj printing.obj random.obj >> pearl.rsp
+       echo tdq.obj tree234.obj version.obj windows.obj >> pearl.rsp
+
+pegs.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > pegs.rsp
+       echo drawing.obj malloc.obj midend.obj misc.obj >> pegs.rsp
+       echo pegs.obj pegs.res printing.obj random.obj >> pegs.rsp
+       echo tree234.obj version.obj windows.obj >> pegs.rsp
+
+puzzles.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > puzzles.rsp
+       echo blackbo3.obj bridges3.obj combi.obj cube3.obj >> puzzles.rsp
+       echo divvy.obj dominos3.obj drawing.obj dsf.obj >> puzzles.rsp
+       echo fifteen5.obj filling5.obj findloop.obj flip3.obj >> puzzles.rsp
+       echo flood3.obj galaxie7.obj grid.obj guess3.obj >> puzzles.rsp
+       echo inertia3.obj keen5.obj latin.obj laydomino.obj >> puzzles.rsp
+       echo lightup5.obj list.obj loopgen.obj loopy5.obj >> puzzles.rsp
+       echo magnets5.obj malloc.obj map5.obj maxflow.obj >> puzzles.rsp
+       echo midend.obj mines5.obj misc.obj net3.obj >> puzzles.rsp
+       echo netslid3.obj noicon.res palisad3.obj pattern7.obj >> puzzles.rsp
+       echo pearl5.obj pegs3.obj penrose.obj printing.obj >> puzzles.rsp
+       echo random.obj range3.obj rect3.obj samegam3.obj >> puzzles.rsp
+       echo signpos5.obj singles5.obj sixteen3.obj slant5.obj >> puzzles.rsp
+       echo solo5.obj tdq.obj tents5.obj towers5.obj >> puzzles.rsp
+       echo tracks3.obj tree234.obj twiddle3.obj undead3.obj >> puzzles.rsp
+       echo unequal5.obj unruly5.obj untangl3.obj version.obj >> puzzles.rsp
+       echo windows1.obj >> puzzles.rsp
+
+range.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > range.rsp
+       echo drawing.obj dsf.obj malloc.obj midend.obj >> range.rsp
+       echo misc.obj printing.obj random.obj range.obj >> range.rsp
+       echo range.res version.obj windows.obj >> range.rsp
+
+rect.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > rect.rsp
+       echo drawing.obj malloc.obj midend.obj misc.obj >> rect.rsp
+       echo printing.obj random.obj rect.obj rect.res >> rect.rsp
+       echo version.obj windows.obj >> rect.rsp
+
+samegame.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > samegame.rsp
+       echo drawing.obj malloc.obj midend.obj misc.obj >> samegame.rsp
+       echo printing.obj random.obj samegame.obj samegame.res >> samegame.rsp
+       echo version.obj windows.obj >> samegame.rsp
+
+signpost.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > signpost.rsp
+       echo drawing.obj dsf.obj malloc.obj midend.obj >> signpost.rsp
+       echo misc.obj printing.obj random.obj signpost.obj >> signpost.rsp
+       echo signpost.res version.obj windows.obj >> signpost.rsp
+
+singles.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > singles.rsp
+       echo drawing.obj dsf.obj latin.obj malloc.obj >> singles.rsp
+       echo maxflow.obj midend.obj misc.obj printing.obj >> singles.rsp
+       echo random.obj singles.obj singles.res tree234.obj >> singles.rsp
+       echo version.obj windows.obj >> singles.rsp
+
+sixteen.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > sixteen.rsp
+       echo drawing.obj malloc.obj midend.obj misc.obj >> sixteen.rsp
+       echo printing.obj random.obj sixteen.obj sixteen.res >> sixteen.rsp
+       echo version.obj windows.obj >> sixteen.rsp
+
+slant.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > slant.rsp
+       echo drawing.obj dsf.obj findloop.obj malloc.obj >> slant.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> slant.rsp
+       echo slant.obj slant.res version.obj windows.obj >> slant.rsp
+
+solo.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > solo.rsp
+       echo divvy.obj drawing.obj dsf.obj malloc.obj >> solo.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> solo.rsp
+       echo solo.obj solo.res version.obj windows.obj >> solo.rsp
+
+tents.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > tents.rsp
+       echo drawing.obj dsf.obj malloc.obj maxflow.obj >> tents.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> tents.rsp
+       echo tents.obj tents.res version.obj windows.obj >> tents.rsp
+
+towers.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > towers.rsp
+       echo drawing.obj latin.obj malloc.obj maxflow.obj >> towers.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> towers.rsp
+       echo towers.obj towers.res tree234.obj version.obj >> towers.rsp
+       echo windows.obj >> towers.rsp
+
+tracks.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > tracks.rsp
+       echo drawing.obj dsf.obj findloop.obj malloc.obj >> tracks.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> tracks.rsp
+       echo tracks.obj tracks.res version.obj windows.obj >> tracks.rsp
+
+twiddle.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > twiddle.rsp
+       echo drawing.obj malloc.obj midend.obj misc.obj >> twiddle.rsp
+       echo printing.obj random.obj twiddle.obj twiddle.res >> twiddle.rsp
+       echo version.obj windows.obj >> twiddle.rsp
+
+undead.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > undead.rsp
+       echo drawing.obj malloc.obj midend.obj misc.obj >> undead.rsp
+       echo printing.obj random.obj undead.obj undead.res >> undead.rsp
+       echo version.obj windows.obj >> undead.rsp
+
+unequal.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > unequal.rsp
+       echo drawing.obj latin.obj malloc.obj maxflow.obj >> unequal.rsp
+       echo midend.obj misc.obj printing.obj random.obj >> unequal.rsp
+       echo tree234.obj unequal.obj unequal.res version.obj >> unequal.rsp
+       echo windows.obj >> unequal.rsp
+
+unruly.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > unruly.rsp
+       echo drawing.obj malloc.obj midend.obj misc.obj >> unruly.rsp
+       echo printing.obj random.obj unruly.obj unruly.res >> unruly.rsp
+       echo version.obj windows.obj >> unruly.rsp
+
+untangle.rsp: $(MAKEFILE)
+       echo $(BASELIBS) > untangle.rsp
+       echo drawing.obj malloc.obj midend.obj misc.obj >> untangle.rsp
+       echo printing.obj random.obj tree234.obj untangle.obj >> untangle.rsp
+       echo untangle.res version.obj windows.obj >> untangle.rsp
+
+blackbox.obj: .\blackbox.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\blackbox.c /Foblackbox.obj
+blackbox-icon.obj: icons\blackbox-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\blackbox-icon.c /Foblackbox-icon.obj
+blackbox.res: icons\blackbox.rc .\puzzles.rc2 icons\blackbox.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -foblackbox.res icons\blackbox.rc
+blackbo3.obj: .\blackbox.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\blackbox.c /Foblackbo3.obj
+bridges.obj: .\bridges.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\bridges.c /Fobridges.obj
+bridges-icon.obj: icons\bridges-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\bridges-icon.c /Fobridges-icon.obj
+bridges.res: icons\bridges.rc .\puzzles.rc2 icons\bridges.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fobridges.res icons\bridges.rc
+bridges3.obj: .\bridges.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\bridges.c /Fobridges3.obj
+combi.obj: .\combi.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\combi.c /Focombi.obj
+cube.obj: .\cube.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\cube.c /Focube.obj
+cube-icon.obj: icons\cube-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\cube-icon.c /Focube-icon.obj
+cube.res: icons\cube.rc .\puzzles.rc2 icons\cube.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -focube.res icons\cube.rc
+cube3.obj: .\cube.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\cube.c /Focube3.obj
+divvy.obj: .\divvy.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\divvy.c /Fodivvy.obj
+dominosa.obj: .\dominosa.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\dominosa.c /Fodominosa.obj
+dominosa-icon.obj: icons\dominosa-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\dominosa-icon.c /Fodominosa-icon.obj
+dominosa.res: icons\dominosa.rc .\puzzles.rc2 icons\dominosa.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fodominosa.res icons\dominosa.rc
+dominos3.obj: .\dominosa.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\dominosa.c /Fodominos3.obj
+drawing.obj: .\drawing.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\drawing.c /Fodrawing.obj
+dsf.obj: .\dsf.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\dsf.c /Fodsf.obj
+fifteen.obj: .\fifteen.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\fifteen.c /Fofifteen.obj
+fifteen-icon.obj: icons\fifteen-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\fifteen-icon.c /Fofifteen-icon.obj
+fifteen.res: icons\fifteen.rc .\puzzles.rc2 icons\fifteen.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fofifteen.res icons\fifteen.rc
+fifteen5.obj: .\fifteen.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\fifteen.c /Fofifteen5.obj
+fifteen2.obj: .\fifteen.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\fifteen.c /Fofifteen2.obj
+filling.obj: .\filling.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\filling.c /Fofilling.obj
+filling-icon.obj: icons\filling-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\filling-icon.c /Fofilling-icon.obj
+filling.res: icons\filling.rc .\puzzles.rc2 icons\filling.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fofilling.res icons\filling.rc
+filling5.obj: .\filling.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\filling.c /Fofilling5.obj
+filling2.obj: .\filling.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\filling.c /Fofilling2.obj
+findloop.obj: .\findloop.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\findloop.c /Fofindloop.obj
+flip.obj: .\flip.c .\puzzles.h .\tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\flip.c /Foflip.obj
+flip-icon.obj: icons\flip-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\flip-icon.c /Foflip-icon.obj
+flip.res: icons\flip.rc .\puzzles.rc2 icons\flip.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -foflip.res icons\flip.rc
+flip3.obj: .\flip.c .\puzzles.h .\tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\flip.c /Foflip3.obj
+flood.obj: .\flood.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\flood.c /Foflood.obj
+flood-icon.obj: icons\flood-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\flood-icon.c /Foflood-icon.obj
+flood.res: icons\flood.rc .\puzzles.rc2 icons\flood.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -foflood.res icons\flood.rc
+flood3.obj: .\flood.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\flood.c /Foflood3.obj
+galaxies.obj: .\galaxies.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\galaxies.c /Fogalaxies.obj
+galaxies-icon.obj: icons\galaxies-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\galaxies-icon.c /Fogalaxies-icon.obj
+galaxies.res: icons\galaxies.rc .\puzzles.rc2 icons\galaxies.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fogalaxies.res icons\galaxies.rc
+galaxie7.obj: .\galaxies.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\galaxies.c /Fogalaxie7.obj
+galaxie4.obj: .\galaxies.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_PICTURE_GENERATOR /c .\galaxies.c /Fogalaxie4.obj
+galaxie2.obj: .\galaxies.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\galaxies.c /Fogalaxie2.obj
+grid.obj: .\grid.c .\puzzles.h .\tree234.h .\grid.h .\penrose.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\grid.c /Fogrid.obj
+gtk.obj: .\gtk.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\gtk.c /Fogtk.obj
+guess.obj: .\guess.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\guess.c /Foguess.obj
+guess-icon.obj: icons\guess-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\guess-icon.c /Foguess-icon.obj
+guess.res: icons\guess.rc .\puzzles.rc2 icons\guess.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -foguess.res icons\guess.rc
+guess3.obj: .\guess.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\guess.c /Foguess3.obj
+inertia.obj: .\inertia.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\inertia.c /Foinertia.obj
+inertia-icon.obj: icons\inertia-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\inertia-icon.c /Foinertia-icon.obj
+inertia.res: icons\inertia.rc .\puzzles.rc2 icons\inertia.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -foinertia.res icons\inertia.rc
+inertia3.obj: .\inertia.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\inertia.c /Foinertia3.obj
+keen.obj: .\keen.c .\puzzles.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\keen.c /Fokeen.obj
+keen-icon.obj: icons\keen-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\keen-icon.c /Fokeen-icon.obj
+keen.res: icons\keen.rc .\puzzles.rc2 icons\keen.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fokeen.res icons\keen.rc
+keen5.obj: .\keen.c .\puzzles.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\keen.c /Fokeen5.obj
+keen2.obj: .\keen.c .\puzzles.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\keen.c /Fokeen2.obj
+latin.obj: .\latin.c .\puzzles.h .\tree234.h .\maxflow.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\latin.c /Folatin.obj
+latin8.obj: .\latin.c .\puzzles.h .\tree234.h .\maxflow.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_LATIN_TEST /c .\latin.c /Folatin8.obj
+latin6.obj: .\latin.c .\puzzles.h .\tree234.h .\maxflow.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\latin.c /Folatin6.obj
+laydomino.obj: .\laydomino.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\laydomino.c /Folaydomino.obj
+lightup.obj: .\lightup.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\lightup.c /Folightup.obj
+lightup-icon.obj: icons\lightup-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\lightup-icon.c /Folightup-icon.obj
+lightup.res: icons\lightup.rc .\puzzles.rc2 icons\lightup.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -folightup.res icons\lightup.rc
+lightup5.obj: .\lightup.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\lightup.c /Folightup5.obj
+lightup2.obj: .\lightup.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\lightup.c /Folightup2.obj
+list.obj: .\list.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\list.c /Folist.obj
+loopgen.obj: .\loopgen.c .\puzzles.h .\tree234.h .\grid.h .\loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\loopgen.c /Foloopgen.obj
+loopy.obj: .\loopy.c .\puzzles.h .\tree234.h .\grid.h .\loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\loopy.c /Foloopy.obj
+loopy-icon.obj: icons\loopy-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\loopy-icon.c /Foloopy-icon.obj
+loopy.res: icons\loopy.rc .\puzzles.rc2 icons\loopy.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -foloopy.res icons\loopy.rc
+loopy5.obj: .\loopy.c .\puzzles.h .\tree234.h .\grid.h .\loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\loopy.c /Foloopy5.obj
+loopy2.obj: .\loopy.c .\puzzles.h .\tree234.h .\grid.h .\loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\loopy.c /Foloopy2.obj
+magnets.obj: .\magnets.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\magnets.c /Fomagnets.obj
+magnets-icon.obj: icons\magnets-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\magnets-icon.c /Fomagnets-icon.obj
+magnets.res: icons\magnets.rc .\puzzles.rc2 icons\magnets.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fomagnets.res icons\magnets.rc
+magnets5.obj: .\magnets.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\magnets.c /Fomagnets5.obj
+magnets2.obj: .\magnets.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\magnets.c /Fomagnets2.obj
+malloc.obj: .\malloc.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\malloc.c /Fomalloc.obj
+map.obj: .\map.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\map.c /Fomap.obj
+map-icon.obj: icons\map-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\map-icon.c /Fomap-icon.obj
+map.res: icons\map.rc .\puzzles.rc2 icons\map.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fomap.res icons\map.rc
+map5.obj: .\map.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\map.c /Fomap5.obj
+map2.obj: .\map.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\map.c /Fomap2.obj
+maxflow.obj: .\maxflow.c .\maxflow.h .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\maxflow.c /Fomaxflow.obj
+midend.obj: .\midend.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\midend.c /Fomidend.obj
+mines.obj: .\mines.c .\tree234.h .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\mines.c /Fomines.obj
+mines-icon.obj: icons\mines-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\mines-icon.c /Fomines-icon.obj
+mines.res: icons\mines.rc .\puzzles.rc2 icons\mines.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fomines.res icons\mines.rc
+mines5.obj: .\mines.c .\tree234.h .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\mines.c /Fomines5.obj
+mines2.obj: .\mines.c .\tree234.h .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_OBFUSCATOR /c .\mines.c /Fomines2.obj
+misc.obj: .\misc.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\misc.c /Fomisc.obj
+net.obj: .\net.c .\puzzles.h .\tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\net.c /Fonet.obj
+net-icon.obj: icons\net-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\net-icon.c /Fonet-icon.obj
+net.res: icons\net.rc .\puzzles.rc2 icons\net.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fonet.res icons\net.rc
+net3.obj: .\net.c .\puzzles.h .\tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\net.c /Fonet3.obj
+netslide.obj: .\netslide.c .\puzzles.h .\tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\netslide.c /Fonetslide.obj
+netslide-icon.obj: icons\netslide-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\netslide-icon.c /Fonetslide-icon.obj
+netslide.res: icons\netslide.rc .\puzzles.rc2 icons\netslide.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fonetslide.res icons\netslide.rc
+netslid3.obj: .\netslide.c .\puzzles.h .\tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\netslide.c /Fonetslid3.obj
+no-icon.obj: .\no-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\no-icon.c /Fono-icon.obj
+noicon.res: .\noicon.rc .\puzzles.rc2 .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fonoicon.res .\noicon.rc
+nullfe.obj: .\nullfe.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\nullfe.c /Fonullfe.obj
+nullgame.obj: .\nullgame.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\nullgame.c /Fonullgame.obj
+obfusc.obj: .\obfusc.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\obfusc.c /Foobfusc.obj
+osx.obj: .\osx.m .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\osx.m /Foosx.obj
+palisade.obj: .\palisade.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\palisade.c /Fopalisade.obj
+palisade-icon.obj: icons\palisade-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\palisade-icon.c /Fopalisade-icon.obj
+palisade.res: icons\palisade.rc .\puzzles.rc2 icons\palisade.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fopalisade.res icons\palisade.rc
+palisad3.obj: .\palisade.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\palisade.c /Fopalisad3.obj
+pattern.obj: .\pattern.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\pattern.c /Fopattern.obj
+pattern-icon.obj: icons\pattern-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\pattern-icon.c /Fopattern-icon.obj
+pattern.res: icons\pattern.rc .\puzzles.rc2 icons\pattern.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fopattern.res icons\pattern.rc
+pattern7.obj: .\pattern.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\pattern.c /Fopattern7.obj
+pattern4.obj: .\pattern.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_PICTURE_GENERATOR /c .\pattern.c /Fopattern4.obj
+pattern2.obj: .\pattern.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\pattern.c /Fopattern2.obj
+pearl.obj: .\pearl.c .\puzzles.h .\grid.h .\loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\pearl.c /Fopearl.obj
+pearl-icon.obj: icons\pearl-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\pearl-icon.c /Fopearl-icon.obj
+pearl.res: icons\pearl.rc .\puzzles.rc2 icons\pearl.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fopearl.res icons\pearl.rc
+pearl5.obj: .\pearl.c .\puzzles.h .\grid.h .\loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\pearl.c /Fopearl5.obj
+pearl2.obj: .\pearl.c .\puzzles.h .\grid.h .\loopgen.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\pearl.c /Fopearl2.obj
+pegs.obj: .\pegs.c .\puzzles.h .\tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\pegs.c /Fopegs.obj
+pegs-icon.obj: icons\pegs-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\pegs-icon.c /Fopegs-icon.obj
+pegs.res: icons\pegs.rc .\puzzles.rc2 icons\pegs.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fopegs.res icons\pegs.rc
+pegs3.obj: .\pegs.c .\puzzles.h .\tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\pegs.c /Fopegs3.obj
+penrose.obj: .\penrose.c .\puzzles.h .\penrose.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\penrose.c /Fopenrose.obj
+printing.obj: .\printing.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\printing.c /Foprinting.obj
+ps.obj: .\ps.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\ps.c /Fops.obj
+random.obj: .\random.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\random.c /Forandom.obj
+range.obj: .\range.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\range.c /Forange.obj
+range-icon.obj: icons\range-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\range-icon.c /Forange-icon.obj
+range.res: icons\range.rc .\puzzles.rc2 icons\range.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -forange.res icons\range.rc
+range3.obj: .\range.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\range.c /Forange3.obj
+rect.obj: .\rect.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\rect.c /Forect.obj
+rect-icon.obj: icons\rect-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\rect-icon.c /Forect-icon.obj
+rect.res: icons\rect.rc .\puzzles.rc2 icons\rect.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -forect.res icons\rect.rc
+rect3.obj: .\rect.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\rect.c /Forect3.obj
+samegame.obj: .\samegame.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\samegame.c /Fosamegame.obj
+samegame-icon.obj: icons\samegame-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\samegame-icon.c /Fosamegame-icon.obj
+samegame.res: icons\samegame.rc .\puzzles.rc2 icons\samegame.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fosamegame.res icons\samegame.rc
+samegam3.obj: .\samegame.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\samegame.c /Fosamegam3.obj
+signpost.obj: .\signpost.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\signpost.c /Fosignpost.obj
+signpost-icon.obj: icons\signpost-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\signpost-icon.c /Fosignpost-icon.obj
+signpost.res: icons\signpost.rc .\puzzles.rc2 icons\signpost.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fosignpost.res icons\signpost.rc
+signpos5.obj: .\signpost.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\signpost.c /Fosignpos5.obj
+signpos2.obj: .\signpost.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\signpost.c /Fosignpos2.obj
+singles.obj: .\singles.c .\puzzles.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\singles.c /Fosingles.obj
+singles-icon.obj: icons\singles-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\singles-icon.c /Fosingles-icon.obj
+singles.res: icons\singles.rc .\puzzles.rc2 icons\singles.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fosingles.res icons\singles.rc
+singles5.obj: .\singles.c .\puzzles.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\singles.c /Fosingles5.obj
+singles3.obj: .\singles.c .\puzzles.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\singles.c /Fosingles3.obj
+sixteen.obj: .\sixteen.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\sixteen.c /Fosixteen.obj
+sixteen-icon.obj: icons\sixteen-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\sixteen-icon.c /Fosixteen-icon.obj
+sixteen.res: icons\sixteen.rc .\puzzles.rc2 icons\sixteen.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fosixteen.res icons\sixteen.rc
+sixteen3.obj: .\sixteen.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\sixteen.c /Fosixteen3.obj
+slant.obj: .\slant.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\slant.c /Foslant.obj
+slant-icon.obj: icons\slant-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\slant-icon.c /Foslant-icon.obj
+slant.res: icons\slant.rc .\puzzles.rc2 icons\slant.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -foslant.res icons\slant.rc
+slant5.obj: .\slant.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\slant.c /Foslant5.obj
+slant2.obj: .\slant.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\slant.c /Foslant2.obj
+solo.obj: .\solo.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\solo.c /Fosolo.obj
+solo-icon.obj: icons\solo-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\solo-icon.c /Fosolo-icon.obj
+solo.res: icons\solo.rc .\puzzles.rc2 icons\solo.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fosolo.res icons\solo.rc
+solo5.obj: .\solo.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\solo.c /Fosolo5.obj
+solo2.obj: .\solo.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\solo.c /Fosolo2.obj
+tdq.obj: .\tdq.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\tdq.c /Fotdq.obj
+tents.obj: .\tents.c .\puzzles.h .\maxflow.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\tents.c /Fotents.obj
+tents-icon.obj: icons\tents-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\tents-icon.c /Fotents-icon.obj
+tents.res: icons\tents.rc .\puzzles.rc2 icons\tents.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fotents.res icons\tents.rc
+tents5.obj: .\tents.c .\puzzles.h .\maxflow.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\tents.c /Fotents5.obj
+tents3.obj: .\tents.c .\puzzles.h .\maxflow.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\tents.c /Fotents3.obj
+towers.obj: .\towers.c .\puzzles.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\towers.c /Fotowers.obj
+towers-icon.obj: icons\towers-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\towers-icon.c /Fotowers-icon.obj
+towers.res: icons\towers.rc .\puzzles.rc2 icons\towers.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fotowers.res icons\towers.rc
+towers5.obj: .\towers.c .\puzzles.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\towers.c /Fotowers5.obj
+towers2.obj: .\towers.c .\puzzles.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\towers.c /Fotowers2.obj
+tracks.obj: .\tracks.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\tracks.c /Fotracks.obj
+tracks-icon.obj: icons\tracks-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\tracks-icon.c /Fotracks-icon.obj
+tracks.res: icons\tracks.rc .\puzzles.rc2 icons\tracks.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fotracks.res icons\tracks.rc
+tracks3.obj: .\tracks.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\tracks.c /Fotracks3.obj
+tree234.obj: .\tree234.c .\tree234.h .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\tree234.c /Fotree234.obj
+twiddle.obj: .\twiddle.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\twiddle.c /Fotwiddle.obj
+twiddle-icon.obj: icons\twiddle-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\twiddle-icon.c /Fotwiddle-icon.obj
+twiddle.res: icons\twiddle.rc .\puzzles.rc2 icons\twiddle.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fotwiddle.res icons\twiddle.rc
+twiddle3.obj: .\twiddle.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\twiddle.c /Fotwiddle3.obj
+undead.obj: .\undead.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\undead.c /Foundead.obj
+undead-icon.obj: icons\undead-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\undead-icon.c /Foundead-icon.obj
+undead.res: icons\undead.rc .\puzzles.rc2 icons\undead.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -foundead.res icons\undead.rc
+undead3.obj: .\undead.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\undead.c /Foundead3.obj
+unequal.obj: .\unequal.c .\puzzles.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\unequal.c /Founequal.obj
+unequal-icon.obj: icons\unequal-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\unequal-icon.c /Founequal-icon.obj
+unequal.res: icons\unequal.rc .\puzzles.rc2 icons\unequal.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -founequal.res icons\unequal.rc
+unequal5.obj: .\unequal.c .\puzzles.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\unequal.c /Founequal5.obj
+unequal2.obj: .\unequal.c .\puzzles.h .\latin.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\unequal.c /Founequal2.obj
+unruly.obj: .\unruly.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\unruly.c /Founruly.obj
+unruly-icon.obj: icons\unruly-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\unruly-icon.c /Founruly-icon.obj
+unruly.res: icons\unruly.rc .\puzzles.rc2 icons\unruly.ico .\resource.h
+       rc $(FWHACK) $(RCFL) -r -founruly.res icons\unruly.rc
+unruly5.obj: .\unruly.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\unruly.c /Founruly5.obj
+unruly2.obj: .\unruly.c .\puzzles.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DSTANDALONE_SOLVER /c .\unruly.c /Founruly2.obj
+untangle.obj: .\untangle.c .\puzzles.h .\tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\untangle.c /Fountangle.obj
+untangle-icon.obj: icons\untangle-icon.c
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c icons\untangle-icon.c /Fountangle-icon.obj
+untangle.res: icons\untangle.rc .\puzzles.rc2 icons\untangle.ico \
+               .\resource.h
+       rc $(FWHACK) $(RCFL) -r -fountangle.res icons\untangle.rc
+untangl3.obj: .\untangle.c .\puzzles.h .\tree234.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\untangle.c /Fountangl3.obj
+version.obj: .\version.c .\version.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\version.c /Foversion.obj
+windows.obj: .\windows.c .\puzzles.h .\resource.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /c .\windows.c /Fowindows.obj
+windows1.obj: .\windows.c .\puzzles.h .\resource.h
+       $(CC) $(COMPAT) $(FWHACK) $(CFLAGS) $(XFLAGS) /DCOMBINED /c .\windows.c /Fowindows1.obj
+
+
+clean: tidy
+       -del *.exe
+
+tidy:
+       -del *.obj
+       -del *.res
+       -del *.pch
+       -del *.aps
+       -del *.ilk
+       -del *.pdb
+       -del *.rsp
+       -del *.dsp
+       -del *.dsw
+       -del *.ncb
+       -del *.opt
+       -del *.plg
+       -del *.map
+       -del *.idb
+       -del debug.log
diff --git a/PuzzleApplet.java b/PuzzleApplet.java
deleted file mode 100644 (file)
index 8455734..0000000
+++ /dev/null
@@ -1,651 +0,0 @@
-/*
- * PuzzleApplet.java: NestedVM applet for the puzzle collection
- */
-import java.awt.*;
-import java.awt.event.*;
-import java.awt.image.BufferedImage;
-import java.util.*;
-import javax.swing.*;
-import javax.swing.border.BevelBorder;
-import javax.swing.Timer;
-import java.util.List;
-
-import org.ibex.nestedvm.Runtime;
-
-public class PuzzleApplet extends JApplet implements Runtime.CallJavaCB {
-
-    private static final long serialVersionUID = 1L;
-
-    private static final int CFG_SETTINGS = 0, CFG_SEED = 1, CFG_DESC = 2,
-            LEFT_BUTTON = 0x0200, MIDDLE_BUTTON = 0x201, RIGHT_BUTTON = 0x202,
-            LEFT_DRAG = 0x203, MIDDLE_DRAG = 0x204, RIGHT_DRAG = 0x205,
-            LEFT_RELEASE = 0x206, CURSOR_UP = 0x209, CURSOR_DOWN = 0x20a,
-            CURSOR_LEFT = 0x20b, CURSOR_RIGHT = 0x20c, MOD_CTRL = 0x1000,
-            MOD_SHFT = 0x2000, MOD_NUM_KEYPAD = 0x4000, ALIGN_VCENTRE = 0x100,
-            ALIGN_HCENTRE = 0x001, ALIGN_HRIGHT = 0x002, C_STRING = 0,
-            C_CHOICES = 1, C_BOOLEAN = 2;
-
-    private JFrame mainWindow;
-
-    private JMenu typeMenu;
-    private JMenuItem[] typeMenuItems;
-    private int customMenuItemIndex;
-
-    private JMenuItem solveCommand;
-    private Color[] colors;
-    private JLabel statusBar;
-    private PuzzlePanel pp;
-    private Runtime runtime;
-    private String[] puzzle_args;
-    private Graphics2D  gg;
-    private Timer timer;
-    private int xarg1, xarg2, xarg3;
-    private int[] xPoints, yPoints;
-    private BufferedImage[] blitters = new BufferedImage[512];
-    private ConfigDialog dlg;
-
-    static {
-        try {
-            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
-        } catch (Exception ex) {
-            ex.printStackTrace();
-        }
-    }
-
-    public void init() {
-        try {
-            Container cp = getContentPane();
-            cp.setLayout(new BorderLayout());
-            runtime = (Runtime) Class.forName("PuzzleEngine").newInstance();
-            runtime.setCallJavaCB(this);
-            JMenuBar menubar = new JMenuBar();
-            JMenu jm;
-            menubar.add(jm = new JMenu("Game"));
-            addMenuItemCallback(jm, "New", "jcallback_newgame_event");
-            addMenuItemCallback(jm, "Restart", "jcallback_restart_event");
-            addMenuItemCallback(jm, "Specific...", "jcallback_config_event", CFG_DESC);
-            addMenuItemCallback(jm, "Random Seed...", "jcallback_config_event", CFG_SEED);
-            jm.addSeparator();
-            addMenuItemCallback(jm, "Undo", "jcallback_undo_event");
-            addMenuItemCallback(jm, "Redo", "jcallback_redo_event");
-            jm.addSeparator();
-            solveCommand = addMenuItemCallback(jm, "Solve", "jcallback_solve_event");
-            solveCommand.setEnabled(false);
-            if (mainWindow != null) {
-                jm.addSeparator();
-                addMenuItemCallback(jm, "Exit", "jcallback_quit_event");
-            }
-            menubar.add(typeMenu = new JMenu("Type"));
-            typeMenu.setVisible(false);
-            menubar.add(jm = new JMenu("Help"));
-            addMenuItemCallback(jm, "About", "jcallback_about_event");
-            setJMenuBar(menubar);
-            cp.add(pp = new PuzzlePanel(), BorderLayout.CENTER);
-            pp.addKeyListener(new KeyAdapter() {
-                public void keyPressed(KeyEvent e) {
-                    int key = -1;
-                    int shift = e.isShiftDown() ? MOD_SHFT : 0;
-                    int ctrl = e.isControlDown() ? MOD_CTRL : 0;
-                    switch (e.getKeyCode()) {
-                    case KeyEvent.VK_LEFT:
-                    case KeyEvent.VK_KP_LEFT:
-                        key = shift | ctrl | CURSOR_LEFT;
-                        break;
-                    case KeyEvent.VK_RIGHT:
-                    case KeyEvent.VK_KP_RIGHT:
-                        key = shift | ctrl | CURSOR_RIGHT;
-                        break;
-                    case KeyEvent.VK_UP:
-                    case KeyEvent.VK_KP_UP:
-                        key = shift | ctrl | CURSOR_UP;
-                        break;
-                    case KeyEvent.VK_DOWN:
-                    case KeyEvent.VK_KP_DOWN:
-                        key = shift | ctrl | CURSOR_DOWN;
-                        break;
-                    case KeyEvent.VK_PAGE_UP:
-                        key = shift | ctrl | MOD_NUM_KEYPAD | '9';
-                        break;
-                    case KeyEvent.VK_PAGE_DOWN:
-                        key = shift | ctrl | MOD_NUM_KEYPAD | '3';
-                        break;
-                    case KeyEvent.VK_HOME:
-                        key = shift | ctrl | MOD_NUM_KEYPAD | '7';
-                        break;
-                    case KeyEvent.VK_END:
-                        key = shift | ctrl | MOD_NUM_KEYPAD | '1';
-                        break;
-                    default:
-                        if (e.getKeyCode() >= KeyEvent.VK_NUMPAD0 && e.getKeyCode() <=KeyEvent.VK_NUMPAD9) {
-                            key = MOD_NUM_KEYPAD | (e.getKeyCode() - KeyEvent.VK_NUMPAD0+'0');
-                        }
-                    break;
-                    }
-                    if (key != -1) {
-                        runtimeCall("jcallback_key_event", new int[] {0, 0, key});
-                    }
-                }
-                public void keyTyped(KeyEvent e) {
-                    int key = e.getKeyChar();
-                    if (key == 26 && e.isShiftDown() && e.isControlDown()) {
-                        runtimeCall("jcallback_redo_event", new int[0]);
-                        return;
-                    }
-                    runtimeCall("jcallback_key_event", new int[] {0, 0, key});
-                }
-            });
-            pp.addMouseListener(new MouseAdapter() {
-                public void mouseReleased(MouseEvent e) {
-                    mousePressedReleased(e, true);
-                }
-                public void mousePressed(MouseEvent e) {
-                    pp.requestFocus();
-                    mousePressedReleased(e, false);
-                }
-                private void mousePressedReleased(MouseEvent e, boolean released) {
-                    int button;
-                    if ((e.getModifiers() & (InputEvent.BUTTON2_MASK | InputEvent.SHIFT_MASK)) != 0)
-                        button = MIDDLE_BUTTON;
-                    else if ((e.getModifiers() & (InputEvent.BUTTON3_MASK | InputEvent.ALT_MASK)) != 0)
-                        button = RIGHT_BUTTON;
-                    else if ((e.getModifiers() & (InputEvent.BUTTON1_MASK)) != 0)
-                        button = LEFT_BUTTON;
-                    else
-                        return;
-                    if (released)
-                        button += LEFT_RELEASE - LEFT_BUTTON;
-                    runtimeCall("jcallback_key_event", new int[] {e.getX(), e.getY(), button});
-                }
-            });
-            pp.addMouseMotionListener(new MouseMotionAdapter() {
-                public void mouseDragged(MouseEvent e) {
-                    int button;
-                    if ((e.getModifiers() & (InputEvent.BUTTON2_MASK | InputEvent.SHIFT_MASK)) != 0)
-                        button = MIDDLE_DRAG;
-                    else if ((e.getModifiers() & (InputEvent.BUTTON3_MASK | InputEvent.ALT_MASK)) != 0)
-                        button = RIGHT_DRAG;
-                    else
-                        button = LEFT_DRAG;
-                    runtimeCall("jcallback_key_event", new int[] {e.getX(), e.getY(), button});
-                }
-            });
-            pp.addComponentListener(new ComponentAdapter() {
-                public void componentResized(ComponentEvent e) {
-                    handleResized();
-                }
-            });
-            pp.setFocusable(true);
-            pp.requestFocus();
-            timer = new Timer(20, new ActionListener() {
-                public void actionPerformed(ActionEvent e) {
-                    runtimeCall("jcallback_timer_func", new int[0]);
-                }
-            });
-           String gameid;
-           try {
-               gameid = getParameter("game_id");
-           } catch (java.lang.NullPointerException ex) {
-               gameid = null;
-           }
-           if (gameid == null) {
-               puzzle_args = null;
-           } else {
-               puzzle_args = new String[2];
-               puzzle_args[0] = "puzzle";
-               puzzle_args[1] = gameid;
-           }
-            SwingUtilities.invokeLater(new Runnable() {
-                public void run() {
-                    runtime.start(puzzle_args);
-                    runtime.execute();
-                }
-            });
-        } catch (Exception ex) {
-            ex.printStackTrace();
-        }
-    }
-
-    public void destroy() {
-        SwingUtilities.invokeLater(new Runnable() {
-            public void run() {
-                runtime.execute();
-                if (mainWindow != null) {
-                    mainWindow.dispose();
-                    System.exit(0);
-                }
-            }
-        });
-    }
-
-    protected void handleResized() {
-        pp.createBackBuffer(pp.getWidth(), pp.getHeight(), colors[0]);
-        runtimeCall("jcallback_resize", new int[] {pp.getWidth(), pp.getHeight()});
-    }
-
-    private JMenuItem addMenuItemCallback(JMenu jm, String name, final String callback, final int arg) {
-        return addMenuItemCallback(jm, name, callback, new int[] {arg}, false);
-    }
-
-    private JMenuItem addMenuItemCallback(JMenu jm, String name, final String callback) {
-        return addMenuItemCallback(jm, name, callback, new int[0], false);
-    }
-
-    private JMenuItem addMenuItemCallback(JMenu jm, String name, final String callback, final int[] args, boolean checkbox) {
-        JMenuItem jmi;
-        if (checkbox)
-            jm.add(jmi = new JCheckBoxMenuItem(name));
-        else
-        jm.add(jmi = new JMenuItem(name));
-        jmi.addActionListener(new ActionListener() {
-            public void actionPerformed(ActionEvent e) {
-                runtimeCall(callback, args);
-            }
-        });
-        return jmi;
-    }
-
-    protected void runtimeCall(String func, int[] args) {
-        if (runtimeCallWithResult(func, args) == 42 && mainWindow != null) {
-            destroy();
-        }
-    }
-
-    protected int runtimeCallWithResult(String func, int[] args) {
-        try {
-            return runtime.call(func, args);
-        } catch (Runtime.CallException ex) {
-            ex.printStackTrace();
-            return 42;
-        }
-    }
-
-    private void buildConfigureMenuItem() {
-        if (typeMenu.isVisible()) {
-            typeMenu.addSeparator();
-        } else {
-            typeMenu.setVisible(true);
-        }
-        typeMenuItems[customMenuItemIndex] =
-            addMenuItemCallback(typeMenu, "Custom...",
-                                "jcallback_config_event",
-                                new int[] {CFG_SETTINGS}, true);
-    }
-
-    private void addTypeItem
-        (JMenu targetMenu, String name, int newId, final int ptrGameParams) {
-
-        typeMenu.setVisible(true);
-        typeMenuItems[newId] =
-            addMenuItemCallback(targetMenu, name,
-                                "jcallback_preset_event",
-                                new int[] {ptrGameParams}, true);
-    }
-
-    private void addTypeSubmenu
-        (JMenu targetMenu, String name, int newId) {
-
-        JMenu newMenu = new JMenu(name);
-        newMenu.setVisible(true);
-        typeMenuItems[newId] = newMenu;
-        targetMenu.add(newMenu);
-    }
-
-    public int call(int cmd, int arg1, int arg2, int arg3) {
-        try {
-            switch(cmd) {
-            case 0: // initialize
-                if (mainWindow != null) mainWindow.setTitle(runtime.cstring(arg1));
-                if ((arg2 & 1) != 0) buildConfigureMenuItem();
-                if ((arg2 & 2) != 0) addStatusBar();
-                if ((arg2 & 4) != 0) solveCommand.setEnabled(true);
-                colors = new Color[arg3];
-                return 0;
-            case 1: // configure Type menu
-                if (arg1 == 0) {
-                    // preliminary setup
-                    typeMenuItems = new JMenuItem[arg2 + 2];
-                    typeMenuItems[arg2] = typeMenu;
-                    customMenuItemIndex = arg2 + 1;
-                    return arg2;
-                } else if (xarg1 != 0) {
-                    addTypeItem((JMenu)typeMenuItems[arg2],
-                                runtime.cstring(arg1), arg3, xarg1);
-                } else {
-                    addTypeSubmenu((JMenu)typeMenuItems[arg2],
-                                   runtime.cstring(arg1), arg3);
-                }
-                return 0;
-            case 2: // MessageBox
-                JOptionPane.showMessageDialog(this, runtime.cstring(arg2), runtime.cstring(arg1), arg3 == 0 ? JOptionPane.INFORMATION_MESSAGE : JOptionPane.ERROR_MESSAGE);
-                return 0;
-            case 3: // Resize
-                pp.setPreferredSize(new Dimension(arg1, arg2));
-                if (mainWindow != null) mainWindow.pack();
-                handleResized();
-                if (mainWindow != null) mainWindow.setVisible(true);
-                return 0;
-            case 4: // drawing tasks
-                switch(arg1) {
-                case 0:
-                   String text = runtime.cstring(arg2);
-                   if (text.equals("")) text = " ";
-                   statusBar.setText(text);
-                   break;
-                case 1:
-                    gg = pp.backBuffer.createGraphics();
-                    if (arg2 != 0 || arg3 != 0 ||
-                       arg2 + xarg2 != getWidth() ||
-                       arg3 + xarg3 != getHeight()) {
-                       int left = arg2, right = arg2 + xarg2;
-                       int top = arg3, bottom = arg3 + xarg3;
-                       int width = getWidth(), height = getHeight();
-                        gg.setColor(colors != null ? colors[0] : Color.black);
-                        gg.fillRect(0, 0, left, height);
-                        gg.fillRect(right, 0, width-right, height);
-                        gg.fillRect(0, 0, width, top);
-                        gg.fillRect(0, bottom, width, height-bottom);
-                        gg.setClip(left, top, right-left, bottom-top);
-                    }
-                    break;
-                case 2: gg.dispose(); pp.repaint(); break;
-                case 3: gg.setClip(arg2, arg3, xarg1, xarg2); break;
-                case 4:
-                    if (arg2 == 0 && arg3 == 0) {
-                        gg.setClip(0, 0, getWidth(), getHeight());
-                    } else {
-                        gg.setClip(arg2, arg3, getWidth()-2*arg2, getHeight()-2*arg3);
-                    }
-                    break;
-                case 5:
-                    gg.setColor(colors[xarg3]);
-                    gg.fillRect(arg2, arg3, xarg1, xarg2);
-                    break;
-                case 6:
-                    gg.setColor(colors[xarg3]);
-                    gg.drawLine(arg2, arg3, xarg1, xarg2);
-                    break;
-                case 7:
-                    xPoints = new int[arg2];
-                    yPoints = new int[arg2];
-                    break;
-                case 8:
-                    if (arg3 != -1) {
-                        gg.setColor(colors[arg3]);
-                        gg.fillPolygon(xPoints, yPoints, xPoints.length);
-                    }
-                    gg.setColor(colors[arg2]);
-                    gg.drawPolygon(xPoints, yPoints, xPoints.length);
-                    break;
-                case 9:
-                    if (arg3 != -1) {
-                        gg.setColor(colors[arg3]);
-                        gg.fillOval(xarg1-xarg3, xarg2-xarg3, xarg3*2, xarg3*2);
-                    }
-                    gg.setColor(colors[arg2]);
-                    gg.drawOval(xarg1-xarg3, xarg2-xarg3, xarg3*2, xarg3*2);
-                    break;
-                case 10:
-                    for(int i=0; i<blitters.length; i++) {
-                        if (blitters[i] == null) {
-                            blitters[i] = new BufferedImage(arg2, arg3, BufferedImage.TYPE_3BYTE_BGR);
-                            return i;
-                        }
-                    }
-                    throw new RuntimeException("No free blitter found!");
-                case 11: blitters[arg2] = null; break;
-                case 12:
-                    timer.start(); break;
-                case 13:
-                    timer.stop(); break;
-                }
-                return 0;
-            case 5: // more arguments
-                xarg1 = arg1;
-                xarg2 = arg2;
-                xarg3 = arg3;
-                return 0;
-            case 6: // polygon vertex
-                xPoints[arg1]=arg2;
-                yPoints[arg1]=arg3;
-                return 0;
-            case 7: // string
-                gg.setColor(colors[arg2]);
-                {
-                    String text = runtime.utfstring(arg3);
-                    Font ft = new Font((xarg3 & 0x10) != 0 ? "Monospaced" : "Dialog",
-                            Font.PLAIN, 100);
-                    int height100 = this.getFontMetrics(ft).getHeight();
-                    ft = ft.deriveFont(arg1 * 100 / (float)height100);
-                    FontMetrics fm = this.getFontMetrics(ft);
-                    int asc = fm.getAscent(), desc = fm.getDescent();
-                    if ((xarg3 & ALIGN_VCENTRE) != 0)
-                        xarg2 += asc - (asc+desc)/2;
-                    int wid = fm.stringWidth(text);
-                    if ((xarg3 & ALIGN_HCENTRE) != 0)
-                        xarg1 -= wid / 2;
-                    else if ((xarg3 & ALIGN_HRIGHT) != 0)
-                        xarg1 -= wid;
-                    gg.setFont(ft);
-                    gg.drawString(text, xarg1, xarg2);
-                }
-                return 0;
-            case 8: // blitter_save
-                Graphics g2 = blitters[arg1].createGraphics();
-                g2.drawImage(pp.backBuffer, 0, 0, blitters[arg1].getWidth(), blitters[arg1].getHeight(),
-                        arg2, arg3, arg2 + blitters[arg1].getWidth(), arg3 + blitters[arg1].getHeight(), this);
-                g2.dispose();
-                return 0;
-            case 9: // blitter_load
-                gg.drawImage(blitters[arg1], arg2, arg3, this);
-                return 0;
-            case 10: // dialog_init
-                dlg= new ConfigDialog(this, runtime.cstring(arg1));
-                return 0;
-            case 11: // dialog_add_control
-                {
-                    int sval_ptr = arg1;
-                    int ival = arg2;
-                    int ptr = xarg1;
-                    int type=xarg2;
-                    String name = runtime.cstring(xarg3);
-                    switch(type) {
-                    case C_STRING:
-                        dlg.addTextBox(ptr, name, runtime.cstring(sval_ptr));
-                        break;
-                    case C_BOOLEAN:
-                        dlg.addCheckBox(ptr, name, ival != 0);
-                        break;
-                    case C_CHOICES:
-                        dlg.addComboBox(ptr, name, runtime.cstring(sval_ptr), ival);
-                    }
-                }
-                return 0;
-            case 12:
-                dlg.finish();
-                dlg = null;
-                return 0;
-            case 13: // tick a menu item
-                if (arg1 < 0) arg1 = customMenuItemIndex;
-                for (int i = 0; i < typeMenuItems.length; i++) {
-                    if (typeMenuItems[i] instanceof JCheckBoxMenuItem) {
-                        ((JCheckBoxMenuItem)typeMenuItems[i]).setSelected
-                            (arg1 == i);
-                    }
-                }
-                return 0;
-            default:
-                if (cmd >= 1024 && cmd < 2048) { // palette
-                    colors[cmd-1024] = new Color(arg1, arg2, arg3);
-                }
-            if (cmd == 1024) {
-                pp.setBackground(colors[0]);
-                if (statusBar != null) statusBar.setBackground(colors[0]);
-                this.setBackground(colors[0]);
-            }
-            return 0;
-            }
-        } catch (Throwable ex) {
-            ex.printStackTrace();
-            System.exit(-1);
-            return 0;
-        }
-    }
-
-    private void addStatusBar() {
-        statusBar = new JLabel("test");
-        statusBar.setBorder(new BevelBorder(BevelBorder.LOWERED));
-        getContentPane().add(BorderLayout.SOUTH,statusBar);
-    }
-
-    // Standalone runner
-    public static void main(String[] args) {
-        final PuzzleApplet a = new PuzzleApplet();
-        JFrame jf = new JFrame("Loading...");
-        jf.getContentPane().setLayout(new BorderLayout());
-        jf.getContentPane().add(a, BorderLayout.CENTER);
-        a.mainWindow=jf;
-        a.init();
-        a.start();
-        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-        jf.addWindowListener(new WindowAdapter() {
-            public void windowClosing(WindowEvent e) {
-                a.stop();
-                a.destroy();
-            }
-        });
-        jf.setVisible(true);
-    }
-
-    public static class PuzzlePanel extends JPanel {
-
-        private static final long serialVersionUID = 1L;
-        protected BufferedImage backBuffer;
-
-        public PuzzlePanel() {
-            setPreferredSize(new Dimension(100,100));
-            createBackBuffer(100,100, Color.black);
-        }
-
-        public void createBackBuffer(int w, int h, Color bg) {
-           if (w > 0 && h > 0) {
-               backBuffer = new BufferedImage(w,h, BufferedImage.TYPE_3BYTE_BGR);
-               Graphics g = backBuffer.createGraphics();
-               g.setColor(bg);
-               g.fillRect(0, 0, w, h);
-               g.dispose();
-           }
-        }
-
-        protected void paintComponent(Graphics g) {
-            g.drawImage(backBuffer, 0, 0, this);
-        }
-    }
-
-    public static class ConfigComponent {
-        public int type;
-        public int configItemPointer;
-        public JComponent component;
-
-        public ConfigComponent(int type, int configItemPointer, JComponent component) {
-            this.type = type;
-            this.configItemPointer = configItemPointer;
-            this.component = component;
-        }
-    }
-
-    public class ConfigDialog extends JDialog {
-
-        private GridBagConstraints gbcLeft = new GridBagConstraints(
-                GridBagConstraints.RELATIVE, GridBagConstraints.RELATIVE, 1, 1,
-                0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE,
-                new Insets(0, 0, 0, 0), 0, 0);
-        private GridBagConstraints gbcRight = new GridBagConstraints(
-                GridBagConstraints.RELATIVE, GridBagConstraints.RELATIVE,
-                GridBagConstraints.REMAINDER, 1, 1.0, 0,
-                GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
-                new Insets(5, 5, 5, 5), 0, 0);
-        private GridBagConstraints gbcBottom = new GridBagConstraints(
-                GridBagConstraints.RELATIVE, GridBagConstraints.RELATIVE,
-                GridBagConstraints.REMAINDER, GridBagConstraints.REMAINDER,
-                1.0, 1.0, GridBagConstraints.CENTER,
-                GridBagConstraints.HORIZONTAL, new Insets(5, 5, 5, 5), 0, 0);
-
-        private static final long serialVersionUID = 1L;
-        private List components = new ArrayList();
-
-        public ConfigDialog(JApplet parent, String title) {
-            super(JOptionPane.getFrameForComponent(parent), title, true);
-            getContentPane().setLayout(new GridBagLayout());
-        }
-
-        public void addTextBox(int ptr, String name, String value) {
-            getContentPane().add(new JLabel(name), gbcLeft);
-            JComponent c = new JTextField(value, 25);
-            getContentPane().add(c, gbcRight);
-            components.add(new ConfigComponent(C_STRING, ptr, c));
-        }
-
-
-        public void addCheckBox(int ptr, String name, boolean selected) {
-            JComponent c = new JCheckBox(name, selected);
-            getContentPane().add(c, gbcRight);
-            components.add(new ConfigComponent(C_BOOLEAN, ptr, c));
-        }
-
-        public void addComboBox(int ptr, String name, String values, int selected) {
-            getContentPane().add(new JLabel(name), gbcLeft);
-            StringTokenizer st = new StringTokenizer(values.substring(1), values.substring(0,1));
-            JComboBox c = new JComboBox();
-            c.setEditable(false);
-            while(st.hasMoreTokens())
-                c.addItem(st.nextToken());
-            c.setSelectedIndex(selected);
-            getContentPane().add(c, gbcRight);
-            components.add(new ConfigComponent(C_CHOICES, ptr, c));
-        }
-
-        public void finish() {
-            JPanel buttons = new JPanel(new GridLayout(1, 2, 5, 5));
-            getContentPane().add(buttons, gbcBottom);
-            JButton b;
-            buttons.add(b=new JButton("OK"));
-            b.addActionListener(new ActionListener() {
-                public void actionPerformed(ActionEvent e) {
-                    save();
-                    dispose();
-                }
-            });
-            getRootPane().setDefaultButton(b);
-            buttons.add(b=new JButton("Cancel"));
-            b.addActionListener(new ActionListener() {
-                public void actionPerformed(ActionEvent e) {
-                    dispose();
-                }
-            });
-            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
-            pack();
-            setLocationRelativeTo(null);
-            setVisible(true);
-        }
-        private void save() {
-            for (int i = 0; i < components.size(); i++) {
-                ConfigComponent cc = (ConfigComponent) components.get(i);
-                switch(cc.type) {
-                case C_STRING:
-                    JTextField jtf = (JTextField)cc.component;
-                    runtimeCall("jcallback_config_set_string", new int[] {cc.configItemPointer, runtime.strdup(jtf.getText())});
-                    break;
-                case C_BOOLEAN:
-                    JCheckBox jcb = (JCheckBox)cc.component;
-                    runtimeCall("jcallback_config_set_boolean", new int[] {cc.configItemPointer, jcb.isSelected()?1:0});
-                    break;
-                case C_CHOICES:
-                    JComboBox jcm = (JComboBox)cc.component;
-                    runtimeCall("jcallback_config_set_choice", new int[] {cc.configItemPointer, jcm.getSelectedIndex()});
-                    break;
-                }
-            }
-            runtimeCall("jcallback_config_ok", new int[0]);
-        }
-    }
-}
diff --git a/Recipe b/Recipe
index 3b57ef5e5413f7c5ffd2a8f6fa20b505ad6aaf9f..27023998f86cfd2604b0d409f090cb96d5d7f352 100644 (file)
--- a/Recipe
+++ b/Recipe
@@ -96,6 +96,7 @@ Puzzles.dmg: Puzzles
 
 !begin am
 bin_PROGRAMS = $(GAMES)
+GTK_CFLAGS += -DSHAREDIR="\"$(datarootdir)\""
 !end
 !begin am_begin
 GAMES =
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..9d34d2f
--- /dev/null
@@ -0,0 +1,1832 @@
+# generated automatically by aclocal 1.15 -*- Autoconf -*-
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# Configure paths for GTK+
+# Owen Taylor     1997-2001
+
+dnl AM_PATH_GTK_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GTK+, and define GTK_CFLAGS and GTK_LIBS, if gthread is specified in MODULES, 
+dnl pass to pkg-config
+dnl
+AC_DEFUN([AM_PATH_GTK_2_0],
+[dnl 
+dnl Get the cflags and libraries from pkg-config
+dnl
+AC_ARG_ENABLE(gtktest, [  --disable-gtktest       do not try to compile and run a test GTK+ program],
+                   , enable_gtktest=yes)
+
+  pkg_config_args=gtk+-2.0
+  for module in . $4
+  do
+      case "$module" in
+         gthread) 
+             pkg_config_args="$pkg_config_args gthread-2.0"
+         ;;
+      esac
+  done
+
+  no_gtk=""
+
+  AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+  PKG_PROG_PKG_CONFIG([0.7])
+
+  min_gtk_version=ifelse([$1], ,2.0.0,$1)
+  AC_MSG_CHECKING(for GTK+ - version >= $min_gtk_version)
+
+  if test x$PKG_CONFIG != xno ; then
+    ## don't try to run the test against uninstalled libtool libs
+    if $PKG_CONFIG --uninstalled $pkg_config_args; then
+         echo "Will use uninstalled version of GTK+ found in PKG_CONFIG_PATH"
+         enable_gtktest=no
+    fi
+
+    if $PKG_CONFIG --atleast-version $min_gtk_version $pkg_config_args; then
+         :
+    else
+         no_gtk=yes
+    fi
+  fi
+
+  if test x"$no_gtk" = x ; then
+    GTK_CFLAGS=`$PKG_CONFIG $pkg_config_args --cflags`
+    GTK_LIBS=`$PKG_CONFIG $pkg_config_args --libs`
+    gtk_config_major_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+    gtk_config_minor_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+    gtk_config_micro_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+    if test "x$enable_gtktest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $GTK_CFLAGS"
+      LIBS="$GTK_LIBS $LIBS"
+dnl
+dnl Now check if the installed GTK+ is sufficiently new. (Also sanity
+dnl checks the results of pkg-config to some extent)
+dnl
+      rm -f conf.gtktest
+      AC_TRY_RUN([
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int 
+main ()
+{
+  int major, minor, micro;
+  char *tmp_version;
+
+  fclose (fopen ("conf.gtktest", "w"));
+
+  /* HP/UX 9 (%@#!) writes to sscanf strings */
+  tmp_version = g_strdup("$min_gtk_version");
+  if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+     printf("%s, bad version string\n", "$min_gtk_version");
+     exit(1);
+   }
+
+  if ((gtk_major_version != $gtk_config_major_version) ||
+      (gtk_minor_version != $gtk_config_minor_version) ||
+      (gtk_micro_version != $gtk_config_micro_version))
+    {
+      printf("\n*** 'pkg-config --modversion gtk+-2.0' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", 
+             $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+             gtk_major_version, gtk_minor_version, gtk_micro_version);
+      printf ("*** was found! If pkg-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+      printf("*** to point to the correct configuration files\n");
+    } 
+  else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+          (gtk_minor_version != GTK_MINOR_VERSION) ||
+           (gtk_micro_version != GTK_MICRO_VERSION))
+    {
+      printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+            GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+      printf("*** library (version %d.%d.%d)\n",
+            gtk_major_version, gtk_minor_version, gtk_micro_version);
+    }
+  else
+    {
+      if ((gtk_major_version > major) ||
+        ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+        ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+      {
+        return 0;
+       }
+     else
+      {
+        printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n",
+               gtk_major_version, gtk_minor_version, gtk_micro_version);
+        printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n",
+              major, minor, micro);
+        printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+        printf("***\n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of GTK+, but you can also set the PKG_CONFIG environment to point to the\n");
+        printf("*** correct copy of pkg-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_gtk" = x ; then
+     AC_MSG_RESULT(yes (version $gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version))
+     ifelse([$2], , :, [$2])     
+  else
+     AC_MSG_RESULT(no)
+     if test "$PKG_CONFIG" = "no" ; then
+       echo "*** A new enough version of pkg-config was not found."
+       echo "*** See http://pkgconfig.sourceforge.net"
+     else
+       if test -f conf.gtktest ; then
+        :
+       else
+          echo "*** Could not run GTK+ test program, checking why..."
+         ac_save_CFLAGS="$CFLAGS"
+         ac_save_LIBS="$LIBS"
+          CFLAGS="$CFLAGS $GTK_CFLAGS"
+          LIBS="$LIBS $GTK_LIBS"
+          AC_TRY_LINK([
+#include <gtk/gtk.h>
+#include <stdio.h>
+],      [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ],
+        [ echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding GTK+ or finding the wrong"
+          echo "*** version of GTK+. If it is not finding GTK+, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+         echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ],
+        [ echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means GTK+ is incorrectly installed."])
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     GTK_CFLAGS=""
+     GTK_LIBS=""
+     ifelse([$3], , :, [$3])
+  fi
+  AC_SUBST(GTK_CFLAGS)
+  AC_SUBST(GTK_LIBS)
+  rm -f conf.gtktest
+])
+
+# Configure paths for GTK+
+# Owen Taylor     1997-2001
+
+dnl AM_PATH_GTK_3_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GTK+, and define GTK_CFLAGS and GTK_LIBS, if gthread is specified in MODULES, 
+dnl pass to pkg-config
+dnl
+AC_DEFUN([AM_PATH_GTK_3_0],
+[m4_warn([obsolete], [AM_PATH_GTK_3_0 is deprecated, use PKG_CHECK_MODULES([GTK], [gtk+-3.0]) instead])
+dnl Get the cflags and libraries from pkg-config
+dnl
+AC_ARG_ENABLE(gtktest, [  --disable-gtktest       do not try to compile and run a test GTK+ program],
+                   , enable_gtktest=yes)
+  min_gtk_version=ifelse([$1], [], [3.0.0], [$1])
+
+  pkg_config_args="gtk+-3.0 >= $min_gtk_version"
+  for module in . $4
+  do
+      case "$module" in
+         gthread)
+             pkg_config_args="$pkg_config_args gthread-2.0"
+         ;;
+      esac
+  done
+
+  no_gtk=""
+
+  AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+
+  if test x$PKG_CONFIG != xno ; then
+    if $PKG_CONFIG --atleast-pkgconfig-version 0.7 ; then
+      :
+    else
+      echo "*** pkg-config too old; version 0.7 or better required."
+      no_gtk=yes
+      PKG_CONFIG=no
+    fi
+  else
+    no_gtk=yes
+  fi
+
+  AC_MSG_CHECKING(for GTK+ - version >= $min_gtk_version)
+
+  if test x$PKG_CONFIG != xno ; then
+    ## don't try to run the test against uninstalled libtool libs
+    if $PKG_CONFIG --uninstalled $pkg_config_args; then
+         echo "Will use uninstalled version of GTK+ found in PKG_CONFIG_PATH"
+         enable_gtktest=no
+    fi
+
+    if $PKG_CONFIG $pkg_config_args; then
+         :
+    else
+         no_gtk=yes
+    fi
+  fi
+
+  if test x"$no_gtk" = x ; then
+    GTK_CFLAGS=`$PKG_CONFIG $pkg_config_args --cflags`
+    GTK_LIBS=`$PKG_CONFIG $pkg_config_args --libs`
+    gtk_config_major_version=`$PKG_CONFIG --modversion gtk+-3.0 | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+    gtk_config_minor_version=`$PKG_CONFIG --modversion gtk+-3.0 | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+    gtk_config_micro_version=`$PKG_CONFIG --modversion gtk+-3.0 | \
+           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+    if test "x$enable_gtktest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $GTK_CFLAGS"
+      LIBS="$GTK_LIBS $LIBS"
+dnl
+dnl Now check if the installed GTK+ is sufficiently new. (Also sanity
+dnl checks the results of pkg-config to some extent)
+dnl
+      rm -f conf.gtktest
+      AC_TRY_RUN([
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int 
+main ()
+{
+  unsigned int major, minor, micro;
+
+  fclose (fopen ("conf.gtktest", "w"));
+
+  if (sscanf("$min_gtk_version", "%u.%u.%u", &major, &minor, &micro) != 3) {
+     printf("%s, bad version string\n", "$min_gtk_version");
+     exit(1);
+   }
+
+  if ((gtk_major_version != $gtk_config_major_version) ||
+      (gtk_minor_version != $gtk_config_minor_version) ||
+      (gtk_micro_version != $gtk_config_micro_version))
+    {
+      printf("\n*** 'pkg-config --modversion gtk+-3.0' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", 
+             $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+             gtk_major_version, gtk_minor_version, gtk_micro_version);
+      printf ("*** was found! If pkg-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+      printf("*** to point to the correct configuration files\n");
+    } 
+  else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+          (gtk_minor_version != GTK_MINOR_VERSION) ||
+           (gtk_micro_version != GTK_MICRO_VERSION))
+    {
+      printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+            GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+      printf("*** library (version %d.%d.%d)\n",
+            gtk_major_version, gtk_minor_version, gtk_micro_version);
+    }
+  else
+    {
+      if ((gtk_major_version > major) ||
+        ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+        ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+      {
+        return 0;
+       }
+     else
+      {
+        printf("\n*** An old version of GTK+ (%u.%u.%u) was found.\n",
+               gtk_major_version, gtk_minor_version, gtk_micro_version);
+        printf("*** You need a version of GTK+ newer than %u.%u.%u. The latest version of\n",
+              major, minor, micro);
+        printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+        printf("***\n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of GTK+, but you can also set the PKG_CONFIG environment to point to the\n");
+        printf("*** correct copy of pkg-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_gtk" = x ; then
+     AC_MSG_RESULT(yes (version $gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version))
+     ifelse([$2], , :, [$2])
+  else
+     AC_MSG_RESULT(no)
+     if test "$PKG_CONFIG" = "no" ; then
+       echo "*** A new enough version of pkg-config was not found."
+       echo "*** See http://pkgconfig.sourceforge.net"
+     else
+       if test -f conf.gtktest ; then
+        :
+       else
+          echo "*** Could not run GTK+ test program, checking why..."
+         ac_save_CFLAGS="$CFLAGS"
+         ac_save_LIBS="$LIBS"
+          CFLAGS="$CFLAGS $GTK_CFLAGS"
+          LIBS="$LIBS $GTK_LIBS"
+          AC_TRY_LINK([
+#include <gtk/gtk.h>
+#include <stdio.h>
+],      [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ],
+        [ echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding GTK+ or finding the wrong"
+          echo "*** version of GTK+. If it is not finding GTK+, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+         echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ],
+        [ echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means GTK+ is incorrectly installed."])
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     GTK_CFLAGS=""
+     GTK_LIBS=""
+     ifelse([$3], , :, [$3])
+  fi
+  AC_SUBST(GTK_CFLAGS)
+  AC_SUBST(GTK_LIBS)
+  rm -f conf.gtktest
+])
+
+dnl GTK_CHECK_BACKEND(BACKEND-NAME [, MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl   Tests for BACKEND-NAME in the GTK targets list
+dnl
+AC_DEFUN([GTK_CHECK_BACKEND],
+[m4_warn([obsolete], [GTK_CHECK_BACKEND is deprecated, use PKG_CHECK_MODULES([GTK_X11], [gtk+-x11-3.0]) or similar instead])
+  pkg_config_args=ifelse([$1],,gtk+-3.0, gtk+-$1-3.0)
+  min_gtk_version=ifelse([$2],,3.0.0,$2)
+  pkg_config_args="$pkg_config_args >= $min_gtk_version"
+
+  AC_PATH_PROG(PKG_CONFIG, [pkg-config], [AC_MSG_ERROR([No pkg-config found])])
+
+  if $PKG_CONFIG $pkg_config_args ; then
+    target_found=yes
+  else
+    target_found=no
+  fi
+
+  if test "x$target_found" = "xno"; then
+    ifelse([$4],,[AC_MSG_ERROR([Backend $backend not found.])],[$4])
+  else
+    ifelse([$3],,[:],[$3])
+  fi
+])
+
+dnl pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-
+dnl serial 11 (pkg-config-0.29.1)
+dnl
+dnl Copyright Â© 2004 Scott James Remnant <scott@netsplit.com>.
+dnl Copyright Â© 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+dnl 02111-1307, USA.
+dnl
+dnl As a special exception to the GNU General Public License, if you
+dnl distribute this file as part of a program that contains a
+dnl configuration script generated by Autoconf, you may include it under
+dnl the same distribution terms that you use for the rest of that
+dnl program.
+
+dnl PKG_PREREQ(MIN-VERSION)
+dnl -----------------------
+dnl Since: 0.29
+dnl
+dnl Verify that the version of the pkg-config macros are at least
+dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
+dnl installed version of pkg-config, this checks the developer's version
+dnl of pkg.m4 when generating configure.
+dnl
+dnl To ensure that this macro is defined, also add:
+dnl m4_ifndef([PKG_PREREQ],
+dnl     [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
+dnl
+dnl See the "Since" comment for each macro you use to see what version
+dnl of the macros you require.
+m4_defun([PKG_PREREQ],
+[m4_define([PKG_MACROS_VERSION], [0.29.1])
+m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
+    [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
+])dnl PKG_PREREQ
+
+dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
+dnl ----------------------------------
+dnl Since: 0.16
+dnl
+dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
+dnl first found in the path. Checks that the version of pkg-config found
+dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
+dnl used since that's the first version where most current features of
+dnl pkg-config existed.
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
+m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
+AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
+AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=m4_default([$1], [0.9.0])
+       AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               AC_MSG_RESULT([yes])
+       else
+               AC_MSG_RESULT([no])
+               PKG_CONFIG=""
+       fi
+fi[]dnl
+])dnl PKG_PROG_PKG_CONFIG
+
+dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------------------------------
+dnl Since: 0.18
+dnl
+dnl Check to see whether a particular set of modules exists. Similar to
+dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
+dnl
+dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+dnl only at the first occurence in configure.ac, so if the first place
+dnl it's called might be skipped (such as if it is within an "if", you
+dnl have to call PKG_CHECK_EXISTS manually
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_default([$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
+
+dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+dnl ---------------------------------------------
+dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
+dnl pkg_failed based on the result.
+m4_define([_PKG_CONFIG],
+[if test -n "$$1"; then
+    pkg_cv_[]$1="$$1"
+ elif test -n "$PKG_CONFIG"; then
+    PKG_CHECK_EXISTS([$3],
+                     [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes ],
+                    [pkg_failed=yes])
+ else
+    pkg_failed=untried
+fi[]dnl
+])dnl _PKG_CONFIG
+
+dnl _PKG_SHORT_ERRORS_SUPPORTED
+dnl ---------------------------
+dnl Internal check to see if pkg-config supports short errors.
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])dnl _PKG_SHORT_ERRORS_SUPPORTED
+
+
+dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl   [ACTION-IF-NOT-FOUND])
+dnl --------------------------------------------------------------
+dnl Since: 0.4.0
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
+dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+       AC_MSG_RESULT([no])
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test $_pkg_short_errors_supported = yes; then
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
+        else 
+               $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+       m4_default([$4], [AC_MSG_ERROR(
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT])[]dnl
+        ])
+elif test $pkg_failed = untried; then
+       AC_MSG_RESULT([no])
+       m4_default([$4], [AC_MSG_FAILURE(
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
+        ])
+else
+       $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+       $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+        AC_MSG_RESULT([yes])
+       $3
+fi[]dnl
+])dnl PKG_CHECK_MODULES
+
+
+dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl   [ACTION-IF-NOT-FOUND])
+dnl ---------------------------------------------------------------------
+dnl Since: 0.29
+dnl
+dnl Checks for existence of MODULES and gathers its build flags with
+dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
+dnl and VARIABLE-PREFIX_LIBS from --libs.
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
+dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
+dnl configure.ac.
+AC_DEFUN([PKG_CHECK_MODULES_STATIC],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+_save_PKG_CONFIG=$PKG_CONFIG
+PKG_CONFIG="$PKG_CONFIG --static"
+PKG_CHECK_MODULES($@)
+PKG_CONFIG=$_save_PKG_CONFIG[]dnl
+])dnl PKG_CHECK_MODULES_STATIC
+
+
+dnl PKG_INSTALLDIR([DIRECTORY])
+dnl -------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable pkgconfigdir as the location where a module
+dnl should install pkg-config .pc files. By default the directory is
+dnl $libdir/pkgconfig, but the default can be changed by passing
+dnl DIRECTORY. The user can override through the --with-pkgconfigdir
+dnl parameter.
+AC_DEFUN([PKG_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+    [pkg-config installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([pkgconfigdir],
+    [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
+    [with_pkgconfigdir=]pkg_default)
+AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_INSTALLDIR
+
+
+dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
+dnl --------------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable noarch_pkgconfigdir as the location where a
+dnl module should install arch-independent pkg-config .pc files. By
+dnl default the directory is $datadir/pkgconfig, but the default can be
+dnl changed by passing DIRECTORY. The user can override through the
+dnl --with-noarch-pkgconfigdir parameter.
+AC_DEFUN([PKG_NOARCH_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+    [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([noarch-pkgconfigdir],
+    [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
+    [with_noarch_pkgconfigdir=]pkg_default)
+AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_NOARCH_INSTALLDIR
+
+
+dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
+dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------
+dnl Since: 0.28
+dnl
+dnl Retrieves the value of the pkg-config variable for the given module.
+AC_DEFUN([PKG_CHECK_VAR],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
+
+_PKG_CONFIG([$1], [variable="][$3]["], [$2])
+AS_VAR_COPY([$1], [pkg_cv_][$1])
+
+AS_VAR_IF([$1], [""], [$5], [$4])dnl
+])dnl PKG_CHECK_VAR
+
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.15'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.15], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.15])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
+      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
+      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
+      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                    [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+  [--enable-dependency-tracking],
+  [do not reject slow dependency extractors])
+AS_HELP_STRING(
+  [--disable-dependency-tracking],
+  [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named 'Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running 'make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "$am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each '.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+             [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
+  [ok:ok],,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+             [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+                            [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                 [_AM_DEPENDENCIES([CC])],
+                 [m4_define([AC_PROG_CC],
+                            m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                 [_AM_DEPENDENCIES([CXX])],
+                 [m4_define([AC_PROG_CXX],
+                            m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+                 [_AM_DEPENDENCIES([OBJC])],
+                 [m4_define([AC_PROG_OBJC],
+                            m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+                 [_AM_DEPENDENCIES([OBJCXX])],
+                 [m4_define([AC_PROG_OBJCXX],
+                            m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+  fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.                 -*- Autoconf -*-
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+  [whether $CC understands -c and -o together],
+  [am_cv_prog_cc_c_o],
+  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \   ]]*)
+    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$[*]" = "X"; then
+       # -L didn't work.
+       set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$[*]" != "X $srcdir/configure conftest.file" \
+       && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+       # If neither matched, then we have a broken ls.  This can happen
+       # if, for instance, CONFIG_SHELL is bash and it inherits a
+       # broken ls alias from the environment.  This has actually
+       # happened.  Such a system could not be considered "sane".
+       AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment])
+     fi
+     if test "$[2]" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+  [AC_MSG_CHECKING([that generated files are newer than configure])
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+  [--enable-silent-rules],
+  [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+  [--disable-silent-rules],
+  [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+   [am_cv_make_support_nested_variables],
+   [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+       @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+  dnl Using '$V' instead of '$(V)' breaks IRIX make.
+  AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+  [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+  [m4_case([$1],
+    [ustar],
+     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+      # There is notably a 21 bits limit for the UID and the GID.  In fact,
+      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+      # and bug#13588).
+      am_max_uid=2097151 # 2^21 - 1
+      am_max_gid=$am_max_uid
+      # The $UID and $GID variables are not portable, so we need to resort
+      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
+      # below are definitely unexpected, so allow the users to see them
+      # (that is, avoid stderr redirection).
+      am_uid=`id -u || echo unknown`
+      am_gid=`id -g || echo unknown`
+      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+      if test $am_uid -le $am_max_uid; then
+         AC_MSG_RESULT([yes])
+      else
+         AC_MSG_RESULT([no])
+         _am_tools=none
+      fi
+      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+      if test $am_gid -le $am_max_gid; then
+         AC_MSG_RESULT([yes])
+      else
+        AC_MSG_RESULT([no])
+        _am_tools=none
+      fi],
+
+  [pax],
+    [],
+
+  [m4_fatal([Unknown tar format])])
+
+  AC_MSG_CHECKING([how to create a $1 tar archive])
+
+  # Go ahead even if we have the value already cached.  We do so because we
+  # need to set the values for the 'am__tar' and 'am__untar' variables.
+  _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+  for _am_tool in $_am_tools; do
+    case $_am_tool in
+    gnutar)
+      for _am_tar in tar gnutar gtar; do
+        AM_RUN_LOG([$_am_tar --version]) && break
+      done
+      am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+      am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+      am__untar="$_am_tar -xf -"
+      ;;
+    plaintar)
+      # Must skip GNU tar: if it does not support --format= it doesn't create
+      # ustar tarball either.
+      (tar --version) >/dev/null 2>&1 && continue
+      am__tar='tar chf - "$$tardir"'
+      am__tar_='tar chf - "$tardir"'
+      am__untar='tar xf -'
+      ;;
+    pax)
+      am__tar='pax -L -x $1 -w "$$tardir"'
+      am__tar_='pax -L -x $1 -w "$tardir"'
+      am__untar='pax -r'
+      ;;
+    cpio)
+      am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+      am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+      am__untar='cpio -i -H $1 -d'
+      ;;
+    none)
+      am__tar=false
+      am__tar_=false
+      am__untar=false
+      ;;
+    esac
+
+    # If the value was cached, stop now.  We just wanted to have am__tar
+    # and am__untar set.
+    test -n "${am_cv_prog_tar_$1}" && break
+
+    # tar/untar a dummy directory, and stop if the command works.
+    rm -rf conftest.dir
+    mkdir conftest.dir
+    echo GrepMe > conftest.dir/file
+    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+    rm -rf conftest.dir
+    if test -s conftest.tar; then
+      AM_RUN_LOG([$am__untar <conftest.tar])
+      AM_RUN_LOG([cat conftest.dir/file])
+      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+    fi
+  done
+  rm -rf conftest.dir
+
+  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+  AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/benchmark.pl b/benchmark.pl
deleted file mode 100755 (executable)
index 9876385..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-#!/usr/bin/perl
-
-# Process the raw output from benchmark.sh into Javascript-ified HTML.
-
-use strict;
-use warnings;
-
-my @presets = ();
-my %presets = ();
-my $maxval = 0;
-
-while (<>) {
-    chomp;
-    if (/^(.*)(#.*): ([\d\.]+)$/) {
-        push @presets, $1 unless defined $presets{$1};
-        push @{$presets{$1}}, $3;
-        $maxval = $3 if $maxval < $3;
-    }
-}
-
-print <<EOF;
-<!DOCTYPE html>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ASCII" />
-<title>Puzzle generation-time benchmarks</title>
-<script type="text/javascript">
-//<![CDATA[
-function choose_scale_ticks(scale) {
-    var nscale = 1, j = 0, factors = [2,2.5,2];
-    while (scale / nscale > 20) {
-        nscale *= factors[j];
-        j = (j+1) % factors.length;
-    } 
-    return nscale;
-}
-function initPlots() {
-    var canvases = document.getElementsByTagName('canvas');
-    for (var i = 0; i < canvases.length; i++) {
-       var canvas = canvases[i];
-        var scale = eval(canvas.getAttribute("data-scale"));
-        var add = 20.5, mult = (canvas.width - 2*add) / scale;
-       var data = eval(canvas.getAttribute("data-points"));
-        var ctx = canvas.getContext('2d');
-        ctx.lineWidth = '1px';
-        ctx.lineCap = 'round';
-        ctx.lineJoin = 'round';
-        ctx.strokeStyle = ctx.fillStyle = '#000000';
-       if (data === "scale") {
-            // Draw scale.
-            ctx.font = "16px sans-serif";
-            ctx.textAlign = "center";
-            ctx.textBaseline = "alphabetic";
-            var nscale = choose_scale_ticks(scale);
-            for (var x = 0; x <= scale; x += nscale) {
-                ctx.beginPath();
-                ctx.moveTo(add+mult*x, canvas.height);
-                ctx.lineTo(add+mult*x, canvas.height - 3);
-                ctx.stroke();
-                ctx.fillText(x + "s", add+mult*x, canvas.height - 6);
-            }
-        } else {
-            // Draw a box plot.
-            function quantile(x) {
-                var n = (data.length * x) | 0;
-                return (data[n-1] + data[n]) / 2;
-            }
-
-            var q1 = quantile(0.25), q2 = quantile(0.5), q3 = quantile(0.75);
-            var iqr = q3 - q1;
-            var top = 0.5, bot = canvas.height - 1.5, mid = (top+bot)/2;
-            var wlo = null, whi = null; // whisker ends
-
-            ctx.strokeStyle = '#bbbbbb';
-            var nscale = choose_scale_ticks(scale);
-            for (var x = 0; x <= scale; x += nscale) {
-                ctx.beginPath();
-                ctx.moveTo(add+mult*x, 0);
-                ctx.lineTo(add+mult*x, canvas.height);
-                ctx.stroke();
-            }
-            ctx.strokeStyle = '#000000';
-
-            for (var j in data) {
-                var x = data[j];
-                if (x >= q1 - 1.5 * iqr && x <= q3 + 1.5 * iqr) {
-                    if (wlo === null || wlo > x)
-                        wlo = x;
-                    if (whi === null || whi < x)
-                        whi = x;
-                } else {
-                    ctx.beginPath();
-                    ctx.arc(add+mult*x, mid, 2, 0, 2*Math.PI);
-                    ctx.stroke();
-                    if (x >= q1 - 3 * iqr && x <= q3 + 3 * iqr)
-                        ctx.fill();
-                }
-            }
-
-            ctx.beginPath();
-
-            // Box
-            ctx.moveTo(add+mult*q1, top);
-            ctx.lineTo(add+mult*q3, top);
-            ctx.lineTo(add+mult*q3, bot);
-            ctx.lineTo(add+mult*q1, bot);
-            ctx.closePath();
-
-            // Line at median
-            ctx.moveTo(add+mult*q2, top);
-            ctx.lineTo(add+mult*q2, bot);
-
-            // Lower whisker
-            ctx.moveTo(add+mult*q1, mid);
-            ctx.lineTo(add+mult*wlo, mid);
-            ctx.moveTo(add+mult*wlo, top);
-            ctx.lineTo(add+mult*wlo, bot);
-
-            // Upper whisker
-            ctx.moveTo(add+mult*q3, mid);
-            ctx.lineTo(add+mult*whi, mid);
-            ctx.moveTo(add+mult*whi, top);
-            ctx.lineTo(add+mult*whi, bot);
-
-            ctx.stroke();
-        }
-    }
-    document.getElementById('sort_orig').onclick = function() {
-        sort(function(e) {
-            return parseFloat(e.getAttribute("data-index"));
-        });
-    };
-    document.getElementById('sort_median').onclick = function() {
-        sort(function(e) {
-            return -parseFloat(e.getAttribute("data-median"));
-        });
-    };
-    document.getElementById('sort_mean').onclick = function() {
-        sort(function(e) {
-            return -parseFloat(e.getAttribute("data-mean"));
-        });
-    };
-}
-function sort(keyfn) {
-    var rows = document.getElementsByTagName("tr");
-    var trs = [];
-    for (var i = 0; i < rows.length; i++)
-        trs.push(rows[i]);
-    trs.sort(function(a,b) {
-        var akey = keyfn(a);
-        var bkey = keyfn(b);
-        return akey < bkey ? -1 : akey > bkey ? +1 : 0;
-    });
-    var parent = trs[0].parentElement;
-    for (var i = 0; i < trs.length; i++)
-        parent.removeChild(trs[i]);
-    for (var i = 0; i < trs.length; i++)
-        parent.appendChild(trs[i]);
-}
-//]]>
-</script>
-</head>
-<body onLoad="initPlots();">
-<h1 align=center>Puzzle generation-time benchmarks</h1>
-<p>Sort order:
-<button id="sort_orig">Original</button>
-<button id="sort_median">Median</button>
-<button id="sort_mean">Mean</button>
-<table>
-<tr><th>Preset</th><td><canvas width=700 height=30 data-points='"scale"' data-scale="$maxval"></td></tr>
-EOF
-
-my $index = 0;
-for my $preset (@presets) {
-    my @data = sort { $a <=> $b } @{$presets{$preset}};
-    my $median = ($#data % 2 ?
-                  ($data[($#data-1)/2]+$data[($#data+1)/2])/2 :
-                  $data[$#data/2]);
-    my $mean = 0; map { $mean += $_ } @data; $mean /= @data;
-    print "<tr data-index=\"$index\" data-mean=\"$mean\" data-median=\"$median\"><td>", &escape($preset), "</td><td><canvas width=700 height=15 data-points=\"[";
-    print join ",", @data;
-    print "]\" data-scale=\"$maxval\"></td></tr>\n";
-    $index++;
-}
-
-print <<EOF;
-</body>
-</html>
-EOF
-
-sub escape {
-    my ($text) = @_;
-    $text =~ s/&/&amp;/g;
-    $text =~ s/</&lt;/g;
-    $text =~ s/>/&gt;/g;
-    return $text;
-}
diff --git a/benchmark.sh b/benchmark.sh
deleted file mode 100755 (executable)
index b3af277..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/sh
-
-# Run every puzzle in benchmarking mode, and generate a file of raw
-# data that benchmark.pl will format into a web page.
-
-# If any arguments are provided, use those as the list of games to
-# benchmark. Otherwise, read the full list from gamedesc.txt.
-if test $# = 0; then
-    set -- $(cut -f1 -d: < gamedesc.txt)
-fi
-
-failures=false
-
-for game in "$@"; do
-    # Use 'env -i' to suppress any environment variables that might
-    # change the preset list for a puzzle (e.g. user-defined extras)
-    presets=$(env -i ./$game --list-presets | cut -f1 -d' ')
-    for preset in $presets; do
-       if ! env -i ./$game --test-solve --time-generation \
-                            --generate 100 $preset;
-        then
-            echo "${game} ${preset} failed to generate" >&2
-        fi
-    done
-done
-
-if $failures; then exit 1; fi
diff --git a/chm.but b/chm.but
new file mode 100644 (file)
index 0000000..e023704
--- /dev/null
+++ b/chm.but
@@ -0,0 +1,21 @@
+\# File containing the magic HTML configuration directives to create
+\# an MS HTML Help project. We put this on the end of the Puzzles
+\# docs build command line to build the HHP and friends.
+
+\cfg{html-leaf-level}{infinite}
+\cfg{html-leaf-contains-contents}{false}
+\cfg{html-suppress-navlinks}{true}
+\cfg{html-suppress-address}{true}
+
+\cfg{html-contents-filename}{index.html}
+\cfg{html-template-filename}{%k.html}
+\cfg{html-template-fragment}{%k}
+
+\cfg{html-mshtmlhelp-chm}{puzzles.chm}
+\cfg{html-mshtmlhelp-project}{puzzles.hhp}
+\cfg{html-mshtmlhelp-contents}{puzzles.hhc}
+\cfg{html-mshtmlhelp-index}{puzzles.hhk}
+
+\cfg{html-body-end}{}
+
+\cfg{html-head-end}{<link rel="stylesheet" type="text/css" href="chm.css">}
diff --git a/chm.css b/chm.css
deleted file mode 100644 (file)
index d8c316b..0000000
--- a/chm.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Stylesheet for a Windows .CHM help file */
-
-body { font-size: 75%; font-family: Verdana, Arial, Helvetica, Sans-Serif; }
-
-h1 { font-weight: bold; font-size: 150%; }
-h2 { font-weight: bold; font-size: 130%; }
-h3 { font-weight: bold; font-size: 120%; }
diff --git a/compile b/compile
new file mode 100755 (executable)
index 0000000..a85b723
--- /dev/null
+++ b/compile
@@ -0,0 +1,347 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2012-10-14.11; # UTC
+
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# 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.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""       $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+       # lazily determine how to convert abs files
+       case `uname -s` in
+         MINGW*)
+           file_conv=mingw
+           ;;
+         CYGWIN*)
+           file_conv=cygwin
+           ;;
+         *)
+           file_conv=wine
+           ;;
+       esac
+      fi
+      case $file_conv/,$2, in
+       *,$file_conv,*)
+         ;;
+       mingw/*)
+         file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+         ;;
+       cygwin/*)
+         file=`cygpath -m "$file" || echo "$file"`
+         ;;
+       wine/*)
+         file=`winepath -w "$file" || echo "$file"`
+         ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+    if test -f "$dir/lib$lib.a"; then
+      found=yes
+      lib=$dir/lib$lib.a
+      break
+    fi
+  done
+  IFS=$save_IFS
+
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+       -o)
+         # configure might choose to run compile as 'compile cc -o foo foo.c'.
+         eat=1
+         case $2 in
+           *.o | *.[oO][bB][jJ])
+             func_file_conv "$2"
+             set x "$@" -Fo"$file"
+             shift
+             ;;
+           *)
+             func_file_conv "$2"
+             set x "$@" -Fe"$file"
+             shift
+             ;;
+         esac
+         ;;
+       -I)
+         eat=1
+         func_file_conv "$2" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -I*)
+         func_file_conv "${1#-I}" mingw
+         set x "$@" -I"$file"
+         shift
+         ;;
+       -l)
+         eat=1
+         func_cl_dashl "$2"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -l*)
+         func_cl_dashl "${1#-l}"
+         set x "$@" "$lib"
+         shift
+         ;;
+       -L)
+         eat=1
+         func_cl_dashL "$2"
+         ;;
+       -L*)
+         func_cl_dashL "${1#-L}"
+         ;;
+       -static)
+         shared=false
+         ;;
+       -Wl,*)
+         arg=${1#-Wl,}
+         save_ifs="$IFS"; IFS=','
+         for flag in $arg; do
+           IFS="$save_ifs"
+           linker_opts="$linker_opts $flag"
+         done
+         IFS="$save_ifs"
+         ;;
+       -Xlinker)
+         eat=1
+         linker_opts="$linker_opts $2"
+         ;;
+       -*)
+         set x "$@" "$1"
+         shift
+         ;;
+       *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+         func_file_conv "$1"
+         set x "$@" -Tp"$file"
+         shift
+         ;;
+       *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+         func_file_conv "$1" mingw
+         set x "$@" "$file"
+         shift
+         ;;
+       *)
+         set x "$@" "$1"
+         shift
+         ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+       # configure might choose to run compile as 'compile cc -o foo foo.c'.
+       # So we strip '-o arg' only if arg is an object.
+       eat=1
+       case $2 in
+         *.o | *.obj)
+           ofile=$2
+           ;;
+         *)
+           set x "$@" -o "$2"
+           shift
+           ;;
+       esac
+       ;;
+      *.c)
+       cfile=$1
+       set x "$@" "$1"
+       shift
+       ;;
+      *)
+       set x "$@" "$1"
+       shift
+       ;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no '-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # '.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..a230eaa
--- /dev/null
+++ b/configure
@@ -0,0 +1,5751 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.69 for puzzles 20161228.7cae89f.
+#
+# Report bugs to <anakin@pobox.com>.
+#
+#
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# Use a proper internal environment variable to ensure we don't fall
+  # into an infinite loop, continuously re-executing ourselves.
+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+    _as_can_reexec=no; export _as_can_reexec;
+    # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+  fi
+  # We don't want this to propagate to other subprocesses.
+          { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+        /*)
+          for as_base in sh bash ksh sh5; do
+            # Try only shells that exist, to save several forks.
+            as_shell=$as_dir/$as_base
+            if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+                   { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+                  if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+          done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+             { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  export CONFIG_SHELL
+             # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+  *v*x* | *x*v* ) as_opts=-vx ;;
+  *v* ) as_opts=-v ;;
+  *x* ) as_opts=-x ;;
+  * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf@gnu.org and anakin@pobox.com
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+  # already done that, so ensure we don't try to do so again and fall
+  # in an infinite loop.  This has already happened in practice.
+  _as_can_reexec=no; export _as_can_reexec
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='puzzles'
+PACKAGE_TARNAME='puzzles'
+PACKAGE_VERSION='20161228.7cae89f'
+PACKAGE_STRING='puzzles 20161228.7cae89f'
+PACKAGE_BUGREPORT='anakin@pobox.com'
+PACKAGE_URL=''
+
+ac_unique_file="midend.c"
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+RANLIB
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+GTK_LIBS
+GTK_CFLAGS
+PKG_CONFIG
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+runstatedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_silent_rules
+enable_dependency_tracking
+with_gtk
+enable_gtktest
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+PKG_CONFIG
+PKG_CONFIG_PATH
+PKG_CONFIG_LIBDIR'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+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=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -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_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$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 ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$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 | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$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 ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    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 | -n)
+    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 ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
+  -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_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+        ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=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 ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir runstatedir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# 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 the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_myself" : 'X\(//\)[^/]' \| \
+        X"$as_myself" : 'X\(//\)$' \| \
+        X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  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
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # 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 <<_ACEOF
+\`configure' configures puzzles 20161228.7cae89f to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/puzzles]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --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
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of puzzles 20161228.7cae89f:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-silent-rules   less verbose build output (undo: "make V=1")
+  --disable-silent-rules  verbose build output (undo: "make V=0")
+  --enable-dependency-tracking
+                          do not reject slow dependency extractors
+  --disable-dependency-tracking
+                          speeds up one-time build
+  --disable-gtktest       do not try to compile and run a test GTK+ program
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-gtk=VER          specify GTK version to use (`2' or `3')
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  PKG_CONFIG  path to pkg-config utility
+  PKG_CONFIG_PATH
+              directories to add to pkg-config's search path
+  PKG_CONFIG_LIBDIR
+              path overriding pkg-config's built-in search path
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <anakin@pobox.com>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+puzzles configure 20161228.7cae89f
+generated by GNU Autoconf 2.69
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+        test "$cross_compiling" = yes ||
+        test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by puzzles $as_me 20161228.7cae89f, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       $as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       # differences in whitespace do not lead to failure.
+       ac_old_val_w=`echo x $ac_old_val`
+       ac_new_val_w=`echo x $ac_new_val`
+       if test "$ac_old_val_w" != "$ac_new_val_w"; then
+         { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+         ac_cache_corrupted=:
+       else
+         { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+         eval $ac_var=\$ac_old_val
+       fi
+       { $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+       { $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+am__api_version='1.15'
+
+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
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+# 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
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# 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"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /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
+      for ac_exec_ext in '' $ac_executable_extensions; do
+       if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+         if test $ac_prog = install &&
+           grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         elif test $ac_prog = install &&
+           grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
+         else
+           rm -rf conftest.one conftest.two conftest.dir
+           echo one > conftest.one
+           echo two > conftest.two
+           mkdir conftest.dir
+           if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+             test -s conftest.one && test -s conftest.two &&
+             test -s conftest.dir/conftest.one &&
+             test -s conftest.dir/conftest.two
+           then
+             ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+             break 3
+           fi
+         fi
+       fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+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.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&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}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \    ]*)
+    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   am_has_slept=no
+   for am_try in 1 2; do
+     echo "timestamp, slept: $am_has_slept" > conftest.file
+     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+     if test "$*" = "X"; then
+       # -L didn't work.
+       set X `ls -t "$srcdir/configure" conftest.file`
+     fi
+     if test "$*" != "X $srcdir/configure conftest.file" \
+       && test "$*" != "X conftest.file $srcdir/configure"; then
+
+       # If neither matched, then we have a broken ls.  This can happen
+       # if, for instance, CONFIG_SHELL is bash and it inherits a
+       # broken ls alias from the environment.  This has actually
+       # happened.  Such a system could not be considered "sane".
+       as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+  alias in your environment" "$LINENO" 5
+     fi
+     if test "$2" = conftest.file || test $am_try -eq 2; then
+       break
+     fi
+     # Just in case.
+     sleep 1
+     am_has_slept=yes
+   done
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+  ( sleep 1 ) &
+  am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+  am_missing_run="$MISSING "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\    *)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip".  However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+        for ac_exec_ext in '' $ac_executable_extensions; do
+          as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
+          case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+            'mkdir (GNU coreutils) '* | \
+            'mkdir (coreutils) '* | \
+            'mkdir (fileutils) '4.1*)
+              ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+              break 3;;
+          esac
+        done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test "${enable_silent_rules+set}" = set; then :
+  enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+  yes) AM_DEFAULT_VERBOSITY=0;;
+   no) AM_DEFAULT_VERBOSITY=1;;
+    *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
+if ${am_cv_make_support_nested_variables+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if $as_echo 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+       @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+  am_cv_make_support_nested_variables=yes
+else
+  am_cv_make_support_nested_variables=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+$as_echo "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+    AM_V='$(V)'
+  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+  AM_V=$AM_DEFAULT_VERBOSITY
+  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='puzzles'
+ VERSION='20161228.7cae89f'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility.  To be removed once Automake 1.9.x
+# dies out for good.  For more background, see:
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar  pax cpio none'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+  fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_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 $# != 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
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+       if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from 'make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+
+
+# Check whether --with-gtk was given.
+if test "${with_gtk+set}" = set; then :
+  withval=$with_gtk; gtk_version_desired="$withval"
+else
+  gtk_version_desired="any"
+fi
+
+
+case "$gtk_version_desired" in
+  2 | 3 | any) ;;
+  yes) gtk_version_desired="any" ;;
+  *) as_fn_error $? "Invalid GTK version specified" "$LINENO" 5
+esac
+
+gtk=none
+
+case "$gtk_version_desired:$gtk" in
+  3:none | any:none)
+
+
+
+# Check whether --enable-gtktest was given.
+if test "${enable_gtktest+set}" = set; then :
+  enableval=$enable_gtktest;
+else
+  enable_gtktest=yes
+fi
+
+  min_gtk_version=3.0.0
+
+  pkg_config_args="gtk+-3.0 >= $min_gtk_version"
+  for module in .
+  do
+      case "$module" in
+         gthread)
+             pkg_config_args="$pkg_config_args gthread-2.0"
+         ;;
+      esac
+  done
+
+  no_gtk=""
+
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no"
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+  if test x$PKG_CONFIG != xno ; then
+    if $PKG_CONFIG --atleast-pkgconfig-version 0.7 ; then
+      :
+    else
+      echo "*** pkg-config too old; version 0.7 or better required."
+      no_gtk=yes
+      PKG_CONFIG=no
+    fi
+  else
+    no_gtk=yes
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK+ - version >= $min_gtk_version" >&5
+$as_echo_n "checking for GTK+ - version >= $min_gtk_version... " >&6; }
+
+  if test x$PKG_CONFIG != xno ; then
+    ## don't try to run the test against uninstalled libtool libs
+    if $PKG_CONFIG --uninstalled $pkg_config_args; then
+         echo "Will use uninstalled version of GTK+ found in PKG_CONFIG_PATH"
+         enable_gtktest=no
+    fi
+
+    if $PKG_CONFIG $pkg_config_args; then
+         :
+    else
+         no_gtk=yes
+    fi
+  fi
+
+  if test x"$no_gtk" = x ; then
+    GTK_CFLAGS=`$PKG_CONFIG $pkg_config_args --cflags`
+    GTK_LIBS=`$PKG_CONFIG $pkg_config_args --libs`
+    gtk_config_major_version=`$PKG_CONFIG --modversion gtk+-3.0 | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
+    gtk_config_minor_version=`$PKG_CONFIG --modversion gtk+-3.0 | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
+    gtk_config_micro_version=`$PKG_CONFIG --modversion gtk+-3.0 | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
+    if test "x$enable_gtktest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $GTK_CFLAGS"
+      LIBS="$GTK_LIBS $LIBS"
+      rm -f conf.gtktest
+      if test "$cross_compiling" = yes; then :
+  echo $ac_n "cross compiling; assumed OK... $ac_c"
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+  unsigned int major, minor, micro;
+
+  fclose (fopen ("conf.gtktest", "w"));
+
+  if (sscanf("$min_gtk_version", "%u.%u.%u", &major, &minor, &micro) != 3) {
+     printf("%s, bad version string\n", "$min_gtk_version");
+     exit(1);
+   }
+
+  if ((gtk_major_version != $gtk_config_major_version) ||
+      (gtk_minor_version != $gtk_config_minor_version) ||
+      (gtk_micro_version != $gtk_config_micro_version))
+    {
+      printf("\n*** 'pkg-config --modversion gtk+-3.0' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n",
+             $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+             gtk_major_version, gtk_minor_version, gtk_micro_version);
+      printf ("*** was found! If pkg-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+      printf("*** to point to the correct configuration files\n");
+    }
+  else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+          (gtk_minor_version != GTK_MINOR_VERSION) ||
+           (gtk_micro_version != GTK_MICRO_VERSION))
+    {
+      printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+            GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+      printf("*** library (version %d.%d.%d)\n",
+            gtk_major_version, gtk_minor_version, gtk_micro_version);
+    }
+  else
+    {
+      if ((gtk_major_version > major) ||
+        ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+        ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+      {
+        return 0;
+       }
+     else
+      {
+        printf("\n*** An old version of GTK+ (%u.%u.%u) was found.\n",
+               gtk_major_version, gtk_minor_version, gtk_micro_version);
+        printf("*** You need a version of GTK+ newer than %u.%u.%u. The latest version of\n",
+              major, minor, micro);
+        printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+        printf("***\n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of GTK+, but you can also set the PKG_CONFIG environment to point to the\n");
+        printf("*** correct copy of pkg-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  no_gtk=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_gtk" = x ; then
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version)" >&5
+$as_echo "yes (version $gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version)" >&6; }
+     gtk=3
+  else
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+     if test "$PKG_CONFIG" = "no" ; then
+       echo "*** A new enough version of pkg-config was not found."
+       echo "*** See http://pkgconfig.sourceforge.net"
+     else
+       if test -f conf.gtktest ; then
+        :
+       else
+          echo "*** Could not run GTK+ test program, checking why..."
+         ac_save_CFLAGS="$CFLAGS"
+         ac_save_LIBS="$LIBS"
+          CFLAGS="$CFLAGS $GTK_CFLAGS"
+          LIBS="$LIBS $GTK_LIBS"
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+
+int
+main ()
+{
+ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version));
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+   echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding GTK+ or finding the wrong"
+          echo "*** version of GTK+. If it is not finding GTK+, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+         echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+else
+   echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means GTK+ is incorrectly installed."
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     GTK_CFLAGS=""
+     GTK_LIBS=""
+     :
+  fi
+
+
+  rm -f conf.gtktest
+
+
+    ;;
+esac
+
+case "$gtk_version_desired:$gtk" in
+  2:none | any:none)
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=0.9.0
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       else
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+               PKG_CONFIG=""
+       fi
+fi
+# Check whether --enable-gtktest was given.
+if test "${enable_gtktest+set}" = set; then :
+  enableval=$enable_gtktest;
+else
+  enable_gtktest=yes
+fi
+
+
+  pkg_config_args=gtk+-2.0
+  for module in .
+  do
+      case "$module" in
+         gthread)
+             pkg_config_args="$pkg_config_args gthread-2.0"
+         ;;
+      esac
+  done
+
+  no_gtk=""
+
+
+
+
+
+
+
+
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+       if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_PKG_CONFIG"; then
+  ac_pt_PKG_CONFIG=$PKG_CONFIG
+  # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
+if test -n "$ac_pt_PKG_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_PKG_CONFIG" = x; then
+    PKG_CONFIG=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    PKG_CONFIG=$ac_pt_PKG_CONFIG
+  fi
+else
+  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
+fi
+
+fi
+if test -n "$PKG_CONFIG"; then
+       _pkg_min_version=0.7
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
+       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       else
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+               PKG_CONFIG=""
+       fi
+fi
+
+  min_gtk_version=2.0.0
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK+ - version >= $min_gtk_version" >&5
+$as_echo_n "checking for GTK+ - version >= $min_gtk_version... " >&6; }
+
+  if test x$PKG_CONFIG != xno ; then
+    ## don't try to run the test against uninstalled libtool libs
+    if $PKG_CONFIG --uninstalled $pkg_config_args; then
+         echo "Will use uninstalled version of GTK+ found in PKG_CONFIG_PATH"
+         enable_gtktest=no
+    fi
+
+    if $PKG_CONFIG --atleast-version $min_gtk_version $pkg_config_args; then
+         :
+    else
+         no_gtk=yes
+    fi
+  fi
+
+  if test x"$no_gtk" = x ; then
+    GTK_CFLAGS=`$PKG_CONFIG $pkg_config_args --cflags`
+    GTK_LIBS=`$PKG_CONFIG $pkg_config_args --libs`
+    gtk_config_major_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
+    gtk_config_minor_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
+    gtk_config_micro_version=`$PKG_CONFIG --modversion gtk+-2.0 | \
+           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
+    if test "x$enable_gtktest" = "xyes" ; then
+      ac_save_CFLAGS="$CFLAGS"
+      ac_save_LIBS="$LIBS"
+      CFLAGS="$CFLAGS $GTK_CFLAGS"
+      LIBS="$GTK_LIBS $LIBS"
+      rm -f conf.gtktest
+      if test "$cross_compiling" = yes; then :
+  echo $ac_n "cross compiling; assumed OK... $ac_c"
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+  int major, minor, micro;
+  char *tmp_version;
+
+  fclose (fopen ("conf.gtktest", "w"));
+
+  /* HP/UX 9 (%@#!) writes to sscanf strings */
+  tmp_version = g_strdup("$min_gtk_version");
+  if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+     printf("%s, bad version string\n", "$min_gtk_version");
+     exit(1);
+   }
+
+  if ((gtk_major_version != $gtk_config_major_version) ||
+      (gtk_minor_version != $gtk_config_minor_version) ||
+      (gtk_micro_version != $gtk_config_micro_version))
+    {
+      printf("\n*** 'pkg-config --modversion gtk+-2.0' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n",
+             $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+             gtk_major_version, gtk_minor_version, gtk_micro_version);
+      printf ("*** was found! If pkg-config was correct, then it is best\n");
+      printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+      printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+      printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+      printf("*** required on your system.\n");
+      printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n");
+      printf("*** to point to the correct configuration files\n");
+    }
+  else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+          (gtk_minor_version != GTK_MINOR_VERSION) ||
+           (gtk_micro_version != GTK_MICRO_VERSION))
+    {
+      printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+            GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+      printf("*** library (version %d.%d.%d)\n",
+            gtk_major_version, gtk_minor_version, gtk_micro_version);
+    }
+  else
+    {
+      if ((gtk_major_version > major) ||
+        ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+        ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+      {
+        return 0;
+       }
+     else
+      {
+        printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n",
+               gtk_major_version, gtk_minor_version, gtk_micro_version);
+        printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n",
+              major, minor, micro);
+        printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+        printf("***\n");
+        printf("*** If you have already installed a sufficiently new version, this error\n");
+        printf("*** probably means that the wrong copy of the pkg-config shell script is\n");
+        printf("*** being found. The easiest way to fix this is to remove the old version\n");
+        printf("*** of GTK+, but you can also set the PKG_CONFIG environment to point to the\n");
+        printf("*** correct copy of pkg-config. (In this case, you will have to\n");
+        printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+        printf("*** so that the correct libraries are found at run-time))\n");
+      }
+    }
+  return 1;
+}
+
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  no_gtk=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+       CFLAGS="$ac_save_CFLAGS"
+       LIBS="$ac_save_LIBS"
+     fi
+  fi
+  if test "x$no_gtk" = x ; then
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version)" >&5
+$as_echo "yes (version $gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version)" >&6; }
+     gtk=2
+  else
+     { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+     if test "$PKG_CONFIG" = "no" ; then
+       echo "*** A new enough version of pkg-config was not found."
+       echo "*** See http://pkgconfig.sourceforge.net"
+     else
+       if test -f conf.gtktest ; then
+        :
+       else
+          echo "*** Could not run GTK+ test program, checking why..."
+         ac_save_CFLAGS="$CFLAGS"
+         ac_save_LIBS="$LIBS"
+          CFLAGS="$CFLAGS $GTK_CFLAGS"
+          LIBS="$LIBS $GTK_LIBS"
+          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+
+int
+main ()
+{
+ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version));
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+   echo "*** The test program compiled, but did not run. This usually means"
+          echo "*** that the run-time linker is not finding GTK+ or finding the wrong"
+          echo "*** version of GTK+. If it is not finding GTK+, you'll need to set your"
+          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
+          echo "*** is required on your system"
+         echo "***"
+          echo "*** If you have an old version installed, it is best to remove it, although"
+          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+else
+   echo "*** The test program failed to compile or link. See the file config.log for the"
+          echo "*** exact error that occured. This usually means GTK+ is incorrectly installed."
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+          CFLAGS="$ac_save_CFLAGS"
+          LIBS="$ac_save_LIBS"
+       fi
+     fi
+     GTK_CFLAGS=""
+     GTK_LIBS=""
+     :
+  fi
+
+
+  rm -f conf.gtktest
+
+
+    ;;
+esac
+
+if test "$gtk" = "none"; then
+   as_fn_error $? "cannot build without GTK 2 or GTK 3" "$LINENO" 5
+fi
+
+if test "x$GCC" = "xyes"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for usable gcc warning flags" >&5
+$as_echo_n "checking for usable gcc warning flags... " >&6; }
+  gccwarningflags=
+  for flag in -Wall -Werror -std=c89 ; do
+    ac_save_CFLAGS="$CFLAGS"
+    ac_save_LIBS="$LIBS"
+    CFLAGS="$CFLAGS$gccwarningflags $flag $GTK_CFLAGS"
+    LIBS="$GTK_LIBS $LIBS"
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+        #include <stdio.h>
+        #include <assert.h>
+        #include <stdlib.h>
+        #include <time.h>
+        #include <stdarg.h>
+        #include <string.h>
+        #include <errno.h>
+        #include <math.h>
+
+        #include <sys/time.h>
+        #include <sys/resource.h>
+
+        #include <gtk/gtk.h>
+        #include <gdk/gdkkeysyms.h>
+
+        #include <gdk-pixbuf/gdk-pixbuf.h>
+
+        #include <gdk/gdkx.h>
+        #include <X11/Xlib.h>
+        #include <X11/Xutil.h>
+        #include <X11/Xatom.h>
+
+int
+main ()
+{
+
+        return 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  gccwarningflags="$gccwarningflags $flag"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    CFLAGS="$ac_save_CFLAGS"
+    LIBS="$ac_save_LIBS"
+  done
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gccwarningflags" >&5
+$as_echo "$gccwarningflags" >&6; }
+  CFLAGS="$CFLAGS$gccwarningflags"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+ac_config_files="$ac_config_files Makefile"
+
+cat >confcache <<\_ACEOF
+# 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, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# 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.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+       cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+         mv -f confcache "$cache_file"$$ &&
+         mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+         mv -f confcache "$cache_file" ;;
+       esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section.  Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[    ]*#[    ]*define[       ][      ]*\([^  (][^    (]*([^)]*)\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[    ]*#[    ]*define[       ][      ]*\([^  ][^     ]*\)[   ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[     `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+       g
+       s/^\n//
+       s/\n/ /g
+       p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+$as_echo_n "checking that generated files are newer than configure... " >&6; }
+   if test -n "$am_sleep_pid"; then
+     # Hide warnings about reused PIDs.
+     wait $am_sleep_pid 2>/dev/null
+   fi
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
+$as_echo "done" >&6; }
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+       expr "X$arg" : "X\\(.*\\)$as_nl";
+       arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='        ';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -pR'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -pR'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -pR'
+  fi
+else
+  as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+  test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by puzzles $as_me 20161228.7cae89f, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Configuration commands:
+$config_commands
+
+Report bugs to <anakin@pobox.com>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+puzzles config.status 20161228.7cae89f
+configured by $0, generated by GNU Autoconf 2.69,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2012 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h |  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = "\a"
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=[    ]*/{
+h
+s///
+s/^/:/
+s/[     ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[  ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X "  :F $CONFIG_FILES      :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+         $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+       `' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Older Autoconf quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named 'Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$mf" : 'X\(//\)[^/]' \| \
+        X"$mf" : 'X\(//\)$' \| \
+        X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running 'make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "$am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+        sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$file" : 'X\(//\)[^/]' \| \
+        X"$file" : 'X\(//\)$' \| \
+        X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
index 3a38c956028d2cb794fc9c9e17647e7d947ad801..486beb1a906a9bd2949ce9e62132333cad2b57da 100644 (file)
@@ -1,6 +1,6 @@
 dnl Configure script for the Unix GTK build of puzzles.
 
-AC_INIT([puzzles], [6.66], [anakin@pobox.com])
+AC_INIT([puzzles], [20161228.7cae89f], [anakin@pobox.com])
 AC_CONFIG_SRCDIR([midend.c])
 AM_INIT_AUTOMAKE([foreign])
 AC_PROG_CC
@@ -42,7 +42,7 @@ fi
 if test "x$GCC" = "xyes"; then
   AC_MSG_CHECKING([for usable gcc warning flags])
   gccwarningflags=
-  for flag in -Wall -Werror -std=c89 -pedantic; do
+  for flag in -Wall -Werror -std=c89 ; do
     ac_save_CFLAGS="$CFLAGS"
     ac_save_LIBS="$LIBS"
     CFLAGS="$CFLAGS$gccwarningflags $flag $GTK_CFLAGS"
diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644 (file)
index 0000000..8928da7
--- /dev/null
@@ -0,0 +1,58 @@
+Configuration of sgt-puzzles
+============================
+
+Simon Tatham writes in the main documentation:
+
+   "The games in this collection deliberately do not ever save
+    information on to the computer they run on: they have no high score
+    tables and no saved preferences. (This is because I expect at least
+    some people to play them at work, and those people will probably
+    appreciate leaving as little evidence as possible!)"
+
+Currently, various settings are configurable through environment
+variables.  These may be replaced by a better configuration mechanism
+in future, and I cannot guarantee that they will continue to work.
+
+Colours
+-------
+
+The colours used by any game can be set using variables of the form:
+
+    <game>_COLOUR_<number>=<red><green><blue>
+
+<game> is the name of the game in capitals, without any "game" suffix.
+<number> identifies the game element that the colour applies to.
+<red>, <green> and <blue> are the levels of these colour components
+as 2 hexadecimal digits each (as used in HTML and CSS).
+
+In particular, the colours used for regions in the Map game can be
+changed using the variables MAP_COLOUR_2, MAP_COLOUR_3, MAP_COLOUR_4
+and MAP_COLOUR_5.  The following colour settings appear to make the
+regions more easily distinguishable for those with red-green colour
+blindness, and may also work for monochromats:
+
+    MAP_COLOUR_2=B27F3F
+    MAP_COLOUR_3=CCB27F
+    MAP_COLOUR_4=7F99BF
+    MAP_COLOUR_5=8C727F
+
+Size
+----
+
+All puzzles are made up of a number of square tiles.  For example, a
+"3x3" Solo puzzle has 9x9 tiles.  The size of the tiles can be changed
+by resizing the window.  The initial size can be set using a variable
+of the form:
+
+    <game>_TILESIZE=<size>
+
+<game> is the name of the game in capitals, without any "game" suffix.
+<size> is the number of pixels on each side of a tile.
+
+Miscellaneous
+-------------
+
+The behaviour of the left and right mouse buttons in Slant can be
+reversed by setting the variable SLANT_SWAP_BUTTONS=y.
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Sun, 29 Oct 2006 02:09:28 +0000
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..d6bd8e9
--- /dev/null
@@ -0,0 +1,470 @@
+sgt-puzzles (20170923.ff218728-0+iwj2~2.gbpdf5ca6) UNRELEASED; urgency=medium
+
+  ** SNAPSHOT build @df5ca635dd81dfd89b40998cb9c8b14614739670 **
+
+  [ Simon Tatham ]
+  * Avoid macro-generating a trailing comma in an enum.
+
+  [ Ian Jackson ]
+  * draw_thick_line: Bound thickness by 1.0 below
+  * tracks: Scale thickness of "no track here" crosses
+  * tracks: Roughly double the thickness of the "no track" crosses
+  * RFH: tracks: Grid line width problems
+  * draw_thick_line: Bound thickness by 1.0 below
+  * tracks: Scale thickness of "no track here" crosses
+  * tracks: Roughly double the thickness of the "no track" crosses
+
+  [ Simon Tatham ]
+  * Fix a typo in devel.but.
+  * tracks: thicken the lines of the grid itself.
+  * Net: reference-count the barriers array.
+
+  [ Ian Jackson ]
+  * Revert "RFH: tracks: Grid line width problems"
+  * tracks.c: draw_clue: Introduce bg parameter
+  * tracks: Greyscale colour initialisation: line up columns
+  * tracks: Make error clue background white
+  * midend: Allow "new game" to be undone
+
+ -- Ian Jackson <ian@zealot.relativity.greenend.org.uk>  Sat, 30 Sep 2017 19:43:44 +0100
+
+sgt-puzzles (20170923.ff218728-0+iwj1) unstable; urgency=medium
+
+  * merge from upstream
+  * remove -pedantic
+  * revert dependency on newer halibut
+
+ -- Ian Jackson <ijackson@chiark.greenend.org.uk>  Sun, 24 Sep 2017 14:42:38 +0100
+
+sgt-puzzles (20161228.7cae89f-1+iwj) unstable; urgency=medium
+
+  * rebuild for jessie
+
+ -- Ian Jackson <ijackson@chiark.greenend.org.uk>  Sun, 24 Sep 2017 14:06:19 +0100
+
+sgt-puzzles (20161228.7cae89f-1) unstable; urgency=medium
+
+  * New upstream version
+  * debian/rules: Generate menu file automatically, fixing the omission
+    of Undead and Unruly (Closes: #832797)
+  * Use debhelper compatibility level 9
+  * debian/control: Update Standards-Version to 3.9.8; no changes needed
+  * Build with Gtk+ 3
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Tue, 17 Jan 2017 23:57:33 +0000
+
+sgt-puzzles (20160429.b31155b-1) unstable; urgency=medium
+
+  * New upstream version (Closes: #791982)
+    - Add Flood, a flood-filling puzzle
+    - Add Palisade by Jonas Kölker, an implementation of 'Five Cells'
+    - Add Tracks by James Harvey, a path-finding railway track puzzle
+  * debian/control: Change Vcs-Git and Vcs-Browser to HTTP-S URLs
+  * Fix HTML filenames for Rectangles (Closes: #819906)
+  * debian/rules: Use dpkg makefile fragments to set DEBIAN_VERSION
+  * debian/rules: Use dpkg-recommended build flags (Closes: #767531)
+  * Remove command aliases without the 'sgt-' prefix (Closes: #684193)
+  * towers.c: Fix FTBFS with gcc 6 (Closes: #811577)
+  * debian/rules: Disable running tests; upstream tarballs don't include the
+    necessary files
+  * Add desktop files and Debian menu entries for the new puzzles
+  * mkmanpages.pl: Fix regexp syntax warnings
+  * mkmanpages.pl: Update for new version format
+  * Change help browser search path to xdg-open:sensible-browser, since yelp
+    and khelpcenter no longer work with arbitrary HTML files
+  * Use msgmerge --previous option when updating .po files, thanks to
+    Helge Kreutzmann
+  * Update German translation, thanks to Helge Kreutzmann
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Wed, 20 Jul 2016 01:34:44 +0100
+
+sgt-puzzles (20140928.r10274-1) unstable; urgency=medium
+
+  * New upstream version
+    - Version scheme is now date-based
+    - Fix a failure to warn about non-unique rows/columns in non-square Unruly
+      grids (Closes: #718354)
+  * Add Debian menu entries for Range and Signpost
+  * debian/watch: Delete, as new versions are date-based and there is
+    currently no obvious way to find the last date changed
+  * Disable 304_combine-binaries.diff which no longer applies
+  * Build using autotools
+    - Drop patches 301_fix-install-dirs.diff, 305_no-werror.diff
+  * Exclude puzzles.chm from orig tarball because it requires non-free tools
+    to regenerate from source
+  * Update policy version to 3.9.6; no changes required
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Wed, 01 Oct 2014 22:10:50 +0100
+
+sgt-puzzles (9872-1) unstable; urgency=low
+
+  * New upstream version
+    - Add an explicit -lm to the link lines in Makefile.gtk (Closes: #713476)
+    - Add Undead by Steffen Bauer, an implementation of 'Haunted Mirror Maze'
+    - Add Unruly by Lennard Sprong, an implementation of a puzzle usually
+      called 'Tohu wa Vohu'
+  * Add DEP-3 headers to patches
+  * pearl: Require width or height to be at least 6 for Tricky
+    (Closes: #667963)
+  * debian/watch: Update ViewVC URL regex
+  * Add 'sgt-' prefix to all command names and remove 'game' suffix, but
+    retain symlinks under the old names (see #684193)
+  * Use upstream short descriptions in English manual pages and package
+    description
+  * Update German translation, thanks to Helge Kreutzmann
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Sun, 30 Jun 2013 03:20:16 +0100
+
+sgt-puzzles (9411-1) unstable; urgency=low
+
+  * New upstream version - closes: #666709
+    - Adds Pearl puzzle
+  * Update German translation, thanks to Helge Kreutzmann
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Sat, 07 Apr 2012 02:38:40 +0100
+
+sgt-puzzles (9306-1) unstable; urgency=low
+
+  * New upstream version
+  * Update German translation, thanks to Helge Kreutzmann
+  * Update policy version to 3.9.2; no changes required
+  * Update description to include the puzzles added in 8853-1 and 9109-1
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Mon, 12 Dec 2011 02:40:18 +0000
+
+sgt-puzzles (9179-1) unstable; urgency=low
+
+  * New upstream version:
+    - Remove unused-but-set variables - closes: #625425
+    - Avoid infinite loop in Loopy at Easy level
+    - Add Penrose tilings to Loopy
+  * Update German translation, thanks to Helge Kreutzmann
+  * Do not compile with -Werror
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Mon, 11 Jul 2011 03:56:55 +0100
+
+sgt-puzzles (9109-1) unstable; urgency=low
+
+  * New upstream version:
+    - Add Range and Signpost puzzles
+    - Use stock icons and conventional order for dialog buttons
+    - Use Cairo for screen rendering
+  * Update German translation, thanks to Helge Kreutzmann
+  * Remove or update patches applied or partially applied upstream
+  * Use Debian source format 3.0 (quilt)
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Tue, 01 Mar 2011 04:16:54 +0000
+
+sgt-puzzles (8853-3) unstable; urgency=low
+
+  * Update German translation, thanks to Helge Kreutzmann
+  * Fix reference to puzzles.txt at the bottom of manual pages
+  * Remove obsolete patch 102_fix-bridges-min-sensible-islands.diff
+  * Flag 5 / 2 = 2 as an error in Keen - closes: #581445
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Sun, 08 Aug 2010 23:34:32 +0100
+
+sgt-puzzles (8853-2) unstable; urgency=low
+
+  * Correct minor documentation errors, thanks to Helge Kreutzmann
+    - closes: #571975
+  * Document Helge Kreutzmann's copyright - closes: #571976
+  * Document my copyright
+  * Update German translation, thanks to Helge Kreutzmann
+  * Fix minor issues reported by lintian:
+    - Add ${misc:Depends} to dependencies
+    - Add debian/source/format file
+    - Use debhelper 7
+  * Update policy version to 3.8.4; no changes required
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Sun, 04 Apr 2010 16:15:16 +0100
+
+sgt-puzzles (8853-1) unstable; urgency=low
+
+  * New upstream version - closes: #569901
+  * Update German translation, thanks to Helge Kreutzmann
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Sat, 20 Feb 2010 21:41:07 +0000
+
+sgt-puzzles (8786-1) unstable; urgency=low
+
+  * New upstream version
+    - Correct minor documentation errors - closes: #522439, #548472
+  * Update German translation, thanks to Helge Kreutzmann
+  * Correct minor documentation errors, thanks to Helge Kreutzmann
+    - closes: #554341
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Mon, 15 Feb 2010 14:33:45 +0000
+
+sgt-puzzles (8692-1) unstable; urgency=low
+
+  * New upstream version
+  * Add German descriptions to desktop files, thanks to Helge Kreutzmann
+  * Update debian/watch file
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Mon, 02 Nov 2009 01:34:59 +0000
+
+sgt-puzzles (8605-2) unstable; urgency=low
+
+  * Apply fixes from Ubuntu - closes: #543527
+    - Fix typo in French description of netslide, thanks to Didier Roche
+  * Shade filled squares in Slant - closes: #419836
+  * Update German translation, thanks to Helge Kreutzmann
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Wed, 30 Sep 2009 22:54:12 +0100
+
+sgt-puzzles (8605-1) unstable; urgency=low
+
+  * New upstream release
+  * Force use of bash in debian/rules - closes: #535418
+  * Update German translation, thanks to Helge Kreutzmann
+  * Fix generation of translated manual pages - closes: #528042 (again)
+    - Do not require the associated locale to be installed at build time
+    - Tell Halibut that the input and output files are UTF-8-encoded
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Sun, 16 Aug 2009 19:26:56 +0100
+
+sgt-puzzles (8541-2) unstable; urgency=low
+
+  * Update German translation, thanks to Helge Kreutzmann
+  * Install translated online help and manual pages - closes: #528042
+  * Use g_spawn_async() to run help browser
+    - Avoids zombie processes - closes LP: #385149
+    - Avoids showing an error box in the child process, which would
+      cause the parent to abort
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Sat, 13 Jun 2009 04:37:18 +0100
+
+sgt-puzzles (8541-1) unstable; urgency=low
+
+  * New upstream release
+  * Add partial German translation of documentation - closes: #522438
+  * Fix command in netslide desktop file - closes LP: #272942
+  * Update policy version to 3.8.1; no changes required
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Tue, 05 May 2009 00:26:46 +0100
+
+sgt-puzzles (8446-1) unstable; urgency=low
+
+  * New upstream release
+    - Obsoletes patches 101, 103, 204
+    - Adds test for fwrite() failure - closes: #505157
+    - Fixes bug in the Light Up solver
+    - Adds keyboard control to many puzzles - closes: #417547
+  * Remove obsolete patch to Unequal hit detection - closes: #501197
+  * Update policy version to 3.8.0:
+    - Add README.source
+  * Add Vcs-* fields for my public repository
+  * Add support for translation of the documentation - closes: #483665
+  * Fix gcc 4.4 warnings - closes: #505359
+    - Add 106_fix-uninit-warning.diff
+    - Other warning fixed upstream
+  * Add .desktop files, thanks to Didier Roche - closes: #495561
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Mon, 16 Feb 2009 01:03:44 +0000
+
+sgt-puzzles (7983-1) unstable; urgency=low
+
+  * New upstream release
+  * Moved common code into a private shared library, halving package
+    size and installed size
+  * Implemented highlighting of more kinds of error in Loopy
+  * Changed encoding of copyright file to UTF-8
+  * Updated standards-version to 3.7.3 (no other changes required)
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Sun, 13 Apr 2008 17:39:38 +0100
+
+sgt-puzzles (7703-1) unstable; urgency=low
+
+  * New upstream release
+  * Moved changes into patches applied with quilt
+  * Removed dependency of online help on GNOME - closes: #429864, #437962
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Sat,  6 Oct 2007 23:36:20 +0100
+
+sgt-puzzles (7636-1) unstable; urgency=low
+
+  * New upstream release
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Sun,  8 Jul 2007 01:36:53 +0100
+
+sgt-puzzles (7446-1) unstable; urgency=low
+
+  * New upstream release - closes: #417543
+  * Corrected minimum number of islands for Bridges - closes: #417541
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Tue, 24 Apr 2007 21:31:11 +0100
+
+sgt-puzzles (7407-1) unstable; urgency=low
+
+  * New upstream release adds Filling, Galaxies and Unequal puzzles
+    - closes: #416009
+  * Reverted to default version of gcc since bug #380541 has been fixed
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Tue, 27 Mar 2007 01:30:20 +0100
+
+sgt-puzzles (6879-1) unstable; urgency=low
+
+  * New upstream release
+  * Changed window sizing to remember tile size when the puzzle type
+    is changed - closes: #379452
+  * Documented configuration variables - closes: #375055
+  * Changed compiler to gcc-3.3 - closes: #391273
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Sun, 29 Oct 2006 02:38:36 +0000
+
+sgt-puzzles (6844-2) unstable; urgency=low
+
+  * Added compiler version dependency since gcc-4.0 is no longer in
+    build-essential and previous version FTBFS in many places
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Wed,  6 Sep 2006 14:42:53 +0100
+
+sgt-puzzles (6844-1) unstable; urgency=low
+
+  * New upstream release
+  * Added recommendation of yelp
+  * Changed to build with gcc-4.0 - closes: #380455
+  * Added missing .R files from upstream svn
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Tue,  5 Sep 2006 23:44:13 +0100
+
+sgt-puzzles (6739-1) unstable; urgency=low
+
+  * New upstream release
+  * Moved help files under /usr/share/sgt-puzzles - closes: #379876
+  * Changed help invocation and added sym-link to work around help search
+    path changes in libgnome - closes: #379527
+  * Added error checking and reporting to help invocation
+  * Updated maintainer address
+
+ -- Ben Hutchings <ben@decadent.org.uk>  Sat, 24 Jun 2006 01:21:49 +0100
+
+sgt-puzzles (6616-1) unstable; urgency=low
+
+  * New upstream version
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Wed, 22 Mar 2006 23:53:09 +0000
+
+sgt-puzzles (6526-1) unstable; urgency=low
+
+  * New upstream version
+  * Fixed clearing of window area - closes: #345024
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Sun, 22 Jan 2006 12:30:00 +0000
+
+sgt-puzzles (6452-5) unstable; urgency=low
+
+  * Yet another attempt to fix intermittent manual page build failures
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Wed, 07 Dec 2005 02:07:34 +0000
+
+sgt-puzzles (6452-4) unstable; urgency=low
+
+  * Another attempt to fix intermittent manual page build failures
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Fri, 02 Dec 2005 00:54:52 +0000
+
+sgt-puzzles (6452-3) unstable; urgency=low
+
+  * Attempt to fix intermittent manual page build failures (bug #339407)
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Wed, 23 Nov 2005 02:31:26 +0000
+
+sgt-puzzles (6452-2) unstable; urgency=low
+
+  * Minor changes to package building
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Sun, 13 Nov 2005 16:23:36 +0000
+
+sgt-puzzles (6452-1) unstable; urgency=low
+
+  * New upstream version fixes bug in Bridges puzzle
+  * Enabled window resizing, closes #337802
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Fri, 11 Nov 2005 23:21:03 +0000
+
+sgt-puzzles (6444-1) unstable; urgency=low
+
+  * New upstream version adds Bridges and Tents puzzles, closes #335627
+  * Updated command-line synopses in manual pages
+  * Reorganised list of puzzles in package description
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Sun, 06 Nov 2005 01:33:31 +0000
+
+sgt-puzzles (6378-1) unstable; urgency=low
+
+  * New upstream version
+  * Include loopy puzzle
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Sun, 09 Oct 2005 15:37:26 +0100
+
+sgt-puzzles (6229-2) unstable; urgency=low
+
+  * Add online help to the Help menu
+  * Change Copy command to use the clipboard not the primary selection
+  * Make menu accelerators visible
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Tue, 13 Sep 2005 09:01:28 +0100
+
+sgt-puzzles (6229-1) unstable; urgency=low
+
+  * New upstream version, closes #323683
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Mon, 29 Aug 2005 00:45:24 +0100
+
+sgt-puzzles (6169-1) unstable; urgency=low
+
+  * New upstream version
+  * Improve generation of cross-references in manual pages
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Sat, 06 Aug 2005 23:49:58 +0100
+
+sgt-puzzles (6119-1) unstable; urgency=low
+
+  * New upstream version
+  * Change manual page generation to use upstream documentation as source
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Wed, 20 Jul 2005 09:09:10 +0100
+
+sgt-puzzles (6085-2) unstable; urgency=low
+
+  * Fix warning from gcc 4.0 treated as error
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Mon, 11 Jul 2005 22:30:52 +0300
+
+sgt-puzzles (6085-1) unstable; urgency=low
+
+  * New upstream version
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Sun, 10 Jul 2005 17:07:15 +0300
+
+sgt-puzzles (6039-1) unstable; urgency=low
+
+  * New upstream version
+  * Removed mistaken dependency on menu
+  * Appended 'game' to names of 'flip' and 'net' to avoid confusion with programs
+    of the same name in /usr/bin
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Fri, 01 Jul 2005 00:56:01 +0100
+
+sgt-puzzles (6009-1) unstable; urgency=low
+
+  * New upstream version
+  * Added dependency on menu
+  * Fixed potential for breakage in build rules
+  * Minor style fixes
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Sat, 25 Jun 2005 01:20:47 +0100
+
+sgt-puzzles (5982-2) unstable; urgency=low
+
+  * Add menu entries
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Fri, 24 Jun 2005 23:57:54 +0100
+
+sgt-puzzles (5982-1) unstable; urgency=low
+
+  * Initial upload, closes: #309175
+
+ -- Ben Hutchings <ben@decadentplace.org.uk>  Fri, 24 Jun 2005 03:53:02 +0100
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..ec63514
--- /dev/null
@@ -0,0 +1 @@
+9
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..3d23a33
--- /dev/null
@@ -0,0 +1,54 @@
+Source: sgt-puzzles
+Maintainer: Ben Hutchings <ben@decadent.org.uk>
+Section: games
+Priority: extra
+Build-Depends: debhelper (>= 9), halibut, libgtk-3-dev, liblocale-po-perl, perl, po4a, autoconf, automake
+Standards-Version: 3.9.8
+Homepage: http://www.chiark.greenend.org.uk/~sgtatham/puzzles/
+Vcs-Git: https://git.decadent.org.uk/git/sgt-puzzles.git/
+Vcs-Browser: https://git.decadent.org.uk/gitweb?p=sgt-puzzles.git
+
+Package: sgt-puzzles
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Recommends: yelp | khelpcenter | www-browser
+Description: Simon Tatham's Portable Puzzle Collection - 1-player puzzle games
+ Simon Tatham's Portable Puzzle Collection contains a number of popular
+ puzzle games for one player.  It currently consists of these games:
+ .
+  * Black Box, ball-finding puzzle
+  * Bridges, bridge-placing puzzle
+  * Cube, rolling cube puzzle
+  * Dominosa, domino tiling puzzle
+  * Fifteen, sliding block puzzle
+  * Filling, polyomino puzzle
+  * Flip, tile inversion puzzle
+  * Galaxies, symmetric polyomino puzzle
+  * Guess, combination-guessing puzzle
+  * Inertia, gem-collecting puzzle
+  * Keen, arithmetic Latin square puzzle
+  * Light Up, light-bulb placing puzzle
+  * Loopy, loop-drawing puzzle
+  * Magnets, magnet-placing puzzle
+  * Map, map-colouring puzzle
+  * Mines, mine-finding puzzle
+  * Net, network jigsaw puzzle
+  * Netslide, toroidal sliding network puzzle
+  * Pattern
+  * Pearl, loop-drawing puzzle
+  * Pegs, peg solitaire puzzle
+  * Range, visible-distance puzzle
+  * Rectangles
+  * Same Game, block-clearing puzzle
+  * Signpost, square-connecting puzzle
+  * Singles, number-removing puzzle
+  * Sixteen, toroidal sliding block puzzle
+  * Slant, maze-drawing puzzle
+  * Solo, number placement puzzle
+  * Tents, tent-placing puzzle
+  * Towers, tower-placing Latin square puzzle
+  * Twiddle, rotational sliding block puzzle
+  * Undead, monster-placing puzzle
+  * Unequal, Latin square puzzle
+  * Unruly, black and white grid puzzle
+  * Untangle, planar graph layout puzzle
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..1e88459
--- /dev/null
@@ -0,0 +1,40 @@
+This is the Debian-packaged version of Simon Tatham's Portable Puzzle
+Collection.
+
+The package was put together by Ben Hutchings <ben@decadent.org.uk>
+using source from:
+
+  http://www.chiark.greenend.org.uk/~sgtatham/puzzles/puzzles.tar.gz
+
+The file 'puzzles.chm' has been excluded from the Debian 'orig'
+tarball because it requires non-free tools to regenerate from source.
+
+This software is copyright (c) 2004-2014 Simon Tatham.
+
+Portions copyright Richard Boulton, James Harvey, Mike Pinna, Jonas
+Kölker, Dariusz Olszewski, Michael Schierl, Lambros Lambrou and
+Bernd Schmidt.
+
+The German translation is copyright 2009-2014 Helge Kreutzmann.
+
+The Debian packaging is copyright 2005-2014 Ben Hutchings.
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation files
+(the "Software"), to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of the Software,
+and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/debian/desktop/sgt-blackbox.desktop b/debian/desktop/sgt-blackbox.desktop
new file mode 100644 (file)
index 0000000..65223f0
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-blackbox
+Icon=sgt-blackbox
+Type=Application
+Categories=Game;LogicGame;
+Name=Black Box
+Comment=Deduce the positions of the balls by firing lasers
+Comment[fr]=Déduire la position des balles en tirant un laser
+Comment[de]=Leite die Positionen von Bällen durch Feuern von Lasern her
diff --git a/debian/desktop/sgt-bridges.desktop b/debian/desktop/sgt-bridges.desktop
new file mode 100644 (file)
index 0000000..9c2b290
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-bridges
+Icon=sgt-bridges
+Type=Application
+Categories=Game;LogicGame;
+Name=Bridges
+Comment=Connect the islands together with bridges
+Comment[fr]=Relier des Ã®les ensembles suivant certaines règles
+Comment[de]=Verbinde die Inseln durch Brücken
diff --git a/debian/desktop/sgt-cube.desktop b/debian/desktop/sgt-cube.desktop
new file mode 100644 (file)
index 0000000..fd50807
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-cube
+Icon=sgt-cube
+Type=Application
+Categories=Game;LogicGame;
+Name=Cube
+Comment=Get all six blue squares on to the six faces of the cube at the same time
+Comment[fr]=Essayer d'obtenir simultanément six carrés bleus sur les six faces du cube
+Comment[de]=Bekomme alle sechs blauen Quadrate gleichzeitig auf die sechs Seiten des Würfels
diff --git a/debian/desktop/sgt-dominosa.desktop b/debian/desktop/sgt-dominosa.desktop
new file mode 100644 (file)
index 0000000..ed900da
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-dominosa
+Icon=sgt-dominosa
+Type=Application
+Categories=Game;LogicGame;
+Name=Dominosa
+Comment=Reconstruct the pattern by arranging the set of dominoes to match the provided array of numbers
+Comment[fr]=Essayer de réobtenir le modèle de base en arrangeant les dominos présents
+Comment[de]=Stelle das Musters durch Anordnung von Dominos zur Ãœbereinstimmung mit einem vorgegebenen Zahlengitter wieder her
diff --git a/debian/desktop/sgt-fifteen.desktop b/debian/desktop/sgt-fifteen.desktop
new file mode 100644 (file)
index 0000000..1b0e175
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-fifteen
+Icon=sgt-fifteen
+Type=Application
+Categories=Game;LogicGame;
+Name=Fifteen
+Comment=Try to end up with the tiles in numerical order, with the space in the bottom right
+Comment[fr]=Essayer de tout remettre dans le bon ordre numérique, avec l'espace en bas Ã  droite
+Comment[de]=Versuch, die Spielsteine in numerische Reihenfolge und einem Leerraum unten rechts anzuordnen
diff --git a/debian/desktop/sgt-filling.desktop b/debian/desktop/sgt-filling.desktop
new file mode 100644 (file)
index 0000000..2fc10dd
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-filling
+Icon=sgt-filling
+Type=Application
+Categories=Game;LogicGame;
+Name=Filling
+Comment=Fill in digits so that each connected region of squares containing the same digit has an area equal to that digit
+Comment[fr]=Ajouter des chiffres de telles sortes que chaque section carré contienne le même nombre de digit que le chiffre représenté
+Comment[de]=Füge Ziffern ein, so dass jede zusammenhängende Region von Quadraten mit der gleichen Ziffer Ã¼ber ein mit der Ziffer Ã¼bereinstimmendes Gebiet verfügt
diff --git a/debian/desktop/sgt-flip.desktop b/debian/desktop/sgt-flip.desktop
new file mode 100644 (file)
index 0000000..8d28399
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-flip
+Icon=sgt-flip
+Type=Application
+Categories=Game;LogicGame;
+Name=Flip
+Comment=Light all the squares up at the same time
+Comment[fr]=Illuminer simultanément tous les carrés du jeu
+Comment[de]=Erleuchte alle Quadrate gleichzeitig
diff --git a/debian/desktop/sgt-flood.desktop b/debian/desktop/sgt-flood.desktop
new file mode 100644 (file)
index 0000000..b37e1e8
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-flood
+Icon=sgt-flood
+Type=Application
+Categories=Game;LogicGame;
+Name=Flood
+Comment=Turn the grid the same colour in as few flood fills as possible
+Comment[de]=Das Gitter in eine Farbe mit so wenigen Flutungen wie möglich umwandeln
diff --git a/debian/desktop/sgt-galaxies.desktop b/debian/desktop/sgt-galaxies.desktop
new file mode 100644 (file)
index 0000000..f963ad2
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-galaxies
+Icon=sgt-galaxies
+Type=Application
+Categories=Game;LogicGame;
+Name=Galaxies
+Comment=Draw edges along the grid lines which divide the rectangle under certain rules
+Comment[fr]=Dessiner des traits sur la grille pour créer des zones rectangulaires suivant certaines règles
+Comment[de]=Zeichne Ecken entlang der Gitterlinien, die das Rechteck gemäß bestimmter Regeln teilen
diff --git a/debian/desktop/sgt-guess.desktop b/debian/desktop/sgt-guess.desktop
new file mode 100644 (file)
index 0000000..bd56abb
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-guess
+Icon=sgt-guess
+Type=Application
+Categories=Game;LogicGame;
+Name=Guess
+Comment=Game similar to the famous 'Mastermind'
+Comment[fr]=Jeu similaire au 'Mastermind'
+Comment[de]=Spiel Ã¤hnlich zum berühmten Â»Mastermind«
diff --git a/debian/desktop/sgt-inertia.desktop b/debian/desktop/sgt-inertia.desktop
new file mode 100644 (file)
index 0000000..7eb8c31
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-inertia
+Icon=sgt-inertia
+Type=Application
+Categories=Game;LogicGame;
+Name=Inertia
+Comment=Collect all the gems without running into any mines
+Comment[fr]=Collecter tous les gèmes sans toucher une seule mine
+Comment[de]=Sammle alle Edelsteine ohne in Minen zu geraten
diff --git a/debian/desktop/sgt-keen.desktop b/debian/desktop/sgt-keen.desktop
new file mode 100644 (file)
index 0000000..157a147
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-keen
+Icon=sgt-keen
+Type=Application
+Categories=Game;LogicGame;
+Name=Keen
+Comment=Game based on KenKen
+Comment[de]=Auf KenKen basierendes Puzzlespiel
diff --git a/debian/desktop/sgt-lightup.desktop b/debian/desktop/sgt-lightup.desktop
new file mode 100644 (file)
index 0000000..e13f5bf
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-lightup
+Icon=sgt-lightup
+Type=Application
+Categories=Game;LogicGame;
+Name=Light Up
+Comment=Light up all the empty squares by placing light bulbs in some of them
+Comment[fr]=Illuminer tous les carrés vides en plaçant des sources lumineuses
+Comment[de]=Erleuchte alle leeren Quadrate durch Positionieren von Lampen in einige davon
diff --git a/debian/desktop/sgt-loopy.desktop b/debian/desktop/sgt-loopy.desktop
new file mode 100644 (file)
index 0000000..835ec6a
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-loopy
+Icon=sgt-loopy
+Type=Application
+Categories=Game;LogicGame;
+Name=Loopy
+Comment=Draw lines around a digit according to the number in it
+Comment[fr]=Dessiner autour d'un digit le nombre de lignes correspondantes
+Comment[de]=Zeichne Linien um eine Ziffer entsprechend der enthaltenen Zahl
diff --git a/debian/desktop/sgt-magnets.desktop b/debian/desktop/sgt-magnets.desktop
new file mode 100644 (file)
index 0000000..90580bc
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-magnets
+Icon=sgt-magnets
+Type=Application
+Categories=Game;LogicGame;
+Name=Magnets
+Comment=Magnets puzzle game
+Comment[de]=Magnetpuzzlespiel
diff --git a/debian/desktop/sgt-map.desktop b/debian/desktop/sgt-map.desktop
new file mode 100644 (file)
index 0000000..9dea514
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-map
+Icon=sgt-map
+Type=Application
+Categories=Game;LogicGame;
+Name=Map
+Comment=Colour each region with one of four colours so that no two regions sharing a boundary have the same colour
+Comment[fr]=Colorer chaque région d'une couleur de telle sorte que deux régions adjacentes n'ait pas la même couleur
+Comment[de]=Färbe jede Region mit einer der vier Farben, so dass keine zwei Regionen mit gemeinsamer Grenze die selbe Farbe haben
diff --git a/debian/desktop/sgt-mines.desktop b/debian/desktop/sgt-mines.desktop
new file mode 100644 (file)
index 0000000..cef2dac
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-mines
+Icon=sgt-mines
+Type=Application
+Categories=Game;LogicGame;
+Name=Mines
+Comment=Clear hidden mines from a minefield
+Comment[fr]=Nettoyer un champ de mines de ses mines cachées
+Comment[de]=Beseitige versteckte Minen aus einem Minenfeld
diff --git a/debian/desktop/sgt-net.desktop b/debian/desktop/sgt-net.desktop
new file mode 100644 (file)
index 0000000..4ba4bdc
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-net
+Icon=sgt-net
+Type=Application
+Categories=Game;LogicGame;
+Name=Net
+Comment=Rotate every tile to fix the network
+Comment[fr]=Remetter en place les câbles pour réparer le réseau
+Comment[de]=Rotiere jeden Spielstein, um das Netz zu reparieren
diff --git a/debian/desktop/sgt-netslide.desktop b/debian/desktop/sgt-netslide.desktop
new file mode 100644 (file)
index 0000000..4439854
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-netslide
+Icon=sgt-netslide
+Type=Application
+Categories=Game;LogicGame;
+Name=Netslide
+Comment=Game combining the grid generation of Net with the movement of Sixteen
+Comment[fr]=Jeu combinant l'outil de génération de grille de Net avec le mouvement de Sixteen
+Comment[de]=Spiel, dass die Gittererzeugung von Net mit den Spielzügen von Sixteen kombiniert
diff --git a/debian/desktop/sgt-palisade.desktop b/debian/desktop/sgt-palisade.desktop
new file mode 100644 (file)
index 0000000..b64eb23
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-palisade
+Icon=sgt-palisade
+Type=Application
+Categories=Game;LogicGame;
+Name=Palisade
+Comment=Divide the grid into equal-sized areas in accordance with the clues
+Comment[de]=Unterteile das Gitter in gleich-große Bereiche entsprechend der Hinweise
diff --git a/debian/desktop/sgt-pattern.desktop b/debian/desktop/sgt-pattern.desktop
new file mode 100644 (file)
index 0000000..b5e9595
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-pattern
+Icon=sgt-pattern
+Type=Application
+Categories=Game;LogicGame;
+Name=Pattern
+Comment=Fill in the entire grid black or white
+Comment[fr]=Remplir complètement la grille de noir ou de blanc
+Comment[de]=Färbe das gesamte Gitter schwarz oder weiß
diff --git a/debian/desktop/sgt-pearl.desktop b/debian/desktop/sgt-pearl.desktop
new file mode 100644 (file)
index 0000000..71171c6
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-pearl
+Icon=sgt-pearl
+Type=Application
+Categories=Game;LogicGame;
+Name=Pearl
+Comment=Game based on Masyu
+Comment[de]=Auf Masyu basierendes Spiel
diff --git a/debian/desktop/sgt-pegs.desktop b/debian/desktop/sgt-pegs.desktop
new file mode 100644 (file)
index 0000000..a25e9ff
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-pegs
+Icon=sgt-pegs
+Type=Application
+Categories=Game;LogicGame;
+Name=Pegs
+Comment=Remove all but one of the pegs by jumping an adjacent peg over it
+Comment[fr]=Supprimer tous les jetons en sautant par dessus les jetons adjacents
+Comment[de]=Entferne alle bis auf einen Stift durch Ãœberspringen benachbarter Stifte
diff --git a/debian/desktop/sgt-range.desktop b/debian/desktop/sgt-range.desktop
new file mode 100644 (file)
index 0000000..973d7c8
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-range
+Icon=sgt-range
+Type=Application
+Categories=Game;LogicGame;
+Name=Range
+Comment=Fill the grid so the range of each numbered square matches the number
+Comment[de]=Füllen des Gitters, so dass die Reichweite jedes nummerierten Quadrates zu der Zahl passt
diff --git a/debian/desktop/sgt-rect.desktop b/debian/desktop/sgt-rect.desktop
new file mode 100644 (file)
index 0000000..d575782
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-rect
+Icon=sgt-rect
+Type=Application
+Categories=Game;LogicGame;
+Name=Rectangles
+Comment=Subdivide the grid into rectangles of various sizes following certain rules
+Comment[fr]=Diviser la grille de jeu en rectangles de tailles variables en suivant certaines règles
+Comment[de]=Unterteile das Gitter gemäß bestimmter Regeln in Rechtecke verschiedener Größe
diff --git a/debian/desktop/sgt-samegame.desktop b/debian/desktop/sgt-samegame.desktop
new file mode 100644 (file)
index 0000000..4741e66
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-samegame
+Icon=sgt-samegame
+Type=Application
+Categories=Game;LogicGame;
+Name=Same Game
+Comment=Clear the grid of coloured squares by highlighting contiguous regions of more than one coloured square
+Comment[fr]=Supprimer la grille de couleur en Ã©clairant les régions adjacentes composées de plus d'un carré coloré
+Comment[de]=Bereinige das Gitter von gefärbten Qudraten durch Hervorheben zusammenhängender Gebiete von mehr als einem gefärbten Quadrat
diff --git a/debian/desktop/sgt-signpost.desktop b/debian/desktop/sgt-signpost.desktop
new file mode 100644 (file)
index 0000000..bdb2d4f
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-signpost
+Icon=sgt-signpost
+Type=Application
+Categories=Game;LogicGame;
+Name=Signpost
+Comment=Link the squares of a grid according to the arrows on them
+Comment[de]=Verbinde die Quadrate eines Gitter gemäß den Pfeilen darauf
diff --git a/debian/desktop/sgt-singles.desktop b/debian/desktop/sgt-singles.desktop
new file mode 100644 (file)
index 0000000..25ea737
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-singles
+Icon=sgt-singles
+Type=Application
+Categories=Game;LogicGame;
+Name=Singles
+Comment=Puzzle game based on Hitori
+Comment[de]=Auf Hitori basierendes Puzzlespiel
diff --git a/debian/desktop/sgt-sixteen.desktop b/debian/desktop/sgt-sixteen.desktop
new file mode 100644 (file)
index 0000000..f1e3e3f
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-sixteen
+Icon=sgt-sixteen
+Type=Application
+Categories=Game;LogicGame;
+Name=Sixteen
+Comment=Game similar to Fifteen, but with a different type of move
+Comment[fr]=Jeu similaire Ã  Fifteen, mais avec un type de déplacement différent
+Comment[de]=Spiel Ã¤hnlich Fifteen aber mit einer anderen Art von Spielzügen
diff --git a/debian/desktop/sgt-slant.desktop b/debian/desktop/sgt-slant.desktop
new file mode 100644 (file)
index 0000000..1b5628c
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-slant
+Icon=sgt-slant
+Type=Application
+Categories=Game;LogicGame;
+Name=Slant
+Comment=Draw a diagonal line and choose which way each line slants
+Comment[fr]=Dessiner des lignes en diagonales et choisir dans quel côté celle-ci penche
+Comment[de]=Zeichne eine diagonale Linie und wähle die Richtung der Schrägen aus
diff --git a/debian/desktop/sgt-solo.desktop b/debian/desktop/sgt-solo.desktop
new file mode 100644 (file)
index 0000000..877db93
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-solo
+Icon=sgt-solo
+Type=Application
+Categories=Game;LogicGame;
+Name=Solo
+Comment=Sudoku game
+Comment[fr]=Un sudoku
+Comment[de]=Sudoku-Spiel
diff --git a/debian/desktop/sgt-tents.desktop b/debian/desktop/sgt-tents.desktop
new file mode 100644 (file)
index 0000000..f93315a
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-tents
+Icon=sgt-tents
+Type=Application
+Categories=Game;LogicGame;
+Name=Tents
+Comment=Place tents in some of the remaining squares, under some conditions
+Comment[fr]=Placer des tentes aux places restantes, sous certaines conditions
+Comment[de]=Positioniere Zelte gemäß bestimmter Bedingungen in einige der verbliebenen Quadrate
diff --git a/debian/desktop/sgt-towers.desktop b/debian/desktop/sgt-towers.desktop
new file mode 100644 (file)
index 0000000..70fd724
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-towers
+Icon=sgt-towers
+Type=Application
+Categories=Game;LogicGame;
+Name=Towers
+Comment=Puzzle game based on Skyscrapers
+Comment[de]=Auf Skyscrapers basierendes Puzzlespiel
diff --git a/debian/desktop/sgt-tracks.desktop b/debian/desktop/sgt-tracks.desktop
new file mode 100644 (file)
index 0000000..d86d7a3
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-tracks
+Icon=sgt-tracks
+Type=Application
+Categories=Game;LogicGame;
+Name=Tracks
+Comment=Fill in the railway track according to the clues
+Comment[de]=Einfüllen der Eisenbahngleise gemäß der Hinweise
diff --git a/debian/desktop/sgt-twiddle.desktop b/debian/desktop/sgt-twiddle.desktop
new file mode 100644 (file)
index 0000000..45a072c
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-twiddle
+Icon=sgt-twiddle
+Type=Application
+Categories=Game;LogicGame;
+Name=Twiddle
+Comment=Arrange the numbers into ascending order 
+Comment[fr]=Placer les nombres dans ordre ascendant
+Comment[de]=Sortiere die Zahlen in absteigende Reihenfolge
diff --git a/debian/desktop/sgt-undead.desktop b/debian/desktop/sgt-undead.desktop
new file mode 100644 (file)
index 0000000..930fa86
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-undead
+Icon=sgt-undead
+Type=Application
+Categories=Game;LogicGame;
+Name=Undead
+Comment=Monster-placing puzzle
+Comment[de]=Monster-Setz-Spiel
diff --git a/debian/desktop/sgt-unequal.desktop b/debian/desktop/sgt-unequal.desktop
new file mode 100644 (file)
index 0000000..f764b8e
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-unequal
+Icon=sgt-unequal
+Type=Application
+Categories=Game;LogicGame;
+Name=Unequal
+Comment=Fully populate the grid with numbers under some conditions
+Comment[fr]=Remplir complètement la grille de nombre sous certaines conditions
+Comment[de]=Bevölkere das Gitter mit Zahlen gemäß bestimmter Bedingungen
diff --git a/debian/desktop/sgt-unruly.desktop b/debian/desktop/sgt-unruly.desktop
new file mode 100644 (file)
index 0000000..256c1ec
--- /dev/null
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-unruly
+Icon=sgt-unruly
+Type=Application
+Categories=Game;LogicGame;
+Name=Unruly
+Comment=Black and white grid puzzle
+Comment[de]=Schwarz-und-Weiss-Gitter-Puzzle
diff --git a/debian/desktop/sgt-untangle.desktop b/debian/desktop/sgt-untangle.desktop
new file mode 100644 (file)
index 0000000..913391b
--- /dev/null
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Terminal=false
+Exec=sgt-untangle
+Icon=sgt-untangle
+Type=Application
+Categories=Game;LogicGame;
+Name=Untangle
+Comment=Position the points so that no line crosses another
+Comment[fr]=Placer les attaches de telle sorte qu'aune ligne ne se croise
+Comment[de]=Positioniere die Punkte, so dass sich keine Linien kreuzen
diff --git a/debian/patches/102_fix-pearl-min-dimensions.diff b/debian/patches/102_fix-pearl-min-dimensions.diff
new file mode 100644 (file)
index 0000000..ac1a41a
--- /dev/null
@@ -0,0 +1,20 @@
+Author: Ben Hutchings <ben@decadent.org.uk>
+Description: pearl: Require width or height to be at least 6 for Tricky
+Bug-Debian: https://bugs.debian.org/667963
+
+Josh Triplett reported:
+> If I ask pearl to generate a 5x5 tricky puzzle, it runs forever.
+
+I find that 5x6 or 6x5 works, so set the minimum accordingly.
+
+--- a/pearl.c
++++ b/pearl.c
+@@ -279,6 +279,8 @@ static char *validate_params(const game_
+     if (params->h < 5) return "Height must be at least five";
+     if (params->difficulty < 0 || params->difficulty >= DIFFCOUNT)
+         return "Unknown difficulty level";
++    if (params->difficulty >= DIFF_TRICKY && params->w + params->h < 11)
++      return "Width or height must be at least six for Tricky";
+     return NULL;
+ }
diff --git a/debian/patches/201_make-more-docs.diff b/debian/patches/201_make-more-docs.diff
new file mode 100644 (file)
index 0000000..a77f347
--- /dev/null
@@ -0,0 +1,229 @@
+Author: Ben Hutchings <ben@decadent.org.uk>
+Description: Add rules and script to build manual pages and HTML
+
+Halibut already supports these formats but since the documentation is
+all combined we need to do a bit more work to extract the right
+information for each game's manual page.
+
+--- a/Makefile.doc
++++ b/Makefile.doc
+@@ -14,12 +14,20 @@ puzzles.hhp: puzzles.but chm.but
+       halibut --html puzzles.but chm.but
+ TRANSLATIONS := $(patsubst po/%.po,%,$(wildcard po/*.po))
++LANGUAGES := en $(TRANSLATIONS)
+ update-po:
+ # Please tell me there is an easier way to preserve the POT file header.
+       test -f po/puzzles-doc.pot
+       po4a-gettextize -f halibut -m puzzles.but --package-name puzzles \
+               -p po/puzzles-doc.tmp1.pot
++      awk -F: '{ print ""; \
++                 print "#: " $$1 ".R"; \
++                 print "msgid \"" $$4 "\""; \
++                 print "msgstr \"\""; }' \
++              < gamedesc.txt >> po/puzzles-doc.tmp1.pot
++      xgettext -j -cTranslator: --package-name puzzles \
++              -o po/puzzles-doc.tmp1.pot mkmanpages.pl
+       sed -i '1,/^#$$/d' po/puzzles-doc.tmp1.pot
+       cat po/puzzles-doc.pot.head po/puzzles-doc.tmp1.pot \
+               > po/puzzles-doc.tmp2.pot
+@@ -44,6 +52,38 @@ doc/puzzles.txt.%: doc/preprocessed.but.
+       halibut --text=$@ --input-charset=UTF-8 $<
+ all: $(addprefix doc/puzzles.txt.,$(TRANSLATIONS))
++doc/man-en-stamp: preprocessed.but
++      mkdir -p doc
++      rm -rf doc/man-en
++      mkdir doc/man-en
++      perl mkmanpages.pl en
++      touch $@
++doc/man-%-stamp: doc/preprocessed.but.%
++      mkdir -p doc
++      rm -rf doc/man-$*
++      mkdir doc/man-$*
++      perl mkmanpages.pl $*
++      touch $@
++man: $(patsubst %,doc/man-%-stamp,$(LANGUAGES))
++
++doc/html-en-stamp: preprocessed.but
++      mkdir -p doc
++      rm -rf doc/html-en
++      mkdir doc/html-en
++      cd doc/html-en && halibut --html ../../preprocessed.but
++      touch $@
++doc/html-%-stamp: doc/preprocessed.but.%
++      mkdir -p doc
++      rm -rf doc/html-$*
++      mkdir doc/html-$*
++      cd doc/html-$* && halibut --html --input-charset=UTF-8 ../preprocessed.but.$*
++      touch $@
++html: $(patsubst %,doc/html-%-stamp,$(LANGUAGES))
++
++.PHONY: man html
++all: man html
++
+ clean:
+       rm -f puzzles.hlp puzzles.txt preprocessed.but HACKING *.html *.hh[pck]
++      rm -f puzzles.cnt
+       rm -rf doc
+--- /dev/null
++++ b/mkmanpages.pl
+@@ -0,0 +1,157 @@
++#!/usr/bin/perl -w
++
++# Generate manual pages for sgt-puzzles by running extracts of puzzles.but
++# through halibut.
++
++use strict;
++use File::Temp;
++use IO::File;
++use Locale::PO;
++use POSIX ();
++
++my $package = 'sgt-puzzles';
++my $language = $ARGV[0] or die 'mkmanpages.pl: no language specified';
++
++# Fake up gettext without compilation or locales
++my $po_map = Locale::PO->load_file_ashash("po/$language.po");
++sub gettext {
++    my $msgid = shift;
++    my $po = $po_map->{Locale::PO->quote($msgid)};
++    return $po ? Locale::PO->dequote($po->msgstr()) : $msgid;
++}
++
++# Header information
++my $package_roff = $package;
++$package_roff =~ s/-/\\-/g;
++my $date;
++# Translator: conventional name for manual section 6
++my $section = gettext('Games');
++my $section_no = "6";
++my $man_dir = "doc/man-$language";
++
++my %commands;
++my %short_descs;
++my $gamedesc = new IO::File('gamedesc.txt', 'r');
++while (<$gamedesc>) {
++    (my $name, undef, undef, my $desc) = split /:/;
++    $commands{$name} = $ENV{BINPREFIX} . $name;
++    $short_descs{$name} = $desc;
++}
++close $gamedesc;
++
++# We should be able to look these up with strftime('%A') but that
++# requires the relevant locale to be installed on the build host
++my @MONTHS = (gettext('January'), gettext('February'), gettext('March'),
++            gettext('April'),   gettext('May'),      gettext('June'),
++            gettext('July'),    gettext('August'),   gettext('September'),
++            gettext('October'), gettext('November'), gettext('December'));
++
++# Chapter name, initialised to dummy value to capture header
++my $name = '__HEADER__';
++
++# Contents of each chapter/appendix
++my %contents;
++
++# Gather chapters from the original documentation
++my $source_name =
++    $language eq 'en' ? 'preprocessed.but' : "doc/preprocessed.but.$language";
++my $source = new IO::File($source_name, 'r') or die "$source_name: $!";
++while (<$source>) {
++    # Look for chapter/appendix heading
++    if (/^\\[AC]{([^}]+)}\s*/) {
++      $name = $1;
++      # The odd one out - chapter name doesn't match command name
++      if ($name eq 'rectangles') {
++          $name = 'rect';
++      }
++    }
++    # Look for version ID with date
++    if (/^\\versionid .* (\d{4})(\d{2})\d{2}\./) {
++      $date = "${MONTHS[$2-1]} $1";
++    }
++    $contents{$name} .= $_;
++}
++close $source;
++
++# Remove all normal text from the header
++$contents{__HEADER__} =~ s/^(?!\\(?:cfg|define|title){).*$//gm;
++
++# Remove introduction from "common features" chapter
++$contents{common} =~ s/^.*?(?=\\H\{)//s;
++
++for my $short_name (keys %commands) {
++    my $command = $commands{$short_name};
++    print "Generating $command.6\n";
++
++    my $text_name = $language eq 'en' ? 'puzzles.txt' : "puzzles.txt.$language";
++    my $contents =
++      "\\cfg{man-mindepth}{1}\n" # don't show original chapter headings
++      . "\\cfg{man-identity}{".uc($command)."}{$section_no}{$date}{$command ($package_roff)}{$section}\n\n"
++      . "\\cfg{man-charset}{UTF-8}\n" # output encoding
++      . $contents{__HEADER__}
++      . "\\C{man-$command} $command\n\n" # dummy chapter
++      . "\\H{man-$command-name} " . gettext('NAME') . "\n\n"
++      . "\\c{$command} \\- $short_descs{$short_name}\n\n"
++      . "\\H{man-$command-synopsis} " . gettext('SYNOPSIS') . "\n\n"
++      # Translator: abbreviation for 'number'
++      . "\\cw{$command} [\\cw{--generate }\\e{" . gettext('n') . "}]\n"
++      # Translator: abbreviation for 'width'
++      . "[\\cw{--print }\\e{" . gettext('w') . "}\\cw{x}\\e{"
++      # Translator: abbreviation for 'height'
++      . gettext('h') . "} [\\cw{--with-solutions}]\n"
++      . "[\\cw{--scale }\\e{" . gettext('n') . "}] [\\cw{--colour}]]\n"
++      . "[\\e{" . gettext('game-parameters') . "}|\\e{" . gettext('game-ID')
++      . "}|\\e{" . gettext('random-seed') . "}]\n\n"
++      . "\\cw{$command --version}\n\n"
++      . "\\H{man-$command-desc} " . gettext('DESCRIPTION') . "\n\n"
++      . $contents{$short_name}
++      . $contents{common}
++      . "\\H{man-$command-see-also} " . gettext('SEE ALSO') . "\n\n"
++      # Translator: "Full documentation in <filename>."
++      . sprintf(gettext("Full documentation in %s."),
++              "/usr/share/doc/$package/$text_name.gz")
++      . "\n";
++
++    # Kluge cross-references
++    sub replace_ref {
++      my ($above, $target, $below) = @_;
++      # If the target is an earlier or later section in the current page, say
++      # it's above or below.
++      if ($above =~ m/\\(?:[CHA]|S\d*){$target}/) {
++          # Translator: earlier in the manual page
++          gettext('above');
++      } elsif ($below =~ m/\\(?:[CHA]|S\d*){$target}/) {
++          # Translator: later in the manual page
++          gettext('below');
++      }
++      # Else if the target is a bibliographic entry, include the entry directly.
++      elsif ($below =~ m/\\B\{$target\}\s*(.*?)\s*(?:\\(?:[BCHA]|S\d*|$))/s) {
++          "($1)";
++      }
++      # Else if it appears to refer to another game, convert to a customary
++      # cross-manual-page reference.
++      elsif ($target =~ /(\w+)/ && exists $commands{$1}) {
++          "\\e{$commands{$1}}($section_no)";
++      }
++      # Otherwise (and this shouldn't happen), show the reference target.
++      else {
++          print STDERR "Failed to resolve reference to $target\n";
++          $target;
++      }
++    }
++    $contents =~ s/(?:\bin\s+)?\\[kK]{([^}]+)}/replace_ref($`, $1, $')/eg;
++
++    # Run through halibut.  It does not default to using stdin or stdout,
++    # and /dev/std{in,out} apparently don't exist on some systems, so we
++    # can't reliably do this with a pipeline.
++    my ($temp_but, $temp_but_name) = mkstemp "/tmp/sgt-puzzles-but-XXXXXX"
++      or die "$!";
++    my $man_name = "$command.$section_no";
++    print $temp_but $contents or die "$!";
++    close $temp_but;
++    system "halibut --man=$man_dir/$man_name --input-charset=UTF-8 $temp_but_name";
++    unlink $temp_but_name;
++    -s "$man_dir/$man_name" or die "halibut produced an empty $man_name";
++}
++
++exit;
diff --git a/debian/patches/202_online-help.diff b/debian/patches/202_online-help.diff
new file mode 100644 (file)
index 0000000..7e513bc
--- /dev/null
@@ -0,0 +1,155 @@
+Author: Ben Hutchings <ben@decadent.org.uk>
+Description: Add HTML-based online help
+
+This works along the same lines as the Windows implementation,
+though we have to try a bit harder to find a help browser.
+
+--- a/gtk.c
++++ b/gtk.c
+@@ -2,6 +2,10 @@
+  * gtk.c: GTK front end for my puzzle collection.
+  */
++#ifndef _POSIX_C_SOURCE
++#define _POSIX_C_SOURCE 1 /* for PATH_MAX */
++#endif
++
+ #include <stdio.h>
+ #include <assert.h>
+ #include <stdlib.h>
+@@ -10,6 +14,9 @@
+ #include <string.h>
+ #include <errno.h>
+ #include <math.h>
++#include <limits.h>
++#include <unistd.h>
++#include <locale.h>
+ #include <sys/time.h>
+ #include <sys/resource.h>
+@@ -2273,6 +2280,89 @@ static void menu_config_event(GtkMenuIte
+     midend_redraw(fe->me);
+ }
++#ifndef HELP_BROWSER_PATH
++#define HELP_BROWSER_PATH "xdg-open:sensible-browser"
++#endif
++
++static void show_help(frontend *fe, const char *topic)
++{
++    const char *list = HELP_BROWSER_PATH;
++    char path[PATH_MAX + 1];
++    struct {
++      const char *s;
++      int len;
++    } lang[3];
++    int i;
++
++    /*
++     * Search for help file, trying:
++     * 1. Version for this locale, ignoring encoding (HTML browsers
++     *    must handle multiple encodings)
++     * 2. Version for this locale, ignoring encoding and country
++     * 3. English version
++     */
++    lang[0].s = setlocale(LC_MESSAGES, NULL);
++    lang[0].len = strcspn(lang[0].s, ".@");
++    lang[1].s = lang[0].s;
++    lang[1].len = strcspn(lang[1].s, "_");
++    if (lang[1].len > lang[0].len)
++      lang[1].len = lang[0].len;
++    lang[2].s = "en";
++    lang[2].len = 2;
++    for (i = 0; i < lenof(lang); i++) {
++      sprintf(path, "%s/sgt-puzzles/help/%.*s/%s.html",
++              SHAREDIR, lang[i].len, lang[i].s, topic);
++      if (access(path, R_OK) == 0)
++          break;
++    }
++    if (i == lenof(lang)) {
++      error_box(fe->window, "Help file is not installed");
++      return;
++    }
++
++    for (;;) {
++      size_t len;
++      char buf[PATH_MAX + 1];
++      const char *command;
++      const char *argv[3];
++
++      len = strcspn(list, ":");
++      if (len <= PATH_MAX) {
++          memcpy(buf, list, len);
++          buf[len] = 0;
++          if (buf[0] == '$')
++              command = getenv(buf + 1);
++          else
++              command = buf;
++          if (command) {
++              argv[0] = command;
++              argv[1] = path;
++              argv[2] = NULL;
++              if (g_spawn_async(NULL, (char **)argv, NULL,
++                                G_SPAWN_SEARCH_PATH,
++                                NULL, NULL, NULL, NULL))
++                  return;
++          }
++      }
++
++      if (!list[len])
++          break;
++      list += len + 1;
++    }
++
++    error_box(fe->window, "Failed to start a help browser");
++}
++
++static void menu_help_contents_event(GtkMenuItem *menuitem, gpointer data)
++{
++    show_help((frontend *)data, "index");
++}
++
++static void menu_help_specific_event(GtkMenuItem *menuitem, gpointer data)
++{
++    show_help((frontend *)data, thegame.htmlhelp_topic);
++}
++
+ static void menu_about_event(GtkMenuItem *menuitem, gpointer data)
+ {
+     frontend *fe = (frontend *)data;
+@@ -2593,6 +2683,25 @@ static frontend *new_window(char *arg, i
+     menu = gtk_menu_new();
+     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
++    menuitem = gtk_menu_item_new_with_label("Contents");
++    gtk_container_add(GTK_CONTAINER(menu), menuitem);
++    g_signal_connect(G_OBJECT(menuitem), "activate",
++                   G_CALLBACK(menu_help_contents_event), fe);
++    gtk_widget_show(menuitem);
++
++    if (thegame.htmlhelp_topic) {
++      char *item;
++      assert(thegame.name);
++      item = snewn(9+strlen(thegame.name), char); /*ick*/
++      sprintf(item, "Help on %s", thegame.name);
++      menuitem = gtk_menu_item_new_with_label(item);
++      sfree(item);
++      gtk_container_add(GTK_CONTAINER(menu), menuitem);
++      g_signal_connect(G_OBJECT(menuitem), "activate",
++                       G_CALLBACK(menu_help_specific_event), fe);
++      gtk_widget_show(menuitem);
++    }
++
+     menuitem = gtk_menu_item_new_with_label("About");
+     gtk_container_add(GTK_CONTAINER(menu), menuitem);
+     g_signal_connect(G_OBJECT(menuitem), "activate",
+--- a/Recipe
++++ b/Recipe
+@@ -95,6 +95,7 @@ Puzzles.dmg: Puzzles
+ !begin am
+ bin_PROGRAMS = $(GAMES)
++GTK_CFLAGS += -DSHAREDIR="\"$(datarootdir)\""
+ !end
+ !begin am_begin
+ GAMES =
diff --git a/debian/patches/206_translate-docs.diff b/debian/patches/206_translate-docs.diff
new file mode 100644 (file)
index 0000000..2e2ac8d
--- /dev/null
@@ -0,0 +1,44 @@
+Author: Ben Hutchings <ben@decadent.org.uk>
+Description: Support translated docs using po4a
+Bug-Debian: https://bugs.debian.org/483665
+
+--- a/Makefile.doc
++++ b/Makefile.doc
+@@ -13,5 +13,37 @@ chm: puzzles.hhp
+ puzzles.hhp: puzzles.but chm.but
+       halibut --html puzzles.but chm.but
++TRANSLATIONS := $(patsubst po/%.po,%,$(wildcard po/*.po))
++
++update-po:
++# Please tell me there is an easier way to preserve the POT file header.
++      test -f po/puzzles-doc.pot
++      po4a-gettextize -f halibut -m puzzles.but --package-name puzzles \
++              -p po/puzzles-doc.tmp1.pot
++      sed -i '1,/^#$$/d' po/puzzles-doc.tmp1.pot
++      cat po/puzzles-doc.pot.head po/puzzles-doc.tmp1.pot \
++              > po/puzzles-doc.tmp2.pot
++      diff -q -I Project-Id-Version: -I POT-Creation-Date: \
++              po/puzzles-doc.pot po/puzzles-doc.tmp2.pot || \
++              mv po/puzzles-doc.tmp2.pot po/puzzles-doc.pot
++      rm -f po/puzzles-doc.tmp*.pot
++      for lang in $(TRANSLATIONS); do \
++              msgmerge --previous -U po/$$lang.po po/puzzles-doc.pot || exit; \
++      done
++.PHONY: update-po
++
++doc/puzzles.but.%: puzzles.but po/%.po
++      mkdir -p doc
++      po4a-translate -k 0 -f halibut -m puzzles.but -p po/$*.po -l $@
++.PRECIOUS: $(addprefix doc/puzzles.but.,$(TRANSLATIONS))
++
++doc/preprocessed.but.%: doc/puzzles.but.%
++      sed 's/PREFIX-/$(BINPREFIX)/g' $< > $@
++
++doc/puzzles.txt.%: doc/preprocessed.but.%
++      halibut --text=$@ --input-charset=UTF-8 $<
++all: $(addprefix doc/puzzles.txt.,$(TRANSLATIONS))
++
+ clean:
+       rm -f puzzles.hlp puzzles.txt preprocessed.but HACKING *.html *.hh[pck]
++      rm -rf doc
diff --git a/debian/patches/207_slant-shade-filled.diff b/debian/patches/207_slant-shade-filled.diff
new file mode 100644 (file)
index 0000000..663c14c
--- /dev/null
@@ -0,0 +1,19 @@
+Author: Ben Hutchings <ben@decadent.org.uk>
+Description: slant: Shade filled squares
+Bug-Debian: https://bugs.debian.org/419836
+
+--- a/slant.c
++++ b/slant.c
+@@ -1793,11 +1793,7 @@ static float *game_colours(frontend *fe,
+     float *ret = snewn(3 * NCOLOURS, float);
+     /* CURSOR colour is a background highlight. */
+-    game_mkhighlight(fe, ret, COL_BACKGROUND, COL_CURSOR, -1);
+-
+-    ret[COL_FILLEDSQUARE * 3 + 0] = ret[COL_BACKGROUND * 3 + 0];
+-    ret[COL_FILLEDSQUARE * 3 + 1] = ret[COL_BACKGROUND * 3 + 1];
+-    ret[COL_FILLEDSQUARE * 3 + 2] = ret[COL_BACKGROUND * 3 + 2];
++    game_mkhighlight(fe, ret, COL_BACKGROUND, COL_CURSOR, COL_FILLEDSQUARE);
+     ret[COL_GRID * 3 + 0] = ret[COL_BACKGROUND * 3 + 0] * 0.7F;
+     ret[COL_GRID * 3 + 1] = ret[COL_BACKGROUND * 3 + 1] * 0.7F;
diff --git a/debian/patches/302_rename-binaries.diff b/debian/patches/302_rename-binaries.diff
new file mode 100644 (file)
index 0000000..23bf39e
--- /dev/null
@@ -0,0 +1,102 @@
+Author: Ben Hutchings <ben@decadent.org.uk>
+Description: blackbox, flip, net: Rename executables to avoid name clashes
+
+Add 'game' suffix to blackbox, flip and net which can otherwise clash
+with commands of the same name in /usr/bin.
+
+--- sgt-puzzles.orig/flip.R
++++ sgt-puzzles/flip.R
+@@ -2,14 +2,16 @@
+ FLIP_EXTRA = tree234
+-flip     : [X] GTK COMMON flip FLIP_EXTRA flip-icon|no-icon
++# Debian already has a binary called `flip' (in the flip package) so we
++# append `game' to its name
++flipgame : [X] GTK COMMON flip FLIP_EXTRA flip-icon|no-icon
+ flip     : [G] WINDOWS COMMON flip FLIP_EXTRA flip.res|noicon.res
+ ALL += flip[COMBINED] FLIP_EXTRA
+ !begin gtk
+-GAMES += flip
++GAMES += flipgame
+ !end
+ !begin >list.c
+--- sgt-puzzles.orig/blackbox.R
++++ sgt-puzzles/blackbox.R
+@@ -1,13 +1,15 @@
+ # -*- makefile -*-
+-blackbox : [X] GTK COMMON blackbox blackbox-icon|no-icon
++# Debian already has a binary called `blackbox' (in the blackbox package)
++# so we append `game' to its name
++blackboxgame : [X] GTK COMMON blackbox blackbox-icon|no-icon
+ blackbox : [G] WINDOWS COMMON blackbox blackbox.res|noicon.res
+ ALL += blackbox[COMBINED]
+ !begin gtk
+-GAMES += blackbox
++GAMES += blackboxgame
+ !end
+ !begin >list.c
+--- sgt-puzzles.orig/net.R
++++ sgt-puzzles/net.R
+@@ -2,7 +2,9 @@
+ NET_EXTRA = tree234 dsf
+-net      : [X] GTK COMMON net NET_EXTRA net-icon|no-icon
++# Debian already has a binary called `net' (in the samba-common package)
++# so we append `game' to its name
++netgame  : [X] GTK COMMON net NET_EXTRA net-icon|no-icon
+ # The Windows Net shouldn't be called `net.exe' since Windows
+ # already has a reasonably important utility program by that name!
+@@ -11,7 +13,7 @@
+ ALL += net[COMBINED] NET_EXTRA
+ !begin gtk
+-GAMES += net
++GAMES += netgame
+ !end
+ !begin >list.c
+--- sgt-puzzles.orig/puzzles.but
++++ sgt-puzzles/puzzles.but
+@@ -425,7 +425,9 @@
+ \cfg{winhelp-topic}{games.net}
+ (\e{Note:} the \i{Windows} version of this game is called
+-\i\cw{NETGAME.EXE} to avoid clashing with Windows's own \cw{NET.EXE}.)
++\i\cw{NETGAME.EXE} to avoid clashing with Windows's own \cw{NET.EXE}.
++Similarly the Debian version is called \i\cw{netgame} to avoid
++clashing with Samba's \cw{net}.)
+ I originally saw this in the form of a Flash game called \i{FreeNet}
+ \k{FreeNet}, written by Pavils Jurjans; there are several other
+@@ -1230,6 +1232,9 @@
+ \cfg{winhelp-topic}{games.flip}
++(\e{Note:} the Debian version of this game is called \i\cw{flipgame} to
++avoid clashing with the text conversion program \cw{flip}.)
++
+ You have a grid of squares, some light and some dark. Your aim is to
+ light all the squares up at the same time. You can choose any square
+ and flip its state from light to dark or dark to light, but when you
+@@ -1513,6 +1518,9 @@
+ \cfg{winhelp-topic}{games.blackbox}
++(\e{Note:} the Debian version of this game is called \i\cw{blackboxgame} to
++avoid clashing with the window manager \cw{blackbox}.)
++
+ A number of balls are hidden in a rectangular arena. You have to
+ deduce the positions of the balls by firing lasers positioned at
+ the edges of the arena and observing how their beams are deflected. 
diff --git a/debian/patches/303_show-debian-version-number.diff b/debian/patches/303_show-debian-version-number.diff
new file mode 100644 (file)
index 0000000..7091818
--- /dev/null
@@ -0,0 +1,18 @@
+Author: Ben Hutchings <ben@decadent.org.uk>
+Description: Show Debian package version number
+
+Include Debian version number in any version display to make
+it obvious that the binaries are built from modified source.
+
+--- a/version.c
++++ b/version.c
+@@ -4,4 +4,8 @@
+ #include "version.h"
+-char ver[] = VER;
++char ver[] = VER
++#if defined DEBIAN_VERSION
++    " (Debian package " DEBIAN_VERSION ")"
++#endif
++    ;
diff --git a/debian/patches/304_combine-binaries.diff b/debian/patches/304_combine-binaries.diff
new file mode 100644 (file)
index 0000000..9539d0c
--- /dev/null
@@ -0,0 +1,531 @@
+Author: Ben Hutchings <ben@decadent.org.uk>
+Description: Combine puzzles into a single executable
+
+Link all the puzzles into a single executable and use argv[0]
+to decide which to run.  This saves a large amount of disk
+space due to the large amount of code that is otherwise
+statically linked into multiple executables.
+
+--- a/gtk.c
++++ b/gtk.c
+@@ -2,6 +2,8 @@
+  * gtk.c: GTK front end for my puzzle collection.
+  */
++#define _GNU_SOURCE
++
+ #include <stdio.h>
+ #include <assert.h>
+ #include <stdlib.h>
+@@ -46,6 +48,14 @@
+ /* #undef USE_CAIRO */
+ /* #define NO_THICK_LINE */
++
++#ifdef COMBINED
++static const gameindex *thegameindex;
++#define thegame (*thegameindex->game)
++#define xpm_icons (thegameindex->xpm_icons)
++#define n_xpm_icons (*thegameindex->n_xpm_icons)
++#endif
++
+ #ifdef DEBUGGING
+ static FILE *debug_fp = NULL;
+@@ -2190,8 +2200,6 @@ static frontend *new_window(char *arg, i
+     GList *iconlist;
+     int x, y, n;
+     char errbuf[1024];
+-    extern char *const *const xpm_icons[];
+-    extern const int n_xpm_icons;
+     fe = snew(frontend);
+@@ -2585,7 +2593,8 @@ char *fgetline(FILE *fp)
+ int main(int argc, char **argv)
+ {
+-    char *pname = argv[0];
++    char *pname;
++    int i;
+     char *error;
+     int ngenerate = 0, print = FALSE, px = 1, py = 1;
+     int time_generation = FALSE, test_solve = FALSE, list_presets = FALSE;
+@@ -2601,6 +2610,28 @@ int main(int argc, char **argv)
+     char **av = argv;
+     char errbuf[500];
++#ifdef COMBINED
++    pname = strrchr(argv[0], '/');
++    if (pname)
++      pname++;
++    else
++      pname = argv[0];
++    if (!strncmp(pname, "sgt-", 4))
++      pname += 4;
++    for (i = 0; i < gamecount; i++) {
++      size_t len = strlen(gamelist[i].name);
++      if (!strncmp(pname, gamelist[i].name, len) &&
++          (pname[len] == 0 || !strcmp(pname + len, "game"))) {
++          thegameindex = &gamelist[i];
++          break;
++      }
++    }
++    if (!thegameindex) {
++      fprintf(stderr, "puzzles: unknown puzzle '%s'\n", pname);
++      exit(2);
++    }
++#endif
++
+     /*
+      * Command line parsing in this function is rather fiddly,
+      * because GTK wants to have a go at argc/argv _first_ - and
+--- a/Recipe
++++ b/Recipe
+@@ -23,7 +23,7 @@ WINDOWS_COMMON = printing
+          + user32.lib gdi32.lib comctl32.lib comdlg32.lib winspool.lib
+ WINDOWS  = windows WINDOWS_COMMON
+ COMMON   = midend drawing misc malloc random version
+-GTK      = gtk printing ps
++GTK      = gtk[COMBINED] printing ps
+ # Objects needed for auxiliary command-line programs.
+ STANDALONE = nullfe random misc malloc
+@@ -39,6 +39,7 @@ ALL      = list
+  * it directly, or the changes will be lost next time mkfiles.pl runs.
+  * Instead, edit Recipe and/or its *.R subfiles.
+  */
++#define COMBINED
+ #include "puzzles.h"
+ #define GAMELIST(A) \
+ !end
+@@ -49,10 +50,13 @@ ALL      = list
+ # Then we finish up list.c as follows:
+ !begin >list.c
+-#define DECL(x) extern const game x;
+-#define REF(x) &x,
++#define DECL(x)                                               \
++extern const game x;                                  \
++extern const char *const *const x##_xpm_icons[];      \
++extern const int x##_n_xpm_icons;
++#define REF(x) { #x, &x, x##_xpm_icons, &x##_n_xpm_icons },
+ GAMELIST(DECL)
+-const game *gamelist[] = { GAMELIST(REF) };
++const gameindex gamelist[] = { GAMELIST(REF) };
+ const int gamecount = lenof(gamelist);
+ !end
+@@ -92,6 +96,12 @@ Puzzles.dmg: Puzzles
+       rm -f raw.dmg devicename
+ !end
++# Gtk unified application containing all the puzzles.
++puzzles  : [X] GTK COMMON ALL ALL_ICONS
++!begin gtk
++%-icon.o : override CFLAGS += -Dxpm_icons=$(@:%-icon.o=%)_xpm_icons -Dn_xpm_icons=$(@:%-icon.o=%)_n_xpm_icons
++!end
++
+ # Version management.
+ !begin vc
+ version.obj: *.c *.h
+@@ -177,8 +187,11 @@ version2.def: FORCE
+ # make install for Unix.
+ !begin gtk
+ install:
++      mkdir -p $(DESTDIR)$(libdir)/sgt-puzzles
++      $(INSTALL_PROGRAM) -m 755 puzzles \
++              $(DESTDIR)$(libdir)/sgt-puzzles/puzzles
+       for i in $(GAMES); do \
+-              $(INSTALL_PROGRAM) -m 755 $(BINPREFIX)$$i $(DESTDIR)$(gamesdir)/$(BINPREFIX)$$i \
++              ln -s $(libdir)/sgt-puzzles/puzzles $(DESTDIR)$(gamesdir)/$(BINPREFIX)$$i \
+               || exit 1; \
+       done
+ !end
+--- a/mkfiles.pl
++++ b/mkfiles.pl
+@@ -1126,6 +1126,7 @@ if (defined $makefiles{'gtk'}) {
+     "prefix=/usr\n",
+     "exec_prefix=\$(prefix)\n",
+     "bindir=\$(exec_prefix)/bin\n",
++    "libdir=\$(exec_prefix)/lib\n",
+     "gamesdir=\$(exec_prefix)/games\n",
+     "sharedir=\$(prefix)/share\n",
+     "mandir=\$(sharedir)/man\n",
+--- a/puzzles.h
++++ b/puzzles.h
+@@ -581,7 +581,13 @@ struct drawing_api {
+  * there's a list of all available puzzles in array form.
+  */
+ #ifdef COMBINED
+-extern const game *gamelist[];
++typedef struct {
++    const char *name;
++    const game *game;
++    const char *const *const *xpm_icons;
++    const int *n_xpm_icons;
++} gameindex;
++extern const gameindex gamelist[];
+ extern const int gamecount;
+ #else
+ extern const game thegame;
+--- a/blackbox.R
++++ b/blackbox.R
+@@ -5,6 +5,7 @@ blackbox : [X] GTK COMMON blackbox black
+ blackbox : [G] WINDOWS COMMON blackbox blackbox.res|noicon.res
+ ALL += blackbox[COMBINED]
++ALL_ICONS += blackbox-icon
+ !begin gtk
+ GAMES += blackbox
+--- a/bridges.R
++++ b/bridges.R
+@@ -7,6 +7,7 @@ bridges  : [X] GTK COMMON bridges BRIDGE
+ bridges  : [G] WINDOWS COMMON bridges BRIDGES_EXTRA bridges.res|noicon.res
+ ALL += bridges[COMBINED] BRIDGES_EXTRA
++ALL_ICONS += bridges-icon
+ !begin gtk
+ GAMES += bridges
+--- a/cube.R
++++ b/cube.R
+@@ -5,6 +5,7 @@ cube     : [X] GTK COMMON cube cube-icon
+ cube     : [G] WINDOWS COMMON cube cube.res|noicon.res
+ ALL += cube[COMBINED]
++ALL_ICONS += cube-icon
+ !begin gtk
+ GAMES += cube
+--- a/dominosa.R
++++ b/dominosa.R
+@@ -7,6 +7,7 @@ dominosa : [X] GTK COMMON dominosa DOMIN
+ dominosa : [G] WINDOWS COMMON dominosa DOMINOSA_EXTRA dominosa.res|noicon.res
+ ALL += dominosa[COMBINED] DOMINOSA_EXTRA
++ALL_ICONS += dominosa-icon
+ !begin gtk
+ GAMES += dominosa
+--- a/fifteen.R
++++ b/fifteen.R
+@@ -5,6 +5,7 @@ fifteen  : [X] GTK COMMON fifteen fiftee
+ fifteen  : [G] WINDOWS COMMON fifteen fifteen.res|noicon.res
+ ALL += fifteen[COMBINED]
++ALL_ICONS += fifteen-icon
+ !begin gtk
+ GAMES += fifteen
+--- a/filling.R
++++ b/filling.R
+@@ -10,6 +10,7 @@ filling : [X] GTK COMMON filling FILLING
+ filling : [G] WINDOWS COMMON filling FILLING_EXTRA filling.res|noicon.res
+ ALL += filling[COMBINED] FILLING_EXTRA
++ALL_ICONS += filling-icon
+ !begin gtk
+ GAMES += filling
+--- a/flip.R
++++ b/flip.R
+@@ -7,6 +7,7 @@ flip     : [X] GTK COMMON flip FLIP_EXTR
+ flip     : [G] WINDOWS COMMON flip FLIP_EXTRA flip.res|noicon.res
+ ALL += flip[COMBINED] FLIP_EXTRA
++ALL_ICONS += flip-icon
+ !begin gtk
+ GAMES += flip
+--- a/galaxies.R
++++ b/galaxies.R
+@@ -14,6 +14,7 @@ galaxiespicture : [U] galaxies[STANDALON
+ galaxiespicture : [C] galaxies[STANDALONE_PICTURE_GENERATOR] GALAXIES_EXTRA STANDALONE
+ ALL += galaxies[COMBINED] GALAXIES_EXTRA
++ALL_ICONS += galaxies-icon
+ !begin gtk
+ GAMES += galaxies
+--- a/guess.R
++++ b/guess.R
+@@ -5,6 +5,7 @@ guess    : [X] GTK COMMON guess guess-ic
+ guess    : [G] WINDOWS COMMON guess guess.res|noicon.res
+ ALL += guess[COMBINED]
++ALL_ICONS += guess-icon
+ !begin gtk
+ GAMES += guess
+--- a/inertia.R
++++ b/inertia.R
+@@ -5,6 +5,7 @@ inertia  : [X] GTK COMMON inertia inerti
+ inertia  : [G] WINDOWS COMMON inertia inertia.res|noicon.res
+ ALL += inertia[COMBINED]
++ALL_ICONS += inertia-icon
+ !begin gtk
+ GAMES += inertia
+--- a/lightup.R
++++ b/lightup.R
+@@ -10,6 +10,7 @@ lightupsolver : [U] lightup[STANDALONE_S
+ lightupsolver : [C] lightup[STANDALONE_SOLVER] LIGHTUP_EXTRA STANDALONE
+ ALL += lightup[COMBINED] LIGHTUP_EXTRA
++ALL_ICONS += lightup-icon
+ !begin gtk
+ GAMES += lightup
+--- a/loopy.R
++++ b/loopy.R
+@@ -17,6 +17,7 @@ loopysolver :   [C] loopy[STANDALONE_SOL
+ ALL += loopy[COMBINED] LOOPY_EXTRA
++ALL_ICONS += loopy-icon
+ !begin gtk
+ GAMES += loopy
+--- a/map.R
++++ b/map.R
+@@ -10,6 +10,7 @@ mapsolver :     [U] map[STANDALONE_SOLVE
+ mapsolver :     [C] map[STANDALONE_SOLVER] MAP_EXTRA STANDALONE
+ ALL += map[COMBINED] MAP_EXTRA
++ALL_ICONS += map-icon
+ !begin gtk
+ GAMES += map
+--- a/mines.R
++++ b/mines.R
+@@ -10,6 +10,7 @@ mineobfusc :    [U] mines[STANDALONE_OBF
+ mineobfusc :    [C] mines[STANDALONE_OBFUSCATOR] MINES_EXTRA STANDALONE
+ ALL += mines[COMBINED] MINES_EXTRA
++ALL_ICONS += mines-icon
+ !begin gtk
+ GAMES += mines
+--- a/net.R
++++ b/net.R
+@@ -9,6 +9,7 @@ net      : [X] GTK COMMON net NET_EXTRA
+ netgame  : [G] WINDOWS COMMON net NET_EXTRA net.res|noicon.res
+ ALL += net[COMBINED] NET_EXTRA
++ALL_ICONS += net-icon
+ !begin gtk
+ GAMES += net
+--- a/netslide.R
++++ b/netslide.R
+@@ -7,6 +7,7 @@ netslide : [X] GTK COMMON netslide NETSL
+ netslide : [G] WINDOWS COMMON netslide NETSLIDE_EXTRA netslide.res|noicon.res
+ ALL += netslide[COMBINED] NETSLIDE_EXTRA
++ALL_ICONS += netslide-icon
+ !begin gtk
+ GAMES += netslide
+--- a/pattern.R
++++ b/pattern.R
+@@ -8,6 +8,7 @@ patternsolver : [U] pattern[STANDALONE_S
+ patternsolver : [C] pattern[STANDALONE_SOLVER] STANDALONE
+ ALL += pattern[COMBINED]
++ALL_ICONS += pattern-icon
+ !begin gtk
+ GAMES += pattern
+--- a/pegs.R
++++ b/pegs.R
+@@ -7,6 +7,7 @@ pegs     : [X] GTK COMMON pegs PEGS_EXTR
+ pegs     : [G] WINDOWS COMMON pegs PEGS_EXTRA pegs.res|noicon.res
+ ALL += pegs[COMBINED] PEGS_EXTRA
++ALL_ICONS += pegs-icon
+ !begin gtk
+ GAMES += pegs
+--- a/rect.R
++++ b/rect.R
+@@ -5,6 +5,7 @@ rect     : [X] GTK COMMON rect rect-icon
+ rect     : [G] WINDOWS COMMON rect rect.res|noicon.res
+ ALL += rect[COMBINED]
++ALL_ICONS += rect-icon
+ !begin gtk
+ GAMES += rect
+--- a/samegame.R
++++ b/samegame.R
+@@ -5,6 +5,7 @@ samegame : [X] GTK COMMON samegame sameg
+ samegame : [G] WINDOWS COMMON samegame samegame.res|noicon.res
+ ALL += samegame[COMBINED]
++ALL_ICONS += samegame-icon
+ !begin gtk
+ GAMES += samegame
+--- a/sixteen.R
++++ b/sixteen.R
+@@ -5,6 +5,7 @@ sixteen  : [X] GTK COMMON sixteen sixtee
+ sixteen  : [G] WINDOWS COMMON sixteen sixteen.res|noicon.res
+ ALL += sixteen[COMBINED]
++ALL_ICONS += sixteen-icon
+ !begin gtk
+ GAMES += sixteen
+--- a/slant.R
++++ b/slant.R
+@@ -10,6 +10,7 @@ slantsolver :   [U] slant[STANDALONE_SOL
+ slantsolver :   [C] slant[STANDALONE_SOLVER] SLANT_EXTRA STANDALONE
+ ALL += slant[COMBINED] SLANT_EXTRA
++ALL_ICONS += slant-icon
+ !begin gtk
+ GAMES += slant
+--- a/solo.R
++++ b/solo.R
+@@ -10,6 +10,7 @@ solosolver :    [U] solo[STANDALONE_SOLV
+ solosolver :    [C] solo[STANDALONE_SOLVER] SOLO_EXTRA STANDALONE
+ ALL += solo[COMBINED] SOLO_EXTRA
++ALL_ICONS += solo-icon
+ !begin gtk
+ GAMES += solo
+--- a/tents.R
++++ b/tents.R
+@@ -7,6 +7,7 @@ tents    : [X] GTK COMMON tents TENTS_EX
+ tents    : [G] WINDOWS COMMON tents TENTS_EXTRA tents.res|noicon.res
+ ALL += tents[COMBINED] TENTS_EXTRA
++ALL_ICONS += tents-icon
+ tentssolver :   [U] tents[STANDALONE_SOLVER] TENTS_EXTRA STANDALONE
+ tentssolver :   [C] tents[STANDALONE_SOLVER] TENTS_EXTRA STANDALONE
+--- a/twiddle.R
++++ b/twiddle.R
+@@ -5,6 +5,7 @@ twiddle  : [X] GTK COMMON twiddle twiddl
+ twiddle  : [G] WINDOWS COMMON twiddle twiddle.res|noicon.res
+ ALL += twiddle[COMBINED]
++ALL_ICONS += twiddle-icon
+ !begin gtk
+ GAMES += twiddle
+--- a/unequal.R
++++ b/unequal.R
+@@ -13,6 +13,7 @@ latincheck : [U] latin[STANDALONE_LATIN_
+ latincheck : [C] latin[STANDALONE_LATIN_TEST] tree234 maxflow STANDALONE
+ ALL += unequal[COMBINED] UNEQUAL_EXTRA
++ALL_ICONS += unequal-icon
+ !begin gtk
+ GAMES += unequal
+--- a/untangle.R
++++ b/untangle.R
+@@ -7,6 +7,7 @@ untangle : [X] GTK COMMON untangle UNTAN
+ untangle : [G] WINDOWS COMMON untangle UNTANGLE_EXTRA untangle.res|noicon.res
+ ALL += untangle[COMBINED] UNTANGLE_EXTRA
++ALL_ICONS += untangle-icon
+ !begin gtk
+ GAMES += untangle
+--- a/keen.R
++++ b/keen.R
+@@ -11,6 +11,7 @@ keensolver : [U] keen[STANDALONE_SOLVER]
+ keensolver : [C] keen[STANDALONE_SOLVER] latin[STANDALONE_SOLVER] KEEN_LATIN_EXTRA STANDALONE
+ ALL += keen[COMBINED] KEEN_EXTRA
++ALL_ICONS += keen-icon
+ !begin gtk
+ GAMES += keen
+--- a/magnets.R
++++ b/magnets.R
+@@ -10,6 +10,7 @@ magnetssolver :     [U] magnets[STANDALO
+ magnetssolver :     [C] magnets[STANDALONE_SOLVER] MAGNETS_EXTRA STANDALONE
+ ALL += magnets[COMBINED] MAGNETS_EXTRA
++ALL_ICONS += magnets-icon
+ !begin gtk
+ GAMES += magnets
+--- a/singles.R
++++ b/singles.R
+@@ -6,6 +6,7 @@ singles : [X] GTK COMMON singles SINGLES
+ singles : [G] WINDOWS COMMON singles SINGLES_EXTRA singles.res|noicon.res
+ ALL += singles[COMBINED] SINGLES_EXTRA
++ALL_ICONS += singles-icon
+ singlessolver : [U] singles[STANDALONE_SOLVER] SINGLES_EXTRA STANDALONE
+ singlessolver : [C] singles[STANDALONE_SOLVER] SINGLES_EXTRA STANDALONE
+--- a/towers.R
++++ b/towers.R
+@@ -11,6 +11,7 @@ towerssolver : [U] towers[STANDALONE_SOL
+ towerssolver : [C] towers[STANDALONE_SOLVER] latin[STANDALONE_SOLVER] TOWERS_LATIN_EXTRA STANDALONE
+ ALL += towers[COMBINED] TOWERS_EXTRA
++ALL_ICONS += towers-icon
+ !begin gtk
+ GAMES += towers
+--- a/signpost.R
++++ b/signpost.R
+@@ -9,6 +9,7 @@ signpostsolver : [U] signpost[STANDALONE
+ signpostsolver : [C] signpost[STANDALONE_SOLVER] SIGNPOST_EXTRA STANDALONE
+ ALL += signpost[COMBINED] SIGNPOST_EXTRA
++ALL_ICONS += signpost-icon
+ !begin gtk
+ GAMES += signpost
+--- a/range.R
++++ b/range.R
+@@ -5,6 +5,7 @@ range    : [X] GTK COMMON range range-ic
+ range    : [G] WINDOWS COMMON range range.res|noicon.res
+ ALL += range[COMBINED]
++ALL_ICONS += range-icon
+ !begin gtk
+ GAMES += range
+--- a/pearl.R
++++ b/pearl.R
+@@ -9,6 +9,7 @@ pearlbench     : [U] pearl[STANDALONE_SO
+ pearlbench     : [C] pearl[STANDALONE_SOLVER] PEARL_EXTRA STANDALONE
+ ALL += pearl[COMBINED] PEARL_EXTRA
++ALL_ICONS += pearl-icon
+ !begin gtk
+ GAMES += pearl
+--- a/undead.R
++++ b/undead.R
+@@ -4,6 +4,7 @@ undead : [X] GTK COMMON undead undead-ic
+ undead : [G] WINDOWS COMMON undead undead.res|noicon.res
+ ALL += undead[COMBINED]
++ALL_ICONS += undead-icon
+ !begin gtk
+ GAMES += undead
+--- a/unruly.R
++++ b/unruly.R
+@@ -7,6 +7,7 @@ unrulysolver : [U] unruly[STANDALONE_SOL
+ unrulysolver : [C] unruly[STANDALONE_SOLVER] STANDALONE
+ ALL += unruly[COMBINED]
++ALL_ICONS += unruly-icon
+ !begin gtk
+ GAMES += unruly
diff --git a/debian/patches/fix-ftbfs-with-gcc-6.patch b/debian/patches/fix-ftbfs-with-gcc-6.patch
new file mode 100644 (file)
index 0000000..8cbc55f
--- /dev/null
@@ -0,0 +1,29 @@
+Author: Ben Hutchings <ben@decadent.org.uk
+Date: Thu, 30 Jun 2016 14:43:16 +0200
+Description: Fix FTBFS with gcc 6
+ gcc 6 warns about statements that are indented as if they were meant to be
+ part of a preceding conditional block.  In this case I don't think that was
+ intended, so shift it left.
+Bug-Debian: https://bugs.debian.org/811577
+
+--- a/towers.c
++++ b/towers.c
+@@ -388,12 +388,12 @@ static int solver_easy(struct latin_solv
+           return ret;
+ #ifdef STANDALONE_SOLVER
+-          if (solver_show_working)
+-              sprintf(prefix, "%*slower bounds for clue %s %d:\n",
+-                      solver_recurse_depth*4, "",
+-                      cluepos[c/w], c%w+1);
+-          else
+-              prefix[0] = '\0';              /* placate optimiser */
++      if (solver_show_working)
++          sprintf(prefix, "%*slower bounds for clue %s %d:\n",
++                  solver_recurse_depth*4, "",
++                  cluepos[c/w], c%w+1);
++      else
++          prefix[0] = '\0';          /* placate optimiser */
+ #endif
+       i = 0;
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644 (file)
index 0000000..8acda58
--- /dev/null
@@ -0,0 +1,8 @@
+102_fix-pearl-min-dimensions.diff
+fix-ftbfs-with-gcc-6.patch
+206_translate-docs.diff
+201_make-more-docs.diff
+202_online-help.diff
+207_slant-shade-filled.diff
+303_show-debian-version-number.diff
+#304_combine-binaries.diff
diff --git a/debian/po/de.po b/debian/po/de.po
new file mode 100644 (file)
index 0000000..71ea9b7
--- /dev/null
@@ -0,0 +1,8247 @@
+# Documentation for Simon Tatham's Portable Puzzle Collection:
+# translation into German.
+# Copyright (C) 2009-2014,2016 Helge Kreutzmann.
+# This file is distributed under the same license as the English
+# documentation.
+# Helge Kreutzmann <debian@helgefjell.de>, 2009-2014, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: sgt-puzzles\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-06-30 16:17+0200\n"
+"PO-Revision-Date: 2016-07-17 11:44+0200\n"
+"Last-Translator: Helge Kreutzmann <debian@helgefjell.de>\n"
+"Language-Team: de <debian-l10n-german@lists.debian.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#. type: Plain text
+#: puzzles.but:2
+msgid "Simon Tatham's Portable Puzzle Collection"
+msgstr "Simon Tathams portable Puzzle-Sammlung"
+
+#. type: Plain text
+#: puzzles.but:5
+msgid "\\cfg{winhelp-filename}{puzzles.hlp}"
+msgstr "\\cfg{winhelp-filename}{puzzles.hlp}"
+
+#. type: Plain text
+#: puzzles.but:5
+msgid "\\cfg{winhelp-contents-titlepage}{Contents}"
+msgstr "\\cfg{winhelp-contents-titlepage}{Inhalt}"
+
+#. type: Plain text
+#: puzzles.but:7
+msgid "\\cfg{text-filename}{puzzles.txt}"
+msgstr "\\cfg{text-filename}{puzzles.txt}"
+
+#. type: Plain text
+#: puzzles.but:15
+msgid "\\cfg{html-contents-filename}{index.html}"
+msgstr "\\cfg{html-contents-filename}{index.html}"
+
+#. type: Plain text
+#: puzzles.but:15
+msgid "\\cfg{html-template-filename}{%k.html}"
+msgstr "\\cfg{html-template-filename}{%k.html}"
+
+#. type: Plain text
+#: puzzles.but:15
+msgid "\\cfg{html-index-filename}{docindex.html}"
+msgstr "\\cfg{html-index-filename}{docindex.html}"
+
+#. type: Plain text
+#: puzzles.but:15
+msgid "\\cfg{html-leaf-level}{1}"
+msgstr "\\cfg{html-leaf-level}{1}"
+
+#. type: Plain text
+#: puzzles.but:15
+msgid "\\cfg{html-contents-depth-0}{1}"
+msgstr "\\cfg{html-contents-depth-0}{1}"
+
+#. type: Plain text
+#: puzzles.but:15
+msgid "\\cfg{html-contents-depth-1}{2}"
+msgstr "\\cfg{html-contents-depth-1}{2}"
+
+#. type: Plain text
+#: puzzles.but:15
+msgid "\\cfg{html-leaf-contains-contents}{true}"
+msgstr "\\cfg{html-leaf-contains-contents}{true}"
+
+#. type: Plain text
+#: puzzles.but:17
+msgid "\\cfg{info-filename}{puzzles.info}"
+msgstr "\\cfg{info-filename}{puzzles.info}"
+
+#. type: Plain text
+#: puzzles.but:20
+msgid "\\cfg{ps-filename}{puzzles.ps}"
+msgstr "\\cfg{ps-filename}{puzzles.ps}"
+
+#. type: Plain text
+#: puzzles.but:20
+msgid "\\cfg{pdf-filename}{puzzles.pdf}"
+msgstr "\\cfg{pdf-filename}{puzzles.pdf}"
+
+#. type: define
+#: puzzles.but:21
+#, no-wrap
+msgid "\\u00D7{x}"
+msgstr "\\u00D7{x}"
+
+#. type: define
+#: puzzles.but:23
+#, no-wrap
+msgid "\\u2013{-}"
+msgstr "\\u2013{-}"
+
+#. type: define
+#: puzzles.but:25
+#, no-wrap
+msgid "\\u00D7{*}"
+msgstr "\\u00D7{*}"
+
+#. type: define
+#: puzzles.but:27
+#, no-wrap
+msgid "\\u00F7{/}"
+msgstr "\\u00F7{/}"
+
+#. type: define
+#: puzzles.but:29
+#, no-wrap
+msgid "\\u2212{-}"
+msgstr "\\u2212{-}"
+
+#. type: Plain text
+#: puzzles.but:32
+msgid "This is a collection of small one-player puzzle games."
+msgstr "Dies ist eine Sammlung kleiner Puzzlespiele für eine Person."
+
+#. type: Plain text
+#: puzzles.but:36
+msgid ""
+"This manual is copyright 2004-2014 Simon Tatham. All rights reserved. You "
+"may distribute this documentation under the MIT licence.  See \\k{licence} "
+"for the licence text in full."
+msgstr ""
+"Dieses Handbuch ist von Simon Tatham 2004-2014 urheberrechtlich geschützt. "
+"Alle Rechte vorbehalten. Sie können dieses Dokument unter der MIT-Lizenz "
+"vertreiben. Lesen Sie \\k{licence} für den kompletten Lizenztext. Die "
+"Ãœbersetzung wurde von Helge Kreutzmann 2009, 2010 angefertigt und steht "
+"unter der gleichen Lizenz wie das Handbuch selbst."
+
+#. type: Plain text
+#: puzzles.but:38
+msgid ""
+"\\cfg{html-local-head}{<meta name=\"AppleTitle\" content=\"Puzzles Help\">}"
+msgstr ""
+"\\cfg{html-local-head}{<meta name=\"AppleTitle\" content=\"Puzzles Help\">}"
+
+#. type: Plain text
+#: puzzles.but:40
+msgid "Introduction"
+msgstr "Einleitung"
+
+#. type: Plain text
+#: puzzles.but:55
+msgid ""
+"I wrote this collection because I thought there should be more small desktop "
+"toys available: little games you can pop up in a window and play for two or "
+"three minutes while you take a break from whatever else you were doing. And "
+"I was also annoyed that every time I found a good game on (say) \\i{Unix}, "
+"it wasn't available the next time I was sitting at a \\i{Windows} machine, "
+"or vice versa; so I arranged that everything in my personal puzzle "
+"collection will happily run on both, and have more recently done a port to "
+"\\i{Mac OS X} as well. When I find (or perhaps invent) further puzzle games "
+"that I like, they'll be added to this collection and will immediately be "
+"available on both platforms. And if anyone feels like writing any other "
+"front ends \\dash PocketPC, Mac OS pre-10, or whatever it might be \\dash "
+"then all the games in this framework will immediately become available on "
+"another platform as well."
+msgstr ""
+"Ich habe diese Sammlung geschrieben, da ich glaubte, dass es mehr Desktop-"
+"Spielereien geben sollte: Kleine Spiele, die Sie in einem Fenster Ã¶ffnen und "
+"für zwei oder drei Minuten spielen können, während Sie eine Pause von Ihrer "
+"sonstigen Tätigkeit machen. Und ich war auch verärgert, dass jedes Mal, wenn "
+"ich ein gutes Spiel sagen wir unter \\i{Unix} fand es nicht verfügbar war, "
+"wenn ich das nächste Mal an einer \\i{Windows}-Maschine saß oder anders "
+"herum. Daher richtete ich es so ein, dass alles in meiner Puzzle-Sammlung "
+"problemlos auf beiden Plattformen laufen wird. Kürzlich habe ich auch eine "
+"Portierung auf \\i{Mac OS X} vorgenommen. Wenn ich weitere Puzzlespiele, die "
+"ich mag, finde (oder vielleicht erfinde), werden sie zu meiner Puzzle-"
+"Sammlung hinzugefügt und sofort auf beiden Plattformen verfügbar sein. Und "
+"falls jemand Lust hat, weitere Oberflächen zu schreiben \\dash PocketPC, Mac "
+"OS pre-10 oder was auch immer es sein mag \\dash werden alle Spiele unter "
+"diesem Rahmenwerk sofort auf einer weiteren Plattform zur Verfügung stehen."
+
+#. type: Plain text
+#: puzzles.but:61
+msgid ""
+"The actual games in this collection were mostly not my invention; they are "
+"re-implementations of existing game concepts within my portable puzzle "
+"framework. I do not claim credit, in general, for inventing the rules of any "
+"of these puzzles. (I don't even claim authorship of all the code; some of "
+"the puzzles have been submitted by other authors.)"
+msgstr ""
+"Die einzelnen Spiele in dieser Sammlung waren größtenteils nicht meine "
+"Erfindung: Sie sind Neuimplementierungen von existierenden Spielkonzepten "
+"innerhalb meines portablen Puzzle-Rahmenwerks. Im Allgemeinen erhebe ich "
+"keine Urheberschaft für die Erfindung der Regeln für irgendwelche dieser "
+"Puzzle (und ich erhebe noch nicht mal die Autorenschaft für den gesamten "
+"Code; einige der Puzzle wurden von anderen Autoren eingereicht)."
+
+#. type: Plain text
+#: puzzles.but:66
+msgid ""
+"This collection is distributed under the \\i{MIT licence} (see "
+"\\k{licence}). This means that you can do pretty much anything you like with "
+"the game binaries or the code, except pretending you wrote them yourself, or "
+"suing me if anything goes wrong."
+msgstr ""
+"Diese Sammlung wird unter der \\i{MIT-Lizenz} (siehe \\k{licence}) "
+"vertrieben. Das bedeutet, dass Sie so ziemlich alles mit den ausführbaren "
+"Programmen oder dem Code der Spiele machen können, außer zu behaupten, dass "
+"Sie sie selbst geschrieben haben oder mich zu verklagen, falls etwas schief "
+"geht."
+
+#. type: Plain text
+#: puzzles.but:69
+msgid ""
+"The most recent versions, and \\i{source code}, can be found at "
+"\\I{website}\\W{http://www.chiark.greenend.org.uk/~sgtatham/"
+"puzzles/}\\cw{http://www.chiark.greenend.org.uk/~sgtatham/puzzles/}."
+msgstr ""
+"Die neusten Versionen und der \\i{Quellcode} kann unter "
+"\\I{website}\\W{http://www.chiark.greenend.org.uk/~sgtatham/"
+"puzzles/}\\cw{http://www.chiark.greenend.org.uk/~sgtatham/puzzles/} gefunden "
+"werden."
+
+#. type: Plain text
+#: puzzles.but:73
+msgid ""
+"Please report \\I{feedback}\\i{bugs} to \\W{mailto:anakin@pobox."
+"com}\\cw{anakin@pobox.com}.  You might find it helpful to read this article "
+"before reporting a bug:"
+msgstr ""
+"Bitte berichten Sie \\I{feedback}\\i{Fehler} (auf Englisch) an \\W{mailto:"
+"anakin@pobox.com}\\cw{anakin@pobox.com}. Es könnte hilfreich sein, dass Sie "
+"vor dem Melden des Fehler den folgenden Artikel lesen:"
+
+#. type: Plain text
+#: puzzles.but:75
+msgid ""
+"\\W{http://www.chiark.greenend.org.uk/~sgtatham/bugs.html}\\cw{http://www."
+"chiark.greenend.org.uk/~sgtatham/bugs.html}"
+msgstr ""
+"\\W{http://www.chiark.greenend.org.uk/~sgtatham/bugs.html}\\cw{http://www."
+"chiark.greenend.org.uk/~sgtatham/bugs.html}"
+
+#. type: Plain text
+#: puzzles.but:78
+msgid ""
+"\\ii{Patches} are welcome. Especially if they provide a new front end (to "
+"make all these games run on another platform), or a new game."
+msgstr ""
+"\\i{Patches} sind willkommen. Insbesondere wenn Sie eine neue Oberfläche (um "
+"alle Spiele auf einer weiteren Plattform zum Laufen zu bekommen) oder ein "
+"neues Spiel bereitstellen."
+
+#. type: ii{#1}
+#: puzzles.but:81
+msgid "Common features"
+msgstr "Gemeinsame Funktionalitäten"
+
+#. type: Plain text
+#: puzzles.but:83
+msgid "This chapter describes features that are common to all the games."
+msgstr ""
+"Dieses Kapitel beschreibt Funktionalitäten, die allen Spielen gemein sind."
+
+#. type: Plain text
+#: puzzles.but:85
+msgid "\\I{controls}Common actions"
+msgstr "\\I{controls}Gemeinsame Aktionen"
+
+#. type: Plain text
+#: puzzles.but:89
+msgid ""
+"These actions are all available from the \\I{Game menu}\\q{Game} menu and "
+"via \\I{keys}keyboard shortcuts, in addition to any game-specific actions."
+msgstr ""
+"Diese Aktionen sind vom Menüpunkt \\I{Game menu}\\q{Game} und Ã¼ber "
+"\\I{Tasten}Tastaturkürzel verfügbar, zusätzlich zu allen spielspezifischen "
+"Aktionen."
+
+#. type: Plain text
+#: puzzles.but:93
+msgid ""
+"(On \\i{Mac OS X}, to conform with local user interface standards, these "
+"actions are situated on the \\I{File menu}\\q{File} and \\I{Edit "
+"menu}\\q{Edit} menus instead.)"
+msgstr ""
+"(Unter \\i{Mac OS X} befinden sich diese Aktionen unter den Menüs \\I{File "
+"menu}\\q{File} und \\I{Edit menu}\\q{Edit}, um den lokalen "
+"Benutzerschnittstellenstandards zu genügen.)"
+
+#. type: Plain text
+#: puzzles.but:95
+msgid "\\ii\\e{New game} (\\q{N}, Ctrl+\\q{N})"
+msgstr "\\ii\\e{New game} (\\q{N}, Ctrl+\\q{N})"
+
+#. type: Plain text
+#: puzzles.but:97
+msgid "Starts a new game, with a random initial state."
+msgstr "Beginnt ein neues Spiel, mit einem zufälligen Startzustand."
+
+#. type: Plain text
+#: puzzles.but:99
+msgid "\\ii\\e{Restart game}"
+msgstr "\\ii\\e{Restart game}"
+
+#. type: Plain text
+#: puzzles.but:101
+msgid "Resets the current game to its initial state. (This can be undone.)"
+msgstr ""
+"Setzt das aktuelle Spiel auf seinen Startzustand zurück. (Dies kann "
+"rückgängig gemacht werden.)"
+
+#. type: Plain text
+#: puzzles.but:103
+msgid "\\ii\\e{Load}"
+msgstr "\\ii\\e{Load}"
+
+#. type: Plain text
+#: puzzles.but:105
+msgid "Loads a saved game from a file on disk."
+msgstr "Lädt ein gespeichertes Spiel aus einer Datei auf der Platte."
+
+#. type: Plain text
+#: puzzles.but:107
+msgid "\\ii\\e{Save}"
+msgstr "\\ii\\e{Save}"
+
+#. type: Plain text
+#: puzzles.but:109
+msgid "Saves the current state of your game to a file on disk."
+msgstr ""
+"Speichert den aktuellen Zustand Ihres Spiels in einer Datei auf der Platte."
+
+#. type: Plain text
+#: puzzles.but:117
+msgid ""
+"The Load and Save operations preserve your entire game history (so you can "
+"save, reload, and still Undo and Redo things you had done before saving)."
+msgstr ""
+"Die Operationen Load und Save erhalten Ihren gesamten Spielverlauf (daher "
+"können Sie speichern, neuladen und immer noch Aktionen, die Sie vor dem "
+"Speichern durchgeführt hatten, rückgängig machen (Undo) oder erneut "
+"ausführen (Redo))."
+
+#. type: Plain text
+#: puzzles.but:119
+msgid "\\I{printing, on Windows}\\e{Print}"
+msgstr "\\I{Drucken, unter Windows}\\e{Print}"
+
+#. type: Plain text
+#: puzzles.but:126
+msgid ""
+"Where supported (currently only on Windows), brings up a dialog allowing you "
+"to print an arbitrary number of puzzles randomly generated from the current "
+"parameters, optionally including the current puzzle. (Only for puzzles which "
+"make sense to print, of course \\dash it's hard to think of a sensible "
+"printable representation of Fifteen!)"
+msgstr ""
+"Wo unterstützt (derzeit nur unter Windows) wird ein Dialog gezeigt, der es "
+"Ihnen erlaubt, eine beliebige Anzahl von Puzzlen zu drucken, die aus den "
+"aktuellen Parametern generiert werden, darunter optional auch das aktuelle "
+"Puzzle. (Natürlich nur für Puzzles, die sinnvoll gedruckt werden können "
+"\\dash für Fifteen ist es schwer, eine vernünftige druckbare Darstellung zu "
+"ersinnen.)"
+
+#. type: Plain text
+#: puzzles.but:128
+msgid "\\ii\\e{Undo} (\\q{U}, Ctrl+\\q{Z}, Ctrl+\\q{_})"
+msgstr "\\ii\\e{Undo} (\\q{U}, Ctrl+\\q{Z}, Ctrl+\\q{_})"
+
+#. type: Plain text
+#: puzzles.but:131
+msgid ""
+"Undoes a single move. (You can undo moves back to the start of the session.)"
+msgstr ""
+"Setzt einen einzelnen Spielzug zurück. (Sie können Spielzüge bis zum Beginn "
+"der Sitzung zurücksetzen.)"
+
+#. type: Plain text
+#: puzzles.but:133
+msgid "\\ii\\e{Redo} (\\q{R}, Ctrl+\\q{R})"
+msgstr "\\ii\\e{Redo} (\\q{R}, Ctrl+\\q{R})"
+
+#. type: Plain text
+#: puzzles.but:135
+msgid "Redoes a previously undone move."
+msgstr "Nimmt einen vorher zurückgesetzten Spielzug wieder vor."
+
+#. type: Plain text
+#: puzzles.but:137
+msgid "\\ii\\e{Copy}"
+msgstr "\\ii\\e{Copy}"
+
+#. type: Plain text
+#: puzzles.but:142
+msgid ""
+"Copies the current state of your game to the clipboard in text format, so "
+"that you can paste it into (say) an e-mail client or a web message board if "
+"you're discussing the game with someone else.  (Not all games support this "
+"feature.)"
+msgstr ""
+"Kopiert den aktuellen Zustand Ihres Spiels im Textformat in die "
+"Zwischenablage, so dass Sie ihn in, sagen wir, Ihren E-Mail-Client oder ein "
+"Web-Diskussionsforum einfügen können, falls Sie das Spiel mit jemanden "
+"diskutieren. (Nicht alle Spiele unterstützen diese Funktion.)"
+
+#. type: Plain text
+#: puzzles.but:144
+msgid "\\ii\\e{Solve}"
+msgstr "\\ii\\e{Solve}"
+
+#. type: Plain text
+#: puzzles.but:154
+msgid ""
+"Transforms the puzzle instantly into its solved state. For some games (Cube) "
+"this feature is not supported at all because it is of no particular use. For "
+"other games (such as Pattern), the solved state can be used to give you "
+"information, if you can't see how a solution can exist at all or you want to "
+"know where you made a mistake. For still other games (such as Sixteen), "
+"automatic solution tells you nothing about how to \\e{get} to the solution, "
+"but it does provide a useful way to get there quickly so that you can "
+"experiment with set-piece moves and transformations."
+msgstr ""
+"Ãœberführt das Puzzle sofort in seinen gelösten Zustand. Bei einigen Spielen "
+"(Cube) wird diese Funktion Ã¼berhaupt nicht unterstützt, da sie keinen "
+"besonderen Zweck erfüllt. Bei anderen Spielen (wie Pattern) kann der gelöste "
+"Zustand Ihnen Informationen geben, falls Sie nicht erkennen können, ob "
+"überhaupt eine Lösung existiert oder wo Sie einen Fehler gemacht haben. Für "
+"wieder andere Spiele (wie Sixteen) teilt Ihnen die automatische Lösung "
+"nichts darüber mit, wie Sie zu der Lösung \\e{kommen}, aber sie stellt eine "
+"nützliche Methode dar, schnell dorthin zu gelangen, so dass Sie mit den "
+"Stein-Setz-Spielzügen und Transformationen experimentieren können."
+
+#. type: Plain text
+#: puzzles.but:169
+msgid ""
+"Some games (such as Solo) are capable of solving a game ID you have typed in "
+"from elsewhere. Other games (such as Rectangles) cannot solve a game ID they "
+"didn't invent themself, but when they did invent the game ID they know what "
+"the solution is already. Still other games (Pattern) can solve \\e{some} "
+"external game IDs, but only if they aren't too difficult."
+msgstr ""
+"Einige Spiele (wie Solo) sind in der Lage, eine Spiele-ID zu lösen, die Sie "
+"aus anderer Quelle erhalten haben. Andere Spiele (wie Rectangles) können "
+"keine Spiele-ID lösen, die sie nicht selbst erfunden haben, aber wenn sie "
+"die Spiel-ID selbst erfunden haben, kennen sie die Lösung bereits. Wieder "
+"andere Spiele (Pattern) können \\e{einige} externe Spiele-IDs lösen, aber "
+"nur falls diese nicht zu schwer sind."
+
+#. type: Plain text
+#: puzzles.but:169
+msgid ""
+"The \\q{Solve} command adds the solved state to the end of the undo chain "
+"for the puzzle. In other words, if you want to go back to solving it "
+"yourself after seeing the answer, you can just press Undo."
+msgstr ""
+"Der \\q{Solve}-Befehl fügt den gelösten Zustand an das Ende der Undo-Kette "
+"für das Puzzle hinzu. Mit anderen Worten, falls Sie zum eigenständigen Lösen "
+"zurückkehren wollen, nachdem Sie die Antwort gesehen habe, wählen Sie "
+"einfach Undo aus."
+
+#. type: Plain text
+#: puzzles.but:171
+msgid "\\I{exit}\\ii\\e{Quit} (\\q{Q}, Ctrl+\\q{Q})"
+msgstr "\\I{exit}\\ii\\e{Quit} (\\q{Q}, Ctrl+\\q{Q})"
+
+#. type: Plain text
+#: puzzles.but:173
+msgid "Closes the application entirely."
+msgstr "Schließt die Anwendung komplett."
+
+#. type: Plain text
+#: puzzles.but:175
+msgid "Specifying games with the \\ii{game ID}"
+msgstr "Spiele Ã¼ber die \\i{Spiele-ID} angeben"
+
+#. type: Plain text
+#: puzzles.but:179
+msgid ""
+"There are two ways to save a game specification out of a puzzle and recreate "
+"it later, or recreate it in somebody else's copy of the same puzzle."
+msgstr ""
+"Es gibt zwei verschiedene Arten eine Spielspezifikation in einem Puzzle zu "
+"speichern und dieses später wieder herzustellen, entweder in Ihrer Umgebung "
+"oder in der Ausgabe des gleichen Puzzles bei einer anderen Person."
+
+#. type: Plain text
+#: puzzles.but:184
+msgid ""
+"The \\q{\\i{Specific}} and \\q{\\i{Random Seed}} options from the \\I{Game "
+"menu}\\q{Game} menu (or the \\q{File} menu, on \\i{Mac OS X}) each show a "
+"piece of text (a \\q{game ID}) which is sufficient to reconstruct precisely "
+"the same game at a later date."
+msgstr ""
+"Die Optionen \\q{\\i{Specific}} und \\q{\\i{Random Seed}} aus dem Menü "
+"\\I{Game menu}\\q{Game} (oder \\q{File} unter \\i{Mac OS X}) zeigen jeweils "
+"ein Stück Text (eine \\q{Spiele-ID}), der ausreicht, um genau dieses Spiel "
+"zu einem späteren Zeitpunkt zu rekonstruieren."
+
+#. type: Plain text
+#: puzzles.but:190
+msgid ""
+"You can enter either of these pieces of text back into the program (via the "
+"same \\q{Specific} or \\q{Random Seed} menu options) at a later point, and "
+"it will recreate the same game. You can also use either one as a \\i{command "
+"line} argument (on Windows or Unix); see \\k{common-cmdline} for more detail."
+msgstr ""
+"Sie können eines dieser Textstücke später wieder im Programm eingeben (über "
+"die gleiche Menüoption \\q{Specific} oder \\q{Random Seed}) und es wird das "
+"gleiche Spiel wieder erzeugt. Sie können auch eines davon (unter Windows "
+"oder Unix) als \\i{Befehlszeilen}-Argument verwenden; lesen Sie \\k{common-"
+"cmdline} für weitere Details."
+
+#. type: Plain text
+#: puzzles.but:196
+msgid ""
+"The difference between the two forms is that a descriptive game ID is a "
+"literal \\e{description} of the \\i{initial state} of the game, whereas a "
+"random seed is just a piece of arbitrary text which was provided as input to "
+"the random number generator used to create the puzzle. This means that:"
+msgstr ""
+"Der Unterschied in der zwei Formen besteht darin, dass die beschreibende "
+"Spiele-ID eine \\e{Beschreibung} des \\i{Anfangszustand}s des Spieles ist, "
+"während der Zufallsstartwert lediglich ein Stück beliebiger Text ist, der "
+"als Eingabe für den Zufallszahlengenerator zur Erzeugung des Puzzles "
+"verwandt wurde. Dies bedeutet:"
+
+#. type: Plain text
+#: puzzles.but:202
+msgid ""
+"Descriptive game IDs tend to be longer in many puzzles (although some, such "
+"as Cube (\\k{cube}), only need very short descriptions).  So a random seed "
+"is often a \\e{quicker} way to note down the puzzle you're currently "
+"playing, or to tell it to somebody else so they can play the same one as you."
+msgstr ""
+"Beschreibende Spiele-IDs sind typischerweise für viele Puzzle länger (wobei "
+"einige, wie Cube (\\k{cube}) nur eine sehr kurze Beschreibung benötigen). "
+"Daher ist der Zufallsstartwert oft ein \\e{schnellerer} Weg, um das gerade "
+"gespielte Puzzle aufzuschreiben oder es jemanden anderen mitzuteilen, so "
+"dass er das Gleiche wie Sie spielen kann."
+
+#. type: Plain text
+#: puzzles.but:211
+msgid ""
+"Any text at all is a valid random seed. The automatically generated ones are "
+"fifteen-digit numbers, but anything will do; you can type in your full name, "
+"or a word you just made up, and a valid puzzle will be generated from it. "
+"This provides a way for two or more people to race to complete the same "
+"puzzle: you think of a random seed, then everybody types it in at the same "
+"time, and nobody has an advantage due to having seen the generated puzzle "
+"before anybody else."
+msgstr ""
+"Jeder beliebige Text ist ein gültiger Zufallsstartwert. Bei den automatisch "
+"generierten handelt es sich um fünfzehnstellige Zahlen, es funktioniert aber "
+"alles, Sie können Ihren vollständigen Namen oder ein erfundenes Wort "
+"eingeben und ein gültiges Puzzle wird daraus erstellt. Dies gibt zwei oder "
+"mehr Leuten die Möglichkeit, das gleiche Puzzle um die Wette zu lösen: Sie "
+"denken sich einen Zufallsstartwert aus und jeder tippt ihn zur gleichen Zeit "
+"ein. Damit hat keiner einen Vorteil dadurch, dass er das erstellte Puzzle "
+"vor jemanden anderen gesehen hat."
+
+#. type: Plain text
+#: puzzles.but:215
+msgid ""
+"It is often possible to convert puzzles from other sources (such as "
+"\\q{nonograms} or \\q{sudoku} from newspapers) into descriptive game IDs "
+"suitable for use with these programs."
+msgstr ""
+"Oft ist es möglich, Puzzle aus anderen Quellen (wie \\q{Nonograms} oder "
+"\\q{Sudoku} aus Zeitungen) in beschreibende Spiele-IDs zu verwandeln, die "
+"mit diesen Programmen verwandt werden können."
+
+#. type: Plain text
+#: puzzles.but:223
+msgid ""
+"Random seeds are not guaranteed to produce the same result if you use them "
+"with a different \\i\\e{version} of the puzzle program. This is because the "
+"generation algorithm might have been improved or modified in later versions "
+"of the code, and will therefore produce a different result when given the "
+"same sequence of random numbers. Use a descriptive game ID if you aren't "
+"sure that it will be used on the same version of the program as yours."
+msgstr ""
+"Zufallsstartwerte erzeugen nicht notwendigerweise die gleichen Ergebnisse, "
+"wenn sie mit einer anderen \\i\\e{Version} des Puzzle-Programms verwandt "
+"werden. Dies beruht darauf, dass der Erzeugungsalgorithmus in neueren "
+"Versionen des Codes verbessert oder verändert worden sein könnte und daher "
+"ein anderes Ergebnis erzeugen wird, wenn die gleiche Sequenz an Ziffern als "
+"Zufallszahl angegeben wird. Verwenden Sie eine beschreibende Spiele-ID, "
+"falls Sie sich nicht sicher sind, dass sie auf der gleichen Version des "
+"Programms wie der Ihren verwandt wird."
+
+#. type: Plain text
+#: puzzles.but:227
+msgid ""
+"(Use the \\q{About} menu option to find out the version number of the "
+"program. Programs with the same version number running on different "
+"platforms should still be random-seed compatible.)"
+msgstr ""
+"(Verwenden Sie die Menüoption \\q{About} um die Versionsnummer des Programms "
+"herauszufinden. Programme mit der gleichen Versionsnummer auf verschiedenen "
+"Plattformen sollten im Hinblick auf die Zufallsstartwerte kompatibel sein.)"
+
+#. type: Plain text
+#: puzzles.but:234
+msgid ""
+"\\I{ID format}A descriptive game ID starts with a piece of text which "
+"encodes the \\i\\e{parameters} of the current game (such as grid size). Then "
+"there is a colon, and after that is the description of the game's initial "
+"state. A random seed starts with a similar string of parameters, but then it "
+"contains a hash sign followed by arbitrary data."
+msgstr ""
+"\\I{ID-Format}Eine beschreibende Spiele-ID beginnt mit einem Stück Text, der "
+"die \\i\\e{Parameter} des aktuellen Spiels kodiert (wie beispielsweise die "
+"Gittergröße). Dann folgt ein Doppelpunkt und danach eine Beschreibung des "
+"Anfangszustandes des Spieles. Ein Zufallsstartwert beginnt mit einer "
+"ähnlichen Zeichenkette, enthält dann aber ein Rautezeichen gefolgt von "
+"beliebigen Daten."
+
+#. type: Plain text
+#: puzzles.but:240
+msgid ""
+"If you enter a descriptive game ID, the program will not be able to show you "
+"the random seed which generated it, since it wasn't generated \\e{from} a "
+"random seed. If you \\e{enter} a random seed, however, the program will be "
+"able to show you the descriptive game ID derived from that random seed."
+msgstr ""
+"Falls Sie eine beschreibende Spiele-ID eingeben wird das Programm nicht in "
+"der Lage sein, Ihnen den erzeugenden Zufallsstartwert anzuzeigen, da es "
+"nicht \\e{aus} einem Zufallsstartwert erzeugt wurde. Falls Sie allerdings "
+"einen Zufallsstartwert \\e{eingeben}, wird das Programm in der Lage sein, "
+"Ihnen den daraus abgeleiteten Zufallsstartwert anzuzeigen."
+
+#. type: Plain text
+#: puzzles.but:248
+msgid ""
+"Note that the game parameter strings are not always identical between the "
+"two forms. For some games, there will be parameter data provided with the "
+"random seed which is not included in the descriptive game ID. This is "
+"because that parameter information is only relevant when \\e{generating} "
+"puzzle grids, and is not important when playing them. Thus, for example, the "
+"difficulty level in Solo (\\k{solo}) is not mentioned in the descriptive "
+"game ID."
+msgstr ""
+"Beachten Sie, dass die Spieleparameterzeichenketten sich in den zwei Formen "
+"unterscheiden können. Bei einigen Spielen werden beim Zufallsstartwert "
+"zusätzliche Parameterdaten angegeben werden, die bei der beschreibenden "
+"Spiele-ID entfallen. Dies kommt daher, dass diese Parameterinformationen nur "
+"zur \\e{Erstellung} von Gittern, aber nicht beim Spielen relevant sind. So "
+"wird beispielsweise der Schwierigkeitsgrad von Solo (\\k{solo}) in der "
+"beschreibenden Spiele-ID nicht erwähnt."
+
+#. type: Plain text
+#: puzzles.but:258
+msgid ""
+"These additional parameters are also not set permanently if you type in a "
+"game ID. For example, suppose you have Solo set to \\q{Advanced} difficulty "
+"level, and then a friend wants your help with a \\q{Trivial} puzzle; so the "
+"friend reads out a random seed specifying \\q{Trivial} difficulty, and you "
+"type it in. The program will generate you the same \\q{Trivial} grid which "
+"your friend was having trouble with, but once you have finished playing it, "
+"when you ask for a new game it will automatically go back to the "
+"\\q{Advanced} difficulty which it was previously set on."
+msgstr ""
+"Diese zusätzlichen Parameter werden auch nicht permanent gesetzt, falls Sie "
+"eine Spiele-ID eingeben. Nehmen wir beispielsweise an, Sie haben den "
+"Schwierigkeitsgrad \\q{Advanced} in Solo eingestellt und ein Freund bittet "
+"Sie um Unterstützung bei einem Spiel der Schwierigkeit \\q{Trivial}. Er "
+"liest daher einen einen Zufallsstartwert unter Benutzung der Schwierigkeit "
+"\\q{Trivial} aus und Sie geben diesen ein. Das Programm wird Ihnen das "
+"gleiche Gitter mit der Schwierigkeit \\q{Trivial} erstellen, mit dem Ihr "
+"Freund Probleme hatte, aber sobald Sie es zuende gespielt haben und ein "
+"neues Spiel beginnen, wird wieder automatisch auf die Schwierigkeit "
+"\\q{Advanced} zurückgeschaltet, die vorher eingestellt worden war."
+
+#. type: Plain text
+#: puzzles.but:260
+msgid "The \\q{Type} menu"
+msgstr "Das Menü \\q{Type} "
+
+#. type: Plain text
+#: puzzles.but:264
+msgid ""
+"The \\I{Type menu}\\q{Type} menu, if present, may contain a list of "
+"\\i{preset} game settings. Selecting one of these will start a new random "
+"game with the parameters specified."
+msgstr ""
+"Das Menü \\I{Type menu}\\q{Type} kann, falls vorhanden, eine Liste der "
+"\\i{voreingestellten} Spieleeinstellungen enthalten. Wird eines dieser "
+"Einträge ausgewählt, wird ein neues Spiel mit den angegebenen Parametern "
+"gestartet."
+
+#. type: Plain text
+#: puzzles.but:269
+msgid ""
+"The \\q{Type} menu may also contain a \\q{\\i{Custom}} option which allows "
+"you to fine-tune game \\i{parameters}. The parameters available are specific "
+"to each game and are described in the following sections."
+msgstr ""
+"Das Menü \\q{Type} kann auch eine Option \\q{\\i{Custom}} enthalten, die es "
+"Ihnen erlaubt, die \\i{Parameter} des Spiels im Detail einzustellen. Die "
+"Parameter sind spielspezifisch und werden in den folgenden Abschnitten "
+"beschrieben."
+
+#. type: Plain text
+#: puzzles.but:271
+msgid "Specifying game parameters on the \\i{command line}"
+msgstr "Spieleparameter auf der \\i{Befehlszeile} eingeben"
+
+#. type: Plain text
+#: puzzles.but:273
+msgid "(This section does not apply to the \\i{Mac OS X} version.)"
+msgstr "(Dieser Abschnitt betrifft nicht die \\i{Mac OS X}-Version.)"
+
+#. type: Plain text
+#: puzzles.but:279
+msgid ""
+"The games in this collection deliberately do not ever save information on to "
+"the computer they run on: they have no high score tables and no saved "
+"preferences. (This is because I expect at least some people to play them at "
+"work, and those people will probably appreciate leaving as little evidence "
+"as possible!)"
+msgstr ""
+"Die Spiele in dieser Sammlung speichern absichtlich niemals Informationen "
+"auf dem Computer, auf dem sie ausgeführt werden: sie haben keine Bestenliste "
+"und keine abgespeicherten Voreinstellungen. (Dies kommt daher, dass ich "
+"annehme, dass einige Personen sie auf der Arbeit spielen werden und diese "
+"Personen möchten wahrscheinlich so wenige Nachweise wie möglich "
+"hinterlassen!)"
+
+#. type: Plain text
+#: puzzles.but:283
+msgid ""
+"However, if you do want to arrange for one of these games to \\I{default "
+"parameters, specifying}default to a particular set of parameters, you can "
+"specify them on the command line."
+msgstr ""
+"Falls Sie allerdings eines dieser Spiele mit einem \\I{Standardparameter, "
+"angeben}vorgegebenen Satz an bestimmten Parametern starten möchten, können "
+"Sie diese auf der Befehlszeile angeben."
+
+#. type: Plain text
+#: puzzles.but:291
+msgid ""
+"The easiest way to do this is to set up the parameters you want using the "
+"\\q{Type} menu (see \\k{common-type}), and then to select \\q{Random Seed} "
+"from the \\q{Game} or \\q{File} menu (see \\k{common-id}). The text in the "
+"\\q{Game ID} box will be composed of two parts, separated by a hash. The "
+"first of these parts represents the game parameters (the size of the playing "
+"area, for example, and anything else you set using the \\q{Type} menu)."
+msgstr ""
+"Am einfachsten erfolgt dies, indem Sie die gewünschten Parameter mit dem "
+"Menü \\q{Type} einrichten (siehe \\k{common-type}) und dann \\q{Random Seed} "
+"aus dem Menü \\q{Game} oder \\q{File} (siehe \\k{common-id}) auswählen. Der "
+"Text in dem Kasten \\q{Game ID} wird dann aus zwei Teilen bestehen, getrennt "
+"durch eine Raute. Der erste dieser Teile stellt die Spieleparameter dar "
+"(beispielsweise die Größe des Spielbereichs, und alles was Sie Ã¼ber das Menü "
+"\\q{Type} eingestellt haben)."
+
+#. type: Plain text
+#: puzzles.but:294
+msgid ""
+"If you run the game with just that parameter text on the command line, it "
+"will start up with the settings you specified."
+msgstr ""
+"Falls Sie das Spiel mit genau diesem Parametertext auf der Befehlszeile "
+"ausführen, wird es mit den von Ihnen angegebenen Einstellungen gestartet."
+
+#. type: Plain text
+#: puzzles.but:300
+msgid ""
+"For example: if you run Cube (see \\k{cube}), select \\q{Octahedron} from "
+"the \\q{Type} menu, and then go to the game ID selection, you will see a "
+"string of the form \\cq{o2x2#338686542711620}. Take only the part before the "
+"hash (\\cq{o2x2}), and start Cube with that text on the command line: "
+"\\cq{PREFIX-cube o2x2}."
+msgstr ""
+"Beispiel: Sie führen Cube aus (siehe \\k{cube}), wählen \\q{Octahedron} aus "
+"dem Menü \\q{Type} aus und gehen dann zu der Auswahl der Spiele-ID. Dort "
+"sehen Sie eine Zeichenkette der Form \\cq{o2x2#338686542711620}. Verwenden "
+"Sie nur den Teil vor der Raute (\\cq{o2x2}) und starten Sie Cube mit diesem "
+"Text auf der Befehlszeile: \\cq{PREFIX-cube o2x2}."
+
+#. type: Plain text
+#: puzzles.but:305
+msgid ""
+"If you copy the \\e{entire} game ID on to the command line, the game will "
+"start up in the specific game that was described. This is occasionally a "
+"more convenient way to start a particular game ID than by pasting it into "
+"the game ID selection box."
+msgstr ""
+"Falls Sie die \\e{gesamte} Spiele-ID auf der Befehlszeile angeben wird das "
+"Spiel mit dem speziellen beschriebenen Spiel gestartet. Dies ist manchmal "
+"der bequemere Weg eine bestimmte Spiele-ID zu starten, statt diese in den "
+"Auswahlkasten für die Spiele-ID einzufügen."
+
+#. type: Plain text
+#: puzzles.but:310
+msgid ""
+"(You could also retrieve the encoded game parameters using the \\q{Specific} "
+"menu option instead of \\q{Random Seed}, but if you do then some options, "
+"such as the difficulty level in Solo, will be missing. See \\k{common-id} "
+"for more details on this.)"
+msgstr ""
+"(Sie können die kodierten Spieleparameter auch aus der Menüoption "
+"\\q{Specific} statt \\q{Random Seed} auslesen, allerdings werden dann einige "
+"Parameter, wie der Schwierigkeitsgrad in Solo, fehlen. Lesen Sie \\k{common-"
+"id} für weitere Details darüber.)"
+
+#. type: Plain text
+#: puzzles.but:312
+msgid "\\i{Unix} \\i{command-line} options"
+msgstr "\\i{Unix} \\i{Befehlszeilenoptionen}"
+
+#. type: Plain text
+#: puzzles.but:314
+msgid "(This section only applies to the Unix port.)"
+msgstr "(Dieser Abschnitt betrifft nur die Unix-Portierung.)"
+
+#. type: Plain text
+#: puzzles.but:317
+msgid ""
+"In addition to being able to specify game parameters on the command line "
+"(see \\k{common-cmdline}), there are various other options:"
+msgstr ""
+"Zusätzlich zu der Möglichkeit, die Spieleparameter auf der Befehlszeile zu "
+"übergeben (siehe \\k{common-cmdline}) gibt es verschiedene andere Optionen:"
+
+#. type: cw{#1}
+#: puzzles.but:319
+msgid "--game"
+msgstr "--game"
+
+#. type: cw{#1}
+#: puzzles.but:321
+msgid "--load"
+msgstr "--load"
+
+#. type: Plain text
+#: puzzles.but:326
+msgid ""
+"These options respectively determine whether the command-line argument is "
+"treated as specifying game parameters or a \\i{save} file to \\i{load}. Only "
+"one should be specified. If neither of these options is specified, a guess "
+"is made based on the format of the argument."
+msgstr ""
+"Diese Optionen bestimmen, ob das angegebene Befehlszeilenargument als "
+"spezieller Spieleparameter oder als eine zuvor \\i{gespeicherte} und jetzt "
+"zu \\i{ladende} (\\q{--load}) Datei betrachtet wird. Nur eine der beiden "
+"Parameter sollte angegeben werden. Falls keine der Optionen angegeben ist, "
+"wird basierend auf dem Format des Arguments der zutreffende Fall erraten."
+
+#. type: Plain text
+#: puzzles.but:328
+msgid "\\cw{--generate }\\e{n}"
+msgstr "\\cw{--generate }\\e{n}"
+
+#. type: Plain text
+#: puzzles.but:333
+msgid ""
+"If this option is specified, instead of a puzzle being displayed, a number "
+"of descriptive game IDs will be \\I{generating game IDs}invented and printed "
+"on standard output. This is useful for gaining access to the game generation "
+"algorithms without necessarily using the frontend."
+msgstr ""
+"Falls diese Option angegeben wird, dann werden eine Reihe von beschreibenden "
+"Spiele-IDs \\I{Erzeugen von Spiele-IDs}ausgedacht und auf der "
+"Standardausgabe ausgegeben. Dies ist hilfreich, um Zugriff auf die "
+"Spieleerzeugungsalgorithmen zu erhalten, ohne notwendigerweise die "
+"Oberfläche zu verwenden."
+
+#. type: Plain text
+#: puzzles.but:344
+msgid ""
+"If game parameters are specified on the command-line, they will be used to "
+"generate the game IDs; otherwise a default set of parameters will be used."
+msgstr ""
+"Falls auf der Befehlszeile Spieleparameter angegeben sind, werden diese zur "
+"Erzeugung von Spiele-IDs verwandt; andernfalls wird ein voreingestellter "
+"Satz an Parametern verwandt."
+
+#. type: Plain text
+#: puzzles.but:344
+msgid ""
+"The most common use of this option is in conjunction with \\c{--print}, in "
+"which case its behaviour is slightly different; see below."
+msgstr ""
+"Der häufigste Einsatzfall dieser Option besteht im Zusammenhang mit der "
+"Option \\c{--print}. Dabei unterscheidet sich das Verhalten etwas, siehe "
+"unten."
+
+#. type: Plain text
+#: puzzles.but:346
+msgid "\\I{printing, on Unix}\\cw{--print }\\e{w}\\cw{x}\\e{h}"
+msgstr "\\I{Drucken, unter Unix}\\cw{--print }\\e{w}\\cw{x}\\e{h}"
+
+#. type: Plain text
+#: puzzles.but:350
+msgid ""
+"If this option is specified, instead of a puzzle being displayed, a printed "
+"representation of one or more unsolved puzzles is sent to standard output, "
+"in \\i{PostScript} format."
+msgstr ""
+"Falls diese Option angegeben wird, wird eine gedruckte Darstellung eines "
+"oder mehrerer ungelöster Puzzles im \\i{PostScript}-Format auf die "
+"Standardausgabe gesandt, anstatt dass das Puzzle angezeigt wird."
+
+#. type: Plain text
+#: puzzles.but:374
+msgid ""
+"On each page of puzzles, there will be \\e{w} across and \\e{h} down. If "
+"there are more puzzles than \\e{w}\\by\\e{h}, more than one page will be "
+"printed."
+msgstr ""
+"Auf jeder Seite mit Puzzlen wird es \\e{w} quer und \\e{h} nach unten geben. "
+"Falls es mehr Puzzle als \\e{w}\\by\\e{h} gibt wird mehr als eine Seite "
+"gedruckt."
+
+#. type: Plain text
+#: puzzles.but:374 puzzles.but:397
+msgid ""
+"If \\c{--generate} has also been specified, the invented game IDs will be "
+"used to generate the printed output. Otherwise, a list of game IDs is "
+"expected on standard input (which can be descriptive or random seeds; see "
+"\\k{common-id}), in the same format produced by \\c{--generate}."
+msgstr ""
+"Falls auch \\c{--generate} angegeben wurde, werden die ausgedachten Spiele-"
+"IDs zur Erzeugung der gedruckten Ausgabe verwandt. Andernfalls wird auf der "
+"Standardeingabe eine Liste von Spiele-IDs im gleichen Format, wie das von "
+"\\c{--generate} erzeugte, erwartet (diese können beschreibend oder mit "
+"Zufallsstartwert sein, siehe \\k{common-id})."
+
+#. type: Plain text
+#: puzzles.but:374 puzzles.but:397
+msgid "For example:"
+msgstr "Zum Beispiel:"
+
+#. type: c
+#: puzzles.but:374
+#, no-wrap
+msgid "PREFIX-net --generate 12 --print 2x3 7x7w | lpr"
+msgstr "PREFIX-net --generate 12 --print 2x3 7x7w | lpr"
+
+#. type: Plain text
+#: puzzles.but:374
+msgid ""
+"will generate two pages of printed Net puzzles (each of which will have a "
+"7\\by\\.7 wrapping grid), and pipe the output to the \\c{lpr} command, which "
+"on many systems will send them to an actual printer."
+msgstr ""
+"Wird zwei Seiten an gedruckten Net-Puzzlen (jedes wird ein 7\\by\\.7 Umlauf-"
+"Gitter enthalten) erstellen und diese Ã¼ber eine Pipe an den \\c{lpr}-Befehl "
+"senden, der die Ausgabe auf vielen Systemen auf den eigentlichen Drucker "
+"schicken wird."
+
+#. type: Plain text
+#: puzzles.but:374
+msgid "There are various other options which affect printing; see below."
+msgstr ""
+"Es gibt verschiedene weitere Optionen mit Auswirkungen auf das Drucken, "
+"siehe unten."
+
+#. type: Plain text
+#: puzzles.but:376
+msgid "\\cw{--save }\\e{file-prefix} [ \\cw{--save-suffix }\\e{file-suffix} ]"
+msgstr "\\cw{--save }\\e{file-prefix} [ \\cw{--save-suffix }\\e{file-suffix} ]"
+
+#. type: Plain text
+#: puzzles.but:380
+msgid ""
+"If this option is specified, instead of a puzzle being displayed, saved-game "
+"files for one or more unsolved puzzles are written to files constructed from "
+"the supplied prefix and/or suffix."
+msgstr ""
+"Falls diese Option angegeben wird, werden statt der Anzeige eines Puzzles "
+"die gespeicherten Spieledateien für ein oder mehrere Puzzles in Dateien "
+"geschrieben, die aus den angegebenen Prä- und/oder Suffixen konstruiert "
+"werden."
+
+#. type: c
+#: puzzles.but:397
+#, no-wrap
+msgid "PREFIX-net --generate 12 --save game --save-suffix .sav"
+msgstr "PREFIX-net --generate 12 --save game --save-suffix .sav"
+
+#. type: Plain text
+#: puzzles.but:397
+msgid ""
+"will generate twelve Net saved-game files with the names \\cw{game0.sav} to "
+"\\cw{game11.sav}."
+msgstr ""
+"wird zwölf gespeicherte Spieledateien für Net mit den Namen \\cw{game0.sav} "
+"bis \\cw{game11.sav} erstellen."
+
+#. type: cw{#1}
+#: puzzles.but:399
+msgid "--version"
+msgstr "--version"
+
+#. type: Plain text
+#: puzzles.but:401
+msgid "Prints version information about the game, and then quits."
+msgstr ""
+"Gibt nur die Versionsinformationen Ã¼ber das Spiel aus und wird dann beendet."
+
+#. type: Plain text
+#: puzzles.but:404
+msgid ""
+"The following options are only meaningful if \\c{--print} is also specified:"
+msgstr ""
+"Die folgenden Optionen sind nur von Bedeutung, falls auch \\c{--print} "
+"angegeben wird:"
+
+#. type: cw{#1}
+#: puzzles.but:406
+msgid "--with-solutions"
+msgstr "--with-solutions"
+
+#. type: Plain text
+#: puzzles.but:409
+msgid ""
+"The set of pages filled with unsolved puzzles will be followed by the "
+"solutions to those puzzles."
+msgstr ""
+"Die mit ungelösten Puzzlen gefüllte Seite wird von den Lösungen zu diesen "
+"Puzzlen gefolgt."
+
+#. type: Plain text
+#: puzzles.but:411
+msgid "\\cw{--scale }\\e{n}"
+msgstr "\\cw{--scale }\\e{n}"
+
+#. type: Plain text
+#: puzzles.but:414
+msgid ""
+"Adjusts how big each puzzle is when printed. Larger numbers make puzzles "
+"bigger; the default is 1.0."
+msgstr ""
+"Passt die Größe jedes Puzzles im Ausdruck an. Größere Zahlen vergrößern die "
+"Puzzle; der Standardwert ist 1.0."
+
+#. type: cw{#1}
+#: puzzles.but:416
+msgid "--colour"
+msgstr "--colour"
+
+#. type: Plain text
+#: puzzles.but:419
+msgid ""
+"Puzzles will be printed in colour, rather than in black and white (if "
+"supported by the puzzle)."
+msgstr ""
+"Die Puzzles werden in Farbe statt schwarz-weiß ausgedruckt (falls dies vom "
+"Puzzle unterstützt wird)."
+
+#. type: Plain text
+#: puzzles.but:422
+msgid "\\i{Net}"
+msgstr "\\i{Net}"
+
+#. type: Plain text
+#: puzzles.but:424
+msgid "\\cfg{winhelp-topic}{games.net}"
+msgstr "\\cfg{winhelp-topic}{games.net}"
+
+#. type: Plain text
+#: puzzles.but:427
+msgid ""
+"(\\e{Note:} the \\i{Windows} version of this game is called \\i\\cw{NETGAME."
+"EXE} to avoid clashing with Windows's own \\cw{NET.EXE}.)"
+msgstr ""
+"(\\e{Hinweis:} die \\i{Windows}-Version dieses Spieles heißt \\i\\cw{NETGAME."
+"EXE}, um Konflikte mit Windows eigenem \\cw{NET.EXE} zu vermeiden."
+
+#. type: Plain text
+#: puzzles.but:439
+msgid ""
+"I originally saw this in the form of a Flash game called \\i{FreeNet} "
+"\\k{FreeNet}, written by Pavils Jurjans; there are several other "
+"implementations under the name \\i{NetWalk}. The computer prepares a network "
+"by connecting up the centres of squares in a grid, and then shuffles the "
+"network by rotating every tile randomly. Your job is to rotate it all back "
+"into place. The successful solution will be an entirely connected network, "
+"with no closed loops. \\#{The latter clause means that there are no closed "
+"paths within the network.  Could this be clearer? \"No closed paths\"?} As a "
+"visual aid, all tiles which are connected to the one in the middle are "
+"highlighted."
+msgstr ""
+"Ursprünglich habe ich dies in der Form eines von Pavils Jurjans "
+"geschriebenen Flash-Spiels Namens \\i{FreeNet} \\k{FreeNet} gesehen. Es gibt "
+"mehrere weitere Implementationen unter dem Namen \\i{NetWalk}. Der Computer "
+"bereitet ein Netz vor, indem er die Zentren von Quadraten zu einem Gitter "
+"anordnet und dann das Netz durcheinanderwürfelt, in dem er jede Kachel "
+"zufällig dreht. Ihre Aufgabe besteht darin, sie alle wieder zurückzudrehen. "
+"Die erfolgreiche Lösung ergibt ein komplett verbundenes Netz ohne "
+"geschlossene Schleifen. \\#{Letzterer Abschnitt bedeutet, dass es im Netz "
+"keine geschlossenen Pfade gibt. Kann das deutlicher sein? \"Keine "
+"geschlossenen Pfade\"?} Als optisches Hilfsmittel werden alle Kacheln, die "
+"mit der Kachel in der Mitte verbunden sind, hervorgehoben."
+
+#. type: Plain text
+#: puzzles.but:441
+msgid ""
+"\\W{http://www.jurjans.lv/stuff/net/FreeNet.htm}\\cw{http://www.jurjans.lv/"
+"stuff/net/FreeNet.htm}"
+msgstr ""
+"\\W{http://www.jurjans.lv/stuff/net/FreeNet.htm}\\cw{http://www.jurjans.lv/"
+"stuff/net/FreeNet.htm}"
+
+#. type: Plain text
+#: puzzles.but:443
+msgid "\\i{Net controls}"
+msgstr "\\i{Net-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:444 puzzles.but:445 puzzles.but:446
+msgid "Net controls"
+msgstr "Net-Steuerung"
+
+#. type: IM
+#: puzzles.but:444
+#, no-wrap
+msgid "controls, for Net"
+msgstr "Steuerung, von Net"
+
+#. type: IM
+#: puzzles.but:445
+#, no-wrap
+msgid "keys, for Net"
+msgstr "Tasten, für Net"
+
+#. type: IM
+#: puzzles.but:446
+#, no-wrap
+msgid "shortcuts (keyboard), for Net"
+msgstr "Tastaturkürzel, für Net"
+
+#. type: Plain text
+#: puzzles.but:450
+msgid ""
+"This game can be played with either the keyboard or the mouse. The controls "
+"are:"
+msgstr ""
+"Dieses Spiel kann entweder mit der Tastatur oder mit der Maus gespielt "
+"werden. Die Steuerungen sind:"
+
+#. type: Plain text
+#: puzzles.but:452
+msgid "\\e{Select tile}: mouse pointer, arrow keys"
+msgstr "\\e{Kachel auswählen}: Mauszeiger, Pfeiltasten"
+
+#. type: Plain text
+#: puzzles.but:454
+msgid "\\e{Rotate tile anticlockwise}: left mouse button, \\q{A} key"
+msgstr ""
+"\\e{Kachel gegen den Uhrzeigersinn drehen}: linke Maustaste, Taste \\q{A}"
+
+#. type: Plain text
+#: puzzles.but:456
+msgid "\\e{Rotate tile clockwise}: right mouse button, \\q{D} key"
+msgstr "\\e{Kachel im Uhrzeigersinn drehen}: rechte Maustaste, Taste \\q{D}"
+
+#. type: Plain text
+#: puzzles.but:458
+msgid "\\e{Rotate tile by 180 degrees}: \\q{F} key"
+msgstr "\\e{Kachel um 180 Grad drehen}: Taste \\q{F}"
+
+#. type: Plain text
+#: puzzles.but:460
+msgid ""
+"\\e{Lock (or unlock) tile}: middle mouse button, shift-click, \\q{S} key"
+msgstr ""
+"\\e{Kachel sperren (oder entsperren)}: Mittlere Maustaste, Umschalt-Klick, "
+"Taste \\q{S}"
+
+#. type: Plain text
+#: puzzles.but:464
+msgid ""
+"You can lock a tile once you're sure of its orientation. You can also unlock "
+"it again, but while it's locked you can't accidentally turn it."
+msgstr ""
+"Sie können Kacheln sperren, sobald Sie sich Ã¼ber deren Orientierung sicher "
+"sind. Sie können sie auch wieder entsperren, aber im gesperrten Zustand "
+"können Sie sie nicht versehentlich drehen."
+
+#. type: Plain text
+#: puzzles.but:467
+msgid ""
+"The following controls are not necessary to complete the game, but may be "
+"useful:"
+msgstr ""
+"Die folgenden Steuerungen sind für das Beenden des Spiels nicht notwendig, "
+"könnten aber hilfreich sein:"
+
+#. type: Plain text
+#: puzzles.but:469
+msgid "\\e{Shift grid}: Shift + arrow keys"
+msgstr "\\e{Gitter verschieben}: Umschalt + Pfeiltasten"
+
+#. type: Plain text
+#: puzzles.but:472
+msgid ""
+"On grids that wrap, you can move the origin of the grid, so that tiles that "
+"were on opposite sides of the grid can be seen together."
+msgstr ""
+"Bei umlaufenden Gittern können Sie den Ursprung des Gitters verschieben, so "
+"dass Kacheln, die auf gegenüberliegenden Seiten des Gitters waren, zusammen "
+"gesehen werden können."
+
+#. type: Plain text
+#: puzzles.but:474
+msgid "\\e{Move centre}: Ctrl + arrow keys"
+msgstr "\\e{Zentrum bewegen}: Strg + Pfeiltasten"
+
+#. type: Plain text
+#: puzzles.but:479
+msgid ""
+"You can change which tile is used as the source of highlighting.  (It "
+"doesn't ultimately matter which tile this is, as every tile will be "
+"connected to every other tile in a correct solution, but it may be helpful "
+"in the intermediate stages of solving the puzzle.)"
+msgstr ""
+"Sie könne die Kachel Ã¤ndern, auf die sich die Hervorhebung bezieht. (Es "
+"macht letztendlich keinen Unterschied, welche Kachel dies ist, da in der "
+"korrekten Lösung jede Kachel mit jeder anderen Kachel verbunden ist, es kann "
+"aber für die Zwischenstufen beim Lösen des Puzzles hilfreich sein.)"
+
+#. type: Plain text
+#: puzzles.but:481
+msgid "\\e{Jumble tiles}: \\q{J} key"
+msgstr "\\e{Kacheln durcheinanderwürfeln}: \\q{J}-Taste"
+
+#. type: Plain text
+#: puzzles.but:484
+msgid "This key turns all tiles that are not locked to random orientations."
+msgstr ""
+"Diese Taste dreht alle nicht gesperrten Kacheln in eine zufällige Richtung."
+
+#. type: Plain text
+#: puzzles.but:486 puzzles.but:575 puzzles.but:625 puzzles.but:673
+#: puzzles.but:731 puzzles.but:807 puzzles.but:918 puzzles.but:1011
+#: puzzles.but:1203 puzzles.but:1276 puzzles.but:1353 puzzles.but:1425
+#: puzzles.but:1484 puzzles.but:1528 puzzles.but:1671 puzzles.but:1739
+#: puzzles.but:1810 puzzles.but:1906 puzzles.but:1981 puzzles.but:2120
+#: puzzles.but:2236 puzzles.but:2367 puzzles.but:2441 puzzles.but:2500
+#: puzzles.but:2593 puzzles.but:2691 puzzles.but:2749 puzzles.but:2811
+#: puzzles.but:2901 puzzles.but:2969 puzzles.but:3040 puzzles.but:3118
+#: puzzles.but:3164 puzzles.but:3215 puzzles.but:3279 puzzles.but:3332
+msgid "(All the actions described in \\k{common-actions} are also available.)"
+msgstr ""
+"(Alle in \\k{common-actions} beschriebene Aktionen sind auch verfügbar.)"
+
+#. type: Plain text
+#: puzzles.but:488
+msgid "\\I{parameters, for Net}Net parameters"
+msgstr "\\I{Parameter, für Net}Net-Parameter"
+
+#. type: Plain text
+#: puzzles.but:491 puzzles.but:580 puzzles.but:812 puzzles.but:1208
+#: puzzles.but:1281 puzzles.but:1430 puzzles.but:1489 puzzles.but:1676
+#: puzzles.but:1744 puzzles.but:1815 puzzles.but:1911 puzzles.but:1986
+#: puzzles.but:2067 puzzles.but:2125 puzzles.but:2241 puzzles.but:2372
+#: puzzles.but:2446 puzzles.but:2598 puzzles.but:2696 puzzles.but:2754
+#: puzzles.but:2816 puzzles.but:2906 puzzles.but:2974 puzzles.but:3045
+#: puzzles.but:3123 puzzles.but:3169 puzzles.but:3220 puzzles.but:3284
+#: puzzles.but:3337
+msgid ""
+"These parameters are available from the \\q{Custom...} option on the "
+"\\q{Type} menu."
+msgstr ""
+"Diese Parameter sind von der Option \\q{Custom...} im Menü \\q{Type} "
+"verfügbar."
+
+#. type: Plain text
+#: puzzles.but:493 puzzles.but:814 puzzles.but:1138 puzzles.but:1210
+#: puzzles.but:1283 puzzles.but:1432 puzzles.but:1678 puzzles.but:1746
+#: puzzles.but:1817 puzzles.but:1913 puzzles.but:1988 puzzles.but:2069
+#: puzzles.but:2127 puzzles.but:2243 puzzles.but:2448 puzzles.but:2756
+#: puzzles.but:2818 puzzles.but:2908 puzzles.but:2976 puzzles.but:3125
+#: puzzles.but:3171 puzzles.but:3222 puzzles.but:3286 puzzles.but:3339
+msgid "\\e{Width}, \\e{Height}"
+msgstr "\\e{Width} (Breite), \\e{Height} (Höhe)"
+
+#. type: Plain text
+#: puzzles.but:495
+msgid "Size of grid in tiles."
+msgstr "Größe des Gitters in Kacheln."
+
+#. type: e{#1}
+#: puzzles.but:497
+msgid "Walls wrap around"
+msgstr "Walls wrap around"
+
+#. type: Plain text
+#: puzzles.but:500
+msgid ""
+"If checked, flow can pass from the left edge to the right edge, and from top "
+"to bottom, and vice versa."
+msgstr ""
+"Falls ausgewählt kann der Fluss von der linken Ecke zu der rechten Ecke und "
+"von oben nach unten (und andersherum) passieren."
+
+#. type: e{#1}
+#: puzzles.but:502
+msgid "Barrier probability"
+msgstr "Barrierenwahrscheinlichkeit"
+
+#. type: Plain text
+#: puzzles.but:507
+msgid ""
+"A number between 0.0 and 1.0 controlling whether an immovable barrier is "
+"placed between two tiles to prevent flow between them (a higher number gives "
+"more barriers). Since barriers are immovable, they act as constraints on the "
+"solution (i.e., hints)."
+msgstr ""
+"Eine Zahl zwischen 0.0 und 1.0 die steuert, ob eine unüberwindbare Barriere "
+"zwischen zwei Kacheln platziert wird, um den Fluss zwischen ihnen zu "
+"verhindern (eine höhere Zahl ergibt mehr Barrieren). Da Barrieren nicht "
+"verschoben werden können, dienen sie als Randbedingungen für die Lösung (d."
+"h. Tipps)."
+
+#. type: Plain text
+#: puzzles.but:522
+msgid ""
+"The grid generation in Net has been carefully arranged so that the barriers "
+"are independent of the rest of the grid. This means that if you note down "
+"the random seed used to generate the current puzzle (see \\k{common-id}), "
+"change the \\e{Barrier probability} parameter, and then re-enter the same "
+"random seed, you should see exactly the same starting grid, with the only "
+"change being the number of barriers. So if you're stuck on a particular grid "
+"and need a hint, you could start up another instance of Net, set up the same "
+"parameters but a higher barrier probability, and enter the game seed from "
+"the original Net window."
+msgstr ""
+"Die Gitter-Erzeugung in Net wurde sorgfältig so arrangiert, dass die "
+"Barrieren unabhängig vom Rest des Gitters sind. Das bedeutet, dass Sie sich "
+"den Zufallsstartwert für das aktuelle Puzzle aufschreiben können (siehe "
+"\\k{common-id}), den Parameter für die \\e{Barrierenwahrscheinlichkeit} "
+"ändern und dann den Zufallsstartwert erneut eingeben sollten Sie genau das "
+"gleiche Startgitter sehen, wobei die einzige Ã„nderung die Anzahl von "
+"Barrieren ist. Falls Sie daher bei einem bestimmten Gitter festhängen und "
+"eine Hilfe benötigen, könnten Sie eine weitere Instanz von Net starten, die "
+"gleichen Spieleparameter aber mit einer höheren Barrierenwahrscheinlichkeit "
+"einrichten und den Zufallsstartwert von dem ursprünglichen Net-Fenster "
+"eingeben."
+
+#. type: e{#1}
+#: puzzles.but:524 puzzles.but:844 puzzles.but:1498
+msgid "Ensure unique solution"
+msgstr "Ensure unique solution"
+
+#. type: Plain text
+#: puzzles.but:531
+msgid ""
+"Normally, Net will make sure that the puzzles it presents have only one "
+"solution. Puzzles with ambiguous sections can be more difficult and more "
+"subtle, so if you like you can turn off this feature and risk having "
+"ambiguous puzzles. (Also, finding \\e{all} the possible solutions can be an "
+"additional challenge for an advanced player.)"
+msgstr ""
+"Normalerweise wird Net sicherstellen, dass die vorgestellten Puzzle nur eine "
+"einzige Lösung haben. Puzzle mit mehrdeutigen Abschnitten können schwieriger "
+"und subtiler sein, falls Sie dies mögen, können Sie daher diese "
+"Funktionalität abschalten und mit dem Risiko leben, mehrdeutige Puzzle zu "
+"erhalten. (Für fortgeschrittene Spieler kann es auch eine zusätzliche "
+"Herausforderung sein, \\e{alle} möglichen Lösungen zu finden.)"
+
+#. type: Plain text
+#: puzzles.but:534
+msgid "\\i{Cube}"
+msgstr "\\i{Cube}"
+
+#. type: Plain text
+#: puzzles.but:536
+msgid "\\cfg{winhelp-topic}{games.cube}"
+msgstr "\\cfg{winhelp-topic}{games.cube}"
+
+#. type: Plain text
+#: puzzles.but:548
+msgid ""
+"This is another one I originally saw as a web game. This one was a Java game "
+"\\k{cube-java-game}, by Paul Scott. You have a grid of 16 squares, six of "
+"which are blue; on one square rests a cube. Your move is to use the arrow "
+"keys to roll the cube through 90 degrees so that it moves to an adjacent "
+"square. If you roll the cube on to a blue square, the blue square is picked "
+"up on one face of the cube; if you roll a blue face of the cube on to a non-"
+"blue square, the blueness is put down again. (In general, whenever you roll "
+"the cube, the two faces that come into contact swap colours.) Your job is to "
+"get all six blue squares on to the six faces of the cube at the same time. "
+"Count your moves and try to do it in as few as possible."
+msgstr ""
+"Dies ist ein weiteres Spiel, das ich ursprünglich als Web-Spiel sah. Dies "
+"war ein Java-Spiel \\k{cube-java-game} von Paul Scott. Sie haben ein Gitter "
+"von 16 Quadraten von denen sechs blau sind. Auf einem Quadrat ruht ein "
+"Würfel. Ihr Spielzug besteht darin, den Würfel mit den Pfeiltasten um 90 "
+"Grad zu rollen, so dass er sich auf ein benachbartes Quadrat bewegt. Falls "
+"Sie den Würfel auf ein blaues Quadrat rollen, wird das blaue Quadrat auf der "
+"einen Seite des Würfels aufgenommen; falls Sie eine blaue Seite des Würfels "
+"auf ein nicht blaues Quadrat rollen, wird die blaue Farbe wieder auf das "
+"Quadrat abgelegt. (Allgemeiner gesagt, tauschen die Würfelseite und das "
+"Quadrat, auf dem der Würfel nach dem Rollen liegt, ihre Farben). Ihre "
+"Aufgabe besteht darin, alle sechs blauen Quadrate gleichzeitig auf die sechs "
+"Seiten des Würfels zu bekommen. Zählen Sie Ihre Spielzüge und versuchen Sie, "
+"die Lösung mit so wenig Spielzügen wie möglich zu erreichen."
+
+#. type: Plain text
+#: puzzles.but:553
+msgid ""
+"Unlike the original Java game, my version has an additional feature: once "
+"you've mastered the game with a cube rolling on a square grid, you can "
+"change to a triangular grid and roll any of a tetrahedron, an octahedron or "
+"an icosahedron."
+msgstr ""
+"Anders als das ursprüngliche Java-Spiel hat meine Version eine zusätzliche "
+"Funktionalität: Sobald Sie das Spiel mit einem Würfel, der auf einem "
+"Quadratgitter rollt, geschafft haben, können Sie das auf ein dreieckiges "
+"Gitter umschalten und entweder einen Tetraeder, einen Oktaeder oder einen "
+"Ikosaeder rollen."
+
+#. type: Plain text
+#: puzzles.but:555
+msgid ""
+"\\W{http://www3.sympatico.ca/paulscott/cube/cube.htm}\\cw{http://www3."
+"sympatico.ca/paulscott/cube/cube.htm}"
+msgstr ""
+"\\W{http://www3.sympatico.ca/paulscott/cube/cube.htm}\\cw{http://www3."
+"sympatico.ca/paulscott/cube/cube.htm}"
+
+#. type: Plain text
+#: puzzles.but:557
+msgid "\\i{Cube controls}"
+msgstr "\\i{Cube-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:558 puzzles.but:559 puzzles.but:560
+msgid "Cube controls"
+msgstr "Cube-Steuerung"
+
+#. type: IM
+#: puzzles.but:558
+#, no-wrap
+msgid "controls, for Cube"
+msgstr "Steuerung, von Cube"
+
+#. type: IM
+#: puzzles.but:559
+#, no-wrap
+msgid "keys, for Cube"
+msgstr "Tasten, für Cube"
+
+#. type: IM
+#: puzzles.but:560
+#, no-wrap
+msgid "shortcuts (keyboard), for Cube"
+msgstr "Tastaturkürzel, für Cube"
+
+#. type: Plain text
+#: puzzles.but:563 puzzles.but:1189 puzzles.but:1264 puzzles.but:1322
+msgid "This game can be played with either the keyboard or the mouse."
+msgstr ""
+"Dieses Spiel kann entweder mit der Tastatur oder der Maus gespielt werden."
+
+#. type: Plain text
+#: puzzles.but:566
+msgid ""
+"Left-clicking anywhere on the window will move the cube (or other solid) "
+"towards the mouse pointer."
+msgstr ""
+"Durch Linksklick an einer beliebigen Stelle im Fenster wird der Würfel (oder "
+"anderer Körper) zum Mauszeiger hin bewegt."
+
+#. type: Plain text
+#: puzzles.but:573
+msgid ""
+"The arrow keys can also used to roll the cube on its square grid in the four "
+"cardinal directions.  On the triangular grids, the mapping of arrow keys to "
+"directions is more approximate. Vertical movement is disallowed where it "
+"doesn't make sense. The four keys surrounding the arrow keys on the numeric "
+"keypad (\\q{7}, \\q{9}, \\q{1}, \\q{3}) can be used for diagonal movement."
+msgstr ""
+"Die Pfeiltasten können auch dazu verwandt werden, den Würfel auf seinem "
+"Quadratgitter in die vier Hauptrichtungen zu rollen. Auf den dreieckigen "
+"Gittern ist die Abbildung der Pfeiltasten auf die Richtungen eher ungefähr. "
+"Vertikale Bewegungen sind nicht erlaubt, falls sie keinen Sinn ergeben. Die "
+"vier Tasten, die sich um die Pfeiltasten im numerischen Zahlenblock befinden "
+"(\\q{7}, \\q{9}, \\q{1}, \\q{3}) können für diagonale Bewegungen verwandt "
+"werden."
+
+#. type: Plain text
+#: puzzles.but:577
+msgid "\\I{parameters, for Cube}Cube parameters"
+msgstr "\\I{Parameter, für Cube}Cube-Parameter"
+
+#. type: e{#1}
+#: puzzles.but:582
+msgid "Type of solid"
+msgstr "Art des Körpers"
+
+#. type: Plain text
+#: puzzles.but:585
+msgid ""
+"Selects the solid to roll (and hence the shape of the grid): tetrahedron, "
+"cube, octahedron, or icosahedron."
+msgstr ""
+"Wählt die Art des zu rollenden Körpers (und damit die Form des Gitters) aus: "
+"Tetraeder, Würfel, Oktaeder oder Ikosaeder."
+
+#. type: Plain text
+#: puzzles.but:587
+msgid "\\e{Width / top}, \\e{Height / bottom}"
+msgstr "\\e{Breite / oben}, \\e{Höhe / unten}"
+
+#. type: Plain text
+#: puzzles.but:591
+msgid ""
+"On a square grid, horizontal and vertical dimensions. On a triangular grid, "
+"the number of triangles on the top and bottom rows respectively."
+msgstr ""
+"Auf einem Quadratgitter die horizontalen und vertikalen Dimensionen. Auf "
+"einem Dreiecksgitter jeweils die Anzahl der Dreiecke in der obersten und "
+"untersten Reihe."
+
+#. type: Plain text
+#: puzzles.but:594
+msgid "\\i{Fifteen}"
+msgstr "\\i{Fifteen}"
+
+#. type: Plain text
+#: puzzles.but:596
+msgid "\\cfg{winhelp-topic}{games.fifteen}"
+msgstr "\\cfg{winhelp-topic}{games.fifteen}"
+
+#. type: Plain text
+#: puzzles.but:604
+msgid ""
+"The old ones are the best: this is the good old \\q{\\i{15-puzzle}} with "
+"sliding tiles. You have a 4\\by\\.4 square grid; 15 squares contain numbered "
+"tiles, and the sixteenth is empty. Your move is to choose a tile next to the "
+"empty space, and slide it into the space.  The aim is to end up with the "
+"tiles in numerical order, with the space in the bottom right (so that the "
+"top row reads 1,2,3,4 and the bottom row reads 13,14,15,\\e{space})."
+msgstr ""
+"Die alten sind die besten: Dies ist das gute alte \\q{\\i{15er-Puzzle}} mit "
+"verschiebbaren Platten. Sie verfügen Ã¼ber ein 4\\by\\.4 Quadratgitter; 15 "
+"Quadrate enthalten Platten mit Nummer und das sechzehnte Quadrat ist leer. "
+"Sie wählen eine Platte neben dem Leerraum aus und verschieben sie auf den "
+"Leerraum. Das Ziel besteht darin, die Platten am Ende in numerischer "
+"Reihenfolge anzuordnen, wobei der Leerraum sich unten rechts befindet (so "
+"dass in der obersten Zeile 1,2,3,4 und in der untersten Zeile 13,14,15,"
+"\\e{Leerraum} steht)."
+
+#. type: Plain text
+#: puzzles.but:606
+msgid "\\i{Fifteen controls}"
+msgstr "\\i{Fifteen-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:607 puzzles.but:608 puzzles.but:609
+msgid "Fifteen controls"
+msgstr "Fifteen-Steuerung"
+
+#. type: IM
+#: puzzles.but:607
+#, no-wrap
+msgid "controls, for Fifteen"
+msgstr "Steuerung, von Fifteen"
+
+#. type: IM
+#: puzzles.but:608
+#, no-wrap
+msgid "keys, for Fifteen"
+msgstr "Tasten, für Fifteen"
+
+#. type: IM
+#: puzzles.but:609
+#, no-wrap
+msgid "shortcuts (keyboard), for Fifteen"
+msgstr "Tastaturkürzel, für Fifteen"
+
+#. type: Plain text
+#: puzzles.but:612
+msgid "This game can be controlled with the mouse or the keyboard."
+msgstr "Dieses Spiel kann mit der Maus oder der Tastatur gespielt werden."
+
+#. type: Plain text
+#: puzzles.but:616
+msgid ""
+"A left-click with the mouse in the row or column containing the empty space "
+"will move as many tiles as necessary to move the space to the mouse pointer."
+msgstr ""
+"Ein Linksklick mit der Maus in die Zeile oder Spalte, die den Leerraum "
+"enthält, bewegt so viele Platten wie notwendig, um den Leerraum zum "
+"Mauszeiger zu bewegen."
+
+#. type: Plain text
+#: puzzles.but:619
+msgid ""
+"The arrow keys will move a tile adjacent to the space in the direction "
+"indicated (moving the space in the \\e{opposite} direction)."
+msgstr ""
+"Die Pfeiltasten bewegen eine Platte, die neben dem Leerraum liegt, in die "
+"angegebene Richtung (und damit den Leerraum in die \\e{entgegengesetzte} "
+"Richtung)."
+
+#. type: Plain text
+#: puzzles.but:623
+msgid ""
+"Pressing \\q{h} will make a suggested move.  Pressing \\q{h} enough times "
+"will solve the game, but it may scramble your progress while doing so."
+msgstr ""
+"Durch Druck von \\q{h} wird eine vorgeschlagene Bewegung durchgeführt. Durch "
+"Druck von \\q{h} wird das Spiel gelöst, aber Ihr Fortschritt könnte dabei "
+"durcheinander geraten."
+
+#. type: Plain text
+#: puzzles.but:627
+msgid "\\I{parameters, for Fifteen}Fifteen parameters"
+msgstr "\\I{Parameter, für Fifteen}Fifteen-Parameter"
+
+#. type: Plain text
+#: puzzles.but:631
+msgid ""
+"The only options available from the \\q{Custom...} option on the \\q{Type} "
+"menu are \\e{Width} and \\e{Height}, which are self-explanatory. (Once "
+"you've changed these, it's not a \\q{15-puzzle} any more, of course!)"
+msgstr ""
+"Die einzigen unter \\q{Custom...} im Menü \\q{Type} verfügbaren Optionen "
+"sind die \\e{Width} (Breite) und \\e{Height} (Höhe), die selbsterklärend "
+"sind. (Sobald Sie diese Ã¤ndern, ist es natürlich kein \\q{15er Puzzle} mehr!)"
+
+#. type: Plain text
+#: puzzles.but:634
+msgid "\\i{Sixteen}"
+msgstr "\\i{Sixteen}"
+
+#. type: Plain text
+#: puzzles.but:636
+msgid "\\cfg{winhelp-topic}{games.sixteen}"
+msgstr "\\cfg{winhelp-topic}{games.sixteen}"
+
+#. type: Plain text
+#: puzzles.but:646
+msgid ""
+"Another sliding tile puzzle, visually similar to Fifteen (see \\k{fifteen}) "
+"but with a different type of move. This time, there is no hole: all 16 "
+"squares on the grid contain numbered squares. Your move is to shift an "
+"entire row left or right, or shift an entire column up or down; every time "
+"you do that, the tile you shift off the grid re-appears at the other end of "
+"the same row, in the space you just vacated. To win, arrange the tiles into "
+"numerical order (1,2,3,4 on the top row, 13,14,15,16 on the bottom). When "
+"you've done that, try playing on different sizes of grid."
+msgstr ""
+"Ein weiteres Puzzle mit verschiebbaren Platten, visuell sehr Ã¤hnlich zu "
+"Fifteen (siehe\\k{fifteen})), aber mit einer anderen Art von Spielzügen. "
+"Diesmal gibt es kein Loch: Alle 16 Quadrate auf dem Gitter enthalten "
+"nummerierte Quadrate. Ihr Spielzug besteht darin, eine gesamte Zeile nach "
+"links oder rechts zu verschieben oder eine gesamte Spalte nach oben oder "
+"unten zu verschieben. Jedesmal, wenn Sie dies tun, erscheint die Platte, die "
+"Sie vom Gitter verschieben am anderen Ende der gleichen Zeile am Platz, den "
+"Sie gerade freigelegt haben. Um zu gewinnen, müssen Sie die Platten in "
+"numerischer Reihenfolge anordnen (1,2,3,4 in der obersten Reihe und "
+"13,14,15,16 in der untersten). Wenn Sie das erreicht haben, versuchen Sie "
+"auf einer anderen Gittergröße zu spielen."
+
+#. type: Plain text
+#: puzzles.but:654
+msgid ""
+"I \\e{might} have invented this game myself, though only by accident if so "
+"(and I'm sure other people have independently invented it). I thought I was "
+"imitating a screensaver I'd seen, but I have a feeling that the screensaver "
+"might actually have been a Fifteen-type puzzle rather than this slightly "
+"different kind. So this might be the one thing in my puzzle collection which "
+"represents creativity on my part rather than just engineering."
+msgstr ""
+"Ich \\e{könnte} das Spiel selbst erfunden haben, allerdings dann nur "
+"versehentlich (und ich bin mir sicher, unabhängig davon haben andere Leute "
+"es auch erfunden). Ich dachte, ich imitierte einen Bildschirmschoner, den "
+"ich gesehen hatte, aber ich denke, dass der Bildschirmschoner tatsächlich "
+"ein Fifteen-artiges Puzzle statt dieses leicht verschiedene gewesen sein "
+"könnte. Daher könnte dies das einzige Ding in meiner Puzzle-Sammlung sein, "
+"das Kreativität von meiner Seite statt reiner Umsetzungsarbeit zeigt."
+
+#. type: Plain text
+#: puzzles.but:656
+msgid "\\I{controls, for Sixteen}Sixteen controls"
+msgstr "\\I{Steuerung, von Sixteen}Sixteen-Steuerung"
+
+#. type: Plain text
+#: puzzles.but:660
+msgid ""
+"Left-clicking on an arrow will move the appropriate row or column in the "
+"direction indicated.  Right-clicking will move it in the opposite direction."
+msgstr ""
+"Durch Linksklick auf einen Pfeil wird die zugehörige Zeile oder Spalte in "
+"die angezeigte Richtung bewegt. Durch Rechtsklick wird sie in die "
+"entgegengesetzte Richtung bewegt."
+
+#. type: Plain text
+#: puzzles.but:664
+msgid ""
+"Alternatively, use the cursor keys to move the position indicator around the "
+"edge of the grid, and use the return key to move the row/column in the "
+"direction indicated."
+msgstr ""
+"Verwenden Sie alternativ die Pfeiltasten, um den Positionsanzeiger um den "
+"Rand des Gitters zu bewegen und verwenden Sie die Eingabetaste, um die Zeile/"
+"Spalte in die angegebene Richtung zu bewegen."
+
+#. type: Plain text
+#: puzzles.but:671
+msgid ""
+"You can also move the tiles directly.  Move the cursor onto a tile, hold "
+"Control and press an arrow key to move the tile under the cursor and move "
+"the cursor along with the tile.  Or, hold Shift to move only the tile.  "
+"Pressing Enter simulates holding down Control (press Enter again to "
+"release), while pressing Space simulates holding down shift."
+msgstr ""
+"Sie können die Kacheln auch direkt bewegen. Bewegen Sie den Cursor auf eine "
+"Kachel, halten Sie Strg und bewegen Sie die Pfeiltasten, um die Kachel unter "
+"dem Cursor zu bewegen und verschieben Sie den Cursor zusammen mit der "
+"Kachel. Oder halten Sie Umschalten und verschieben Sie nur die Kachel. Der "
+"Druck der Eingabetaste simuliert das Halten von Strg (durch erneuten Druck "
+"der Eingabetaste wird dies wieder aufgelöst), das Drücken der Leertaste "
+"simuliert das Halten der Umschalttaste."
+
+#. type: Plain text
+#: puzzles.but:675
+msgid "\\I{parameters, for Sixteen}Sixteen parameters"
+msgstr "\\I{Parameter, für Sixteen}Sixteen-Parameter"
+
+#. type: Plain text
+#: puzzles.but:678
+msgid ""
+"The parameters available from the \\q{Custom...} option on the \\q{Type} "
+"menu are:"
+msgstr ""
+"Die von der Option \\q{Custom...} im Menü \\q{Type} verfügbaren Parameter "
+"lauten:"
+
+#. type: Plain text
+#: puzzles.but:680
+msgid "\\e{Width} and \\e{Height}, which are self-explanatory."
+msgstr "\\e{Width} (Breite) und \\e{Height} (Höhe) sind selbsterklärend."
+
+#. type: Plain text
+#: puzzles.but:690
+msgid ""
+"You can ask for a limited shuffling operation to be performed on the grid. "
+"By default, Sixteen will shuffle the grid in such a way that any arrangement "
+"is about as probable as any other. You can override this by requesting a "
+"precise number of shuffling moves to be performed. Typically your aim is "
+"then to determine the precise set of shuffling moves and invert them "
+"exactly, so that you answer (say) a four-move shuffle with a four-move "
+"solution. Note that the more moves you ask for, the more likely it is that "
+"solutions shorter than the target length will turn out to be possible."
+msgstr ""
+"Sie können darum bitten, dass auf dem Gitter nur eine begrenzte Vermischungs-"
+"Operation durchgeführt wird. Standardmäßig wird Sixteen das Gitter so "
+"vermischen, dass jede Anordnung gleich wahrscheinlich ist. Sie können dieses "
+"Verhalten Ã¤ndern, indem Sie eine genaue Anzahl an Vermischungsspielzüge "
+"angeben, die ausgeführt werden sollen. Typischerweise besteht dann Ihr Ziel "
+"darin, die genaue Menge an Vermischungsspielzügen zu bestimmen und diese "
+"dann genau zu invertieren, so dass Sie beispielsweise eine vierzügige "
+"Vermischung mit einer vierzügigen Lösung beantworten. Beachten Sie, dass bei "
+"einer größeren Anzahl an Spielzügen die Wahrscheinlichkeit steigt, dass "
+"Lösungen kürzer als die Zielanzahl möglich werden."
+
+#. type: Plain text
+#: puzzles.but:693
+msgid "\\i{Twiddle}"
+msgstr "\\i{Twiddle}"
+
+#. type: Plain text
+#: puzzles.but:695
+msgid "\\cfg{winhelp-topic}{games.twiddle}"
+msgstr "\\cfg{winhelp-topic}{games.twiddle}"
+
+#. type: Plain text
+#: puzzles.but:700
+msgid ""
+"Twiddle is a tile-rearrangement puzzle, visually similar to Sixteen (see "
+"\\k{sixteen}): you are given a grid of square tiles, each containing a "
+"number, and your aim is to arrange the numbers into ascending order."
+msgstr ""
+"Twiddle ist ein Platten-Neuanordnungspuzzle, visuell Ã¤hnlich zu Sixteen "
+"(siehe \\k{sixteen}). Sie bekommen ein Gitter von quadratischen Kacheln, die "
+"jede eine Zahl enthalten und Ihr Ziel besteht darin, diese in aufsteigender "
+"Reihenfolge anzuordnen."
+
+#. type: Plain text
+#: puzzles.but:705
+msgid ""
+"In basic Twiddle, your move is to rotate a square group of four tiles about "
+"their common centre. (Orientation is not significant in the basic puzzle, "
+"although you can select it.) On more advanced settings, you can rotate a "
+"larger square group of tiles."
+msgstr ""
+"In der grundlegenden Variante besteht Ihr Spielzug in Twiddle darin, eine "
+"Gruppe von vier Platten um ihr gemeinsames Zentrum zu rotieren. (In der "
+"grundlegenden Variante des Puzzles ist die Ausrichtung nicht wichtig; Sie "
+"können dies aber auswählen). Bei fortgeschritteneren Einstellungen können "
+"Sie auch größere Quadratgruppen von Platten rotieren."
+
+#. type: Plain text
+#: puzzles.but:710
+msgid ""
+"I first saw this type of puzzle in the GameCube game \\q{Metroid Prime 2}. "
+"In the Main Gyro Chamber in that game, there is a puzzle you solve to unlock "
+"a door, which is a special case of Twiddle. I developed this game as a "
+"generalisation of that puzzle."
+msgstr ""
+"Ich habe diese Art von Puzzlen das erste Mal in dem GameCube-Spiel "
+"\\q{Metroid Prime 2} gesehen. In der Haupt-Gyro-Kammer dieses Spiels gibt es "
+"ein Puzzle, das Sie lösen müssen, um eine Tür zu entsperren, was einen "
+"Spezialfall von Twiddle darstellt. Ich entwickelte dieses Spiel als "
+"Verallgemeinerung dieses Puzzles."
+
+#. type: Plain text
+#: puzzles.but:712
+msgid "\\I{controls, for Twiddle}Twiddle controls"
+msgstr "\\I{Steuerung, von Twiddle}Twiddle-Steuerung"
+
+#. type: Plain text
+#: puzzles.but:717
+msgid ""
+"To play Twiddle, click the mouse in the centre of the square group you wish "
+"to rotate. In the basic mode, you rotate a 2\\by\\.2 square, which means you "
+"have to click at a corner point where four tiles meet."
+msgstr ""
+"Um Twiddle zu spielen, klicken Sie mit der Maus in das Zentrum der "
+"Quadratgruppe, die Sie rotieren möchten. Im grundlegenden Modus rotieren Sie "
+"ein 2\\by\\.2-Gitter, was bedeutet, dass Sie auf den Eckpunkt klicken "
+"müssen, an dem sich die vier Platten treffen."
+
+#. type: Plain text
+#: puzzles.but:721
+msgid ""
+"In more advanced modes you might be rotating 3\\by\\.3 or even more at a "
+"time; if the size of the square is odd then you simply click in the centre "
+"tile of the square you want to rotate."
+msgstr ""
+"In fortgeschritteneren Modi könnten Sie 3\\by\\.3 oder sogar mehr auf einmal "
+"rotieren; falls die Anzahl der Quadrate ungerade ist, klicken Sie einfach in "
+"das Zentrum des Quadrates, das Sie rotieren möchten."
+
+#. type: Plain text
+#: puzzles.but:724
+msgid ""
+"Clicking with the left mouse button rotates the group anticlockwise.  "
+"Clicking with the right button rotates it clockwise."
+msgstr ""
+"Durch einen Klick mit der linken Maustaste rotieren Sie die Gruppe gegen den "
+"Uhrzeigersinn. Durch einen Klick mit der rechten Taste rotieren Sie sie im "
+"Uhrzeigersinn."
+
+#. type: Plain text
+#: puzzles.but:729
+msgid ""
+"You can also move an outline square around the grid with the cursor keys; "
+"the square is the size above (2\\by\\.2 by default, or larger).  Pressing "
+"the return key or space bar will rotate the current square anticlockwise or "
+"clockwise respectively."
+msgstr ""
+"Sie können auch ein Umrissquadrat Ã¼ber das Gitter mit den Pfeiltasten "
+"bewegen. Das Quadrat hat die oben genannte Größe (standardmäßig 2\\by\\.2 "
+"oder größer). Durch die Eingabe- oder Leertaste wird das aktuelle Quadrat "
+"gegen oder respektive mit dem Uhrzeigersinn gedreht."
+
+#. type: Plain text
+#: puzzles.but:733
+msgid "\\I{parameters, for Twiddle}Twiddle parameters"
+msgstr "\\I{Parameter, für Twiddle}Twiddle-Parameter"
+
+#. type: Plain text
+#: puzzles.but:736
+msgid ""
+"Twiddle provides several configuration options via the \\q{Custom} option on "
+"the \\q{Type} menu:"
+msgstr ""
+"Twiddle stellt mehrere Konfigurationsmöglichkeiten Ã¼ber die Option "
+"\\q{Custom} im Menü \\q{Type} bereit:"
+
+#. type: Plain text
+#: puzzles.but:738
+msgid "You can configure the width and height of the puzzle grid."
+msgstr "Sie können die Höhe und die Breite des Puzzle-Gitters konfigurieren."
+
+#. type: Plain text
+#: puzzles.but:740
+msgid "You can configure the size of square block that rotates at a time."
+msgstr ""
+"Sie können die Größe des Quadratblocks, der auf einmal rotiert, "
+"konfigurieren."
+
+#. type: Plain text
+#: puzzles.but:746
+msgid ""
+"You can ask for every square in the grid to be distinguishable (the "
+"default), or you can ask for a simplified puzzle in which there are groups "
+"of identical numbers. In the simplified puzzle your aim is just to arrange "
+"all the 1s into the first row, all the 2s into the second row, and so on."
+msgstr ""
+"Sie können einstellen, dass jedes Quadrat im Gitter unterscheidbar sein soll "
+"(dies ist die Voreinstellung) oder Sie können ein vereinfachtes Puzzle "
+"einstellen, bei dem es Gruppen mit identischen Zahlen gibt. Im vereinfachten "
+"Puzzle besteht Ihr Ziel darin, alle 1en in die erste Zeile zu bringen, alle "
+"2en in die zweite usw."
+
+#. type: Plain text
+#: puzzles.but:751
+msgid ""
+"You can configure whether the orientation of tiles matters. If you ask for "
+"an orientable puzzle, each tile will have a triangle drawn in it. All the "
+"triangles must be pointing upwards to complete the puzzle."
+msgstr ""
+"Sie können einstellen, ob die Orientierung der Platten relevant ist. Falls "
+"Sie ein orientierbares Puzzle einstellen, wird auf jede Platte ein Dreieck "
+"gezeichnet. Alle Dreiecke müssen nach oben zeigen, um das Puzzle zu lösen."
+
+#. type: Plain text
+#: puzzles.but:761
+msgid ""
+"You can ask for a limited shuffling operation to be performed on the grid. "
+"By default, Twiddle will shuffle the grid so much that any arrangement is "
+"about as probable as any other. You can override this by requesting a "
+"precise number of shuffling moves to be performed.  Typically your aim is "
+"then to determine the precise set of shuffling moves and invert them "
+"exactly, so that you answer (say) a four-move shuffle with a four-move "
+"solution. Note that the more moves you ask for, the more likely it is that "
+"solutions shorter than the target length will turn out to be possible."
+msgstr ""
+"Sie können um eine begrenzte Vermischungsoperation auf dem Gitter bitten. "
+"Standardmäßig vermischt Twiddle das Gitter so, dass jede Anordnung "
+"gleichwahrscheinlich ist. Sie können dies Ã¤ndern, indem Sie um eine genaue "
+"Anzahl an auszuführenden Vermischungs-Spielzügen bitten. Typischerweise "
+"Typischerweise besteht dann Ihr Ziel darin, die genaue Menge an "
+"Vermischungsspielzügen zu bestimmen und diese dann genau zu invertieren, so "
+"dass Sie beispielsweise eine vierzügige Vermischung mit einer vierzügigen "
+"Lösung beantworten. Beachten Sie, dass bei einer größeren Anzahl an "
+"Spielzügen die Wahrscheinlichkeit steigt, dass Lösungen kürzer als die "
+"Zielanzahl möglich werden."
+
+#. type: Plain text
+#: puzzles.but:764
+msgid "\\i{Rectangles}"
+msgstr "\\i{Rectangles}"
+
+#. type: Plain text
+#: puzzles.but:766
+msgid "\\cfg{winhelp-topic}{games.rectangles}"
+msgstr "\\cfg{winhelp-topic}{games.rectangles}"
+
+#. type: Plain text
+#: puzzles.but:772
+msgid ""
+"You have a grid of squares, with numbers written in some (but not all)  of "
+"the squares. Your task is to subdivide the grid into rectangles of various "
+"sizes, such that (a) every rectangle contains exactly one numbered square, "
+"and (b) the area of each rectangle is equal to the number written in its "
+"numbered square."
+msgstr ""
+"Sie verfügen Ã¼ber ein Gitter von Quadraten, bei denen auf einigen (aber "
+"nicht allen) Quadraten Nummern aufgebracht sind. Ihre Aufgabe besteht darin, "
+"das Gitter in Rechtecke verschiedener Größe zu unterteilen, so dass (a) "
+"jedes Rechteck genau ein nummeriertes Quadrat enthält und (b) die Größe des "
+"Rechtecks mit der Zahl auf dem nummerierten Quadrat Ã¼bereinstimmt."
+
+#. type: Plain text
+#: puzzles.but:781
+msgid ""
+"Credit for this game goes to the Japanese puzzle magazine \\i{Nikoli} "
+"\\k{nikoli-rect}; I've also seen a Palm implementation at \\i{Puzzle Palace} "
+"\\k{puzzle-palace-rect}. Unlike Puzzle Palace's implementation, my version "
+"automatically generates random grids of any size you like. The quality of "
+"puzzle design is therefore not quite as good as hand-crafted puzzles would "
+"be, but on the plus side you get an inexhaustible supply of puzzles tailored "
+"to your own specification."
+msgstr ""
+"Die Danksagung für dieses Spiel geht an das japanische Puzzlemagazin "
+"\\i{Nikoli} \\k{nikoli-rect}; ich habe auch eine Palm-Implementierung im "
+"\\i{Puzzle Palace} \\k{puzzle-palace-rect} gesehen. Anders als bei der "
+"Implementierung von Puzzle Palace generiert meine Version automatisch Gitter "
+"in jeder Größe, die Sie wünschen. Die Qualität des Puzzle-Designs ist daher "
+"nicht ganz so gut wie bei handerstellten Puzzlen, aber auf der Haben-Seite "
+"erhalten Sie einen nicht endenden Vorrat von Puzzles, angepasst an Ihre "
+"eigenen Spezifikationen."
+
+#. type: Plain text
+#: puzzles.but:784
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/shikaku.html}\\cw{http://www.nikoli."
+"co.jp/en/puzzles/shikaku.html} (beware of Flash)"
+msgstr "\\W{http://www.nikoli.co.jp/en/puzzles/shikaku.html}\\cw{http://www.nikoli.co.jp/en/puzzles/shikaku.html} (Achtung Flash)"
+
+#. type: Plain text
+#: puzzles.but:786
+msgid ""
+"\\W{https://web.archive.org/web/20041024001459/http://www.puzzle.gr.jp/"
+"puzzle/sikaku/palm/index.html.en}\\cw{https://web.archive.org/"
+"web/20041024001459/http://www.puzzle.gr.jp/puzzle/sikaku/palm/index.html.en}"
+msgstr "\\W{https://web.archive.org/web/20041024001459/http://www.puzzle.gr.jp/puzzle/sikaku/palm/index.html.en}\\cw{https://web.archive.org/web/20041024001459/http://www.puzzle.gr.jp/puzzle/sikaku/palm/index.html.en}"
+
+#. type: Plain text
+#: puzzles.but:788
+msgid "\\I{controls, for Rectangles}Rectangles controls"
+msgstr "\\I{Steuerung, von Rectangles}Rectangles-Steuerung"
+
+#. type: Plain text
+#: puzzles.but:790
+msgid "This game is played with the mouse or cursor keys."
+msgstr "Dieses Spiel wird mit der Maus oder den Pfeiltasten gespielt."
+
+#. type: Plain text
+#: puzzles.but:795
+msgid ""
+"Left-click any edge to toggle it on or off, or left-click and drag to draw "
+"an entire rectangle (or line) on the grid in one go (removing any existing "
+"edges within that rectangle). Right-clicking and dragging will allow you to "
+"erase the contents of a rectangle without affecting its edges."
+msgstr ""
+"Klicken Sie links auf eine Ecke, um Sie ein- oder auszuschalten oder klicken "
+"Sie links und ziehen Sie, um das gesamte Rechteck (oder eine Linie) auf dem "
+"Gitter in einem Durchlauf zu zeichnen (und dabei alle existierenden Ecken "
+"innerhalb des Rechtecks zu entfernen). Durch Rechtsklick und Ziehen können "
+"Sie den Inhalt eines Rechtecks löschen, ohne seine Ecken zu beeinflussen."
+
+#. type: Plain text
+#: puzzles.but:803
+msgid ""
+"Alternatively, use the cursor keys to move the position indicator around the "
+"board. Pressing the return key then allows you to use the cursor keys to "
+"drag a rectangle out from that position, and pressing the return key again "
+"completes the rectangle. Using the space bar instead of the return key "
+"allows you to erase the contents of a rectangle without affecting its edges, "
+"as above. Pressing escape cancels a drag."
+msgstr ""
+"Alternativ verwenden Sie die Pfeiltasten, um den Positionsanzeiger Ã¼ber das "
+"Brett zu bewegen. Durch Drücken der Eingabetaste können Sie dann mit den "
+"Pfeiltasten ein Rechteck von dieser Position aus ziehen und durch erneutes "
+"Drücken der Eingabetaste das Rechteck abschließen. Verwenden Sie die "
+"Leertaste statt der Eingabetaste, um den Inhalt eines Rechtecks zu löschen, "
+"ohne dessen Ecken zu beeinflussen, wie oben. Durch Drücken der Taste Esc wird "
+"das Ziehen abgebrochen."
+
+#. type: Plain text
+#: puzzles.but:805
+msgid "When a rectangle of the correct size is completed, it will be shaded."
+msgstr ""
+"Wenn ein Rechteck der korrekten Größe fertiggestellt ist, wir es schattiert."
+
+#. type: Plain text
+#: puzzles.but:809
+msgid "\\I{parameters, for Rectangles}Rectangles parameters"
+msgstr "\\I{Parameter, für Rectangles}Rectangles-Parameter"
+
+#. type: Plain text
+#: puzzles.but:816
+msgid "Size of grid, in squares."
+msgstr "Größe des Gitters, in Quadraten."
+
+#. type: e{#1}
+#: puzzles.but:818
+msgid "Expansion factor"
+msgstr "Expansion factor"
+
+#. type: Plain text
+#: puzzles.but:824
+msgid ""
+"This is a mechanism for changing the type of grids generated by the program. "
+"Some people prefer a grid containing a few large rectangles to one "
+"containing many small ones. So you can ask Rectangles to essentially "
+"generate a \\e{smaller} grid than the size you specified, and then to expand "
+"it by adding rows and columns."
+msgstr ""
+"Dies ist ein Mechanismus, um die Art der vom Programm erzeugten Gitter zu "
+"ändern. Einige Leute bevorzugen ein Gitter, das wenige große Rechtecke "
+"enthält, gegenüber Gittern mit vielen kleinen. Daher können Sie Rectangles "
+"auffordern, ein \\e{kleineres} Gitter als die angegebene Größe zu erstellen "
+"und es dann durch Hinzunahme von Spalten und Zeilen zu vergrößern."
+
+#. type: Plain text
+#: puzzles.but:842
+msgid ""
+"The default expansion factor of zero means that Rectangles will simply "
+"generate a grid of the size you ask for, and do nothing further. If you set "
+"an expansion factor of (say) 0.5, it means that each dimension of the grid "
+"will be expanded to half again as big after generation. In other words, the "
+"initial grid will be 2/3 the size in each dimension, and will be expanded to "
+"its full size without adding any more rectangles."
+msgstr ""
+"Der standardmäßige Ausdehnungsfaktor von Null bedeutet, dass Rectangles "
+"einfach ein Gitter in der von Ihnen angeforderten Größe erstellt und nichts "
+"weiter unternimmt. Falls Sie einen Ausdehnungsfaktor von beispielsweise 0.5 "
+"setzen, bedeutet dies, dass jede Dimension des Gitters nach der Erstellung "
+"um die Hälfte vergrößert wird. Mit anderen Worten, das ursprüngliche Gitter "
+"wird 2/3 der Größe in jeder Dimension haben und wird dann auf seine "
+"komplette Größe ausgedehnt, ohne dass weitere Rechtecke hinzugefügt werden."
+
+#. type: Plain text
+#: puzzles.but:842
+msgid ""
+"Setting an expansion factor of around 0.5 tends to make the game more "
+"difficult, and also (in my experience) rewards a less deductive and more "
+"intuitive playing style. If you set it \\e{too} high, though, the game "
+"simply cannot generate more than a few rectangles to cover the entire grid, "
+"and the game becomes trivial."
+msgstr ""
+"Das Setzen eines Ausdehnungsfaktors von ungefähr 0.5 erschwert das Spiel "
+"typischerweise und belohnt (in meiner Erfahrung) mit einem weniger "
+"erschließbaren und mehr intuitiven Spielstil. Falls Sie ihn allerdings "
+"\\e{zu} hoch setzen, kann das Spiel nicht mehr als ein paar Rechtecke zum "
+"Abdecken des gesamten Gitters erstellen und das Spiel wird trivial lösbar."
+
+#. type: Plain text
+#: puzzles.but:851
+msgid ""
+"Normally, Rectangles will make sure that the puzzles it presents have only "
+"one solution. Puzzles with ambiguous sections can be more difficult and more "
+"subtle, so if you like you can turn off this feature and risk having "
+"ambiguous puzzles. Also, finding \\e{all} the possible solutions can be an "
+"additional challenge for an advanced player. Turning off this option can "
+"also speed up puzzle generation."
+msgstr ""
+"Normalerweise sorgt Rectangles dafür, dass die angebotenen Puzzles nicht "
+"mehr als eine Lösung haben. Puzzles mit mehrdeutigen Abschnitten können "
+"schwieriger und subtiler sein, falls Sie dies mögen können Sie daher diese "
+"Funktion ausschalten und riskieren, dass die Puzzles mehrdeutig sind. Auch "
+"kann das Finden \\e{aller} möglichen Lösungen eine zusätzliche "
+"Herausforderung für fortgeschrittene Spieler darstellen. Das Abschalten "
+"dieser Option beschleunigt auch die Erstellung von Puzzles."
+
+#. type: Plain text
+#: puzzles.but:854
+msgid "\\i{Netslide}"
+msgstr "\\i{Netslide}"
+
+#. type: Plain text
+#: puzzles.but:856
+msgid "\\cfg{winhelp-topic}{games.netslide}"
+msgstr "\\cfg{winhelp-topic}{games.netslide}"
+
+#. type: Plain text
+#: puzzles.but:861
+msgid ""
+"This game combines the grid generation of Net (see \\k{net}) with the "
+"movement of Sixteen (see \\k{sixteen}): you have a Net grid, but instead of "
+"rotating tiles back into place you have to slide them into place by moving a "
+"whole row at a time."
+msgstr ""
+"Dieses Spiel kombiniert die Gittererstellung von Net (siehe \\k{net}) mit "
+"den Spielzügen von Sixteen (siehe \\k{sixteen}). Sie bekommen ein Net-Gitter "
+"aber statt Platten zurück an ihren Platz zu rotieren müssen Sie sie an ihren "
+"Platz verschieben, indem Sie eine ganze Zeile auf einmal bewegen."
+
+#. type: Plain text
+#: puzzles.but:864
+msgid ""
+"As in Sixteen, \\I{controls, for Netslide}control is with the mouse or "
+"cursor keys. See \\k{sixteen-controls}."
+msgstr ""
+"Wie in Sixteen, \\I{Steuerung, für Netslide}erfolgt die Steuerung mit der "
+"Maus oder den Pfeiltasten. Siehe \\k{sixteen-controls}."
+
+#. type: Plain text
+#: puzzles.but:868
+msgid ""
+"\\I{parameters, for Netslide}The available game parameters have similar "
+"meanings to those in Net (see \\k{net-params}) and Sixteen (see \\k{sixteen-"
+"params})."
+msgstr ""
+"\\I{Parameter, für Netslide}Die verfügbaren Spielparameter haben Ã¤hnliche "
+"Bedeutungen wie bei Net (siehe \\k{net-params}) und Sixteen (siehe "
+"\\k{sixteen-params})."
+
+#. type: Plain text
+#: puzzles.but:870
+msgid "Netslide was contributed to this collection by Richard Boulton."
+msgstr "Netslide ist ein Beitrag von Richard Boulton zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:873
+msgid "\\i{Pattern}"
+msgstr "\\i{Pattern}"
+
+#. type: Plain text
+#: puzzles.but:875
+msgid "\\cfg{winhelp-topic}{games.pattern}"
+msgstr "\\cfg{winhelp-topic}{games.pattern}"
+
+#. type: Plain text
+#: puzzles.but:881
+msgid ""
+"You have a grid of squares, which must all be filled in either black or "
+"white. Beside each row of the grid are listed the lengths of the runs of "
+"black squares on that row; above each column are listed the lengths of the "
+"runs of black squares in that column. Your aim is to fill in the entire grid "
+"black or white."
+msgstr ""
+"Sie bekommen ein Gitter von Quadraten, die alle entweder mit Weiß oder mit "
+"Schwarz ausgefüllt werden müssen. Neben jeder Zeile des Gitters sind die "
+"Längen der Läufe von schwarzen Quadraten in dieser Zeile angegeben, oberhalb "
+"jeder Spalte sind die Längen der Läufe von schwarzen Quadraten in dieser "
+"Spalte angegeben. Ihr Ziel besteht darin, das gesamte Gitter schwarz oder "
+"weiß einzufärben."
+
+#. type: Plain text
+#: puzzles.but:885
+msgid ""
+"I first saw this puzzle form around 1995, under the name "
+"\\q{\\i{nonograms}}. I've seen it in various places since then, under "
+"different names."
+msgstr ""
+"Ich habe diese Art von Puzzle das erste Mal ungefähr 1995 gesehen, unter dem "
+"Namen \\q{\\i{nonograms}}. Seitdem habe ich es an verschiedenen Orten unter "
+"verschiedenen Namen gesehen."
+
+#. type: Plain text
+#: puzzles.but:893
+msgid ""
+"Normally, puzzles of this type turn out to be a meaningful picture of "
+"something once you've solved them. However, since this version generates the "
+"puzzles automatically, they will just look like random groupings of squares. "
+"(One user has suggested that this is actually a \\e{good} thing, since it "
+"prevents you from guessing the colour of squares based on the picture, and "
+"forces you to use logic instead.)  The advantage, though, is that you never "
+"run out of them."
+msgstr ""
+"Normalerweise ergeben Puzzle dieser Art ein Bild, das etwas bedeutet, wenn "
+"es gelöst wurde. Da diese Version allerdings die Puzzle automatisch "
+"generiert, werden Sie wie zufällig angeordnete Gruppierungen von Quadraten "
+"aussehen. (Ein Benutzer hat angedeutet, dass dies in der Tat eine \\e{gute} "
+"Sache sei, da es Sie davon abhält, aufgrund des Gesamtbildes die Farbe zu "
+"raten und Sie dazu zwingt, stattdessen die Logik anzuwenden). Der Vorteil "
+"besteht allerdings darin, dass Ihnen nie die Puzzle ausgehen."
+
+#. type: Plain text
+#: puzzles.but:895
+msgid "\\I{controls, for Pattern}Pattern controls"
+msgstr "\\I{Steuerung, von Pattern}Pattern-Steuerung"
+
+#. type: Plain text
+#: puzzles.but:897 puzzles.but:1090
+msgid "This game is played with the mouse."
+msgstr "Dieses Spiel wird mit der Maus gespielt."
+
+#. type: Plain text
+#: puzzles.but:902
+msgid ""
+"Left-click in a square to colour it black. Right-click to colour it white. "
+"If you make a mistake, you can middle-click, or hold down Shift while "
+"clicking with any button, to colour the square in the default grey (meaning "
+"\\q{undecided}) again."
+msgstr ""
+"Ein Linksklick in ein Quadrat färbt es schwarz. Ein Rechtsklick färbt es "
+"weiß. Falls Sie einen Fehler gemacht haben, können Sie einen Mittelklick "
+"durchführen oder die Umschalttaste gedrückt halten, während Sie mit einer "
+"beliebigen Taste klicken, um das Quadrat in das vorgegebene Grau zu färben "
+"(was bedeutet, dass es wieder \\q{unentschieden} ist)."
+
+#. type: Plain text
+#: puzzles.but:908
+msgid ""
+"You can click and drag with the left or right mouse button to colour a "
+"vertical or horizontal line of squares black or white at a time "
+"(respectively). If you click and drag with the middle button, or with Shift "
+"held down, you can colour a whole rectangle of squares grey."
+msgstr ""
+"Sie können mit der linken oder rechten Maustaste klicken und ziehen, um eine "
+"vertikale oder horizontale Linie von Quadraten auf einmal schwarz oder "
+"respektive weiß zu färben. Falls Sie mit der mittleren Maustaste klicken und "
+"ziehen oder mit gedrückt gehaltener Umschalttaste, können Sie ein gesamtes "
+"Rechteck an Quadraten grau färben."
+
+#. type: Plain text
+#: puzzles.but:912
+msgid ""
+"You can also move around the grid with the cursor keys. Pressing the return "
+"key will cycle the current cell through empty, then black, then white, then "
+"empty, and the space bar does the same cycle in reverse."
+msgstr ""
+"Sie können sich mit den Pfeiltasten Ã¼ber das Gitter bewegen. Durch Drücken "
+"der Eingabetaste wird die aktuelle Zelle nacheinander von leer zu schwarz zu "
+"weiß wieder zu leer umgeschaltet; die Leertaste ermöglicht dies in "
+"umgedrehter Reihenfolge."
+
+#. type: Plain text
+#: puzzles.but:916
+msgid ""
+"Moving the cursor while holding Control will colour the moved-over squares "
+"black.  Holding Shift will colour the moved-over squares white, and holding "
+"both will colour them grey."
+msgstr ""
+"Bewegen des Cursors während Strg gehalten wird färbt die Ã¼berstrichenen "
+"Quadrate schwarz. Halten von Umschalten färbt die Ã¼berstrichenen Quadrate "
+"weiß und Halten von beiden färbt sie grau."
+
+#. type: Plain text
+#: puzzles.but:920
+msgid "\\I{parameters, for Pattern}Pattern parameters"
+msgstr "\\I{Parameter, für Pattern}Pattern-Parameter"
+
+#. type: Plain text
+#: puzzles.but:923
+msgid ""
+"The only options available from the \\q{Custom...} option on the \\q{Type} "
+"menu are \\e{Width} and \\e{Height}, which are self-explanatory."
+msgstr ""
+"Die einzigen unter der Option \\q{Custom...} im Menü \\q{Type} verfügbaren "
+"Optionen sind \\e{Width} (Breite) und \\e{Height} (Höhe), die "
+"selbsterklärend sind."
+
+#. type: Plain text
+#: puzzles.but:926
+msgid "\\i{Solo}"
+msgstr "\\i{Solo}"
+
+#. type: Plain text
+#: puzzles.but:928
+msgid "\\cfg{winhelp-topic}{games.solo}"
+msgstr "\\cfg{winhelp-topic}{games.solo}"
+
+#. type: Plain text
+#: puzzles.but:932
+msgid ""
+"You have a square grid, which is divided into as many equally sized sub-"
+"blocks as the grid has rows. Each square must be filled in with a digit from "
+"1 to the size of the grid, in such a way that"
+msgstr ""
+"Sie bekommen ein Quadratgitter, das in so viele gleichgroße Unterblöcke "
+"zerteilt ist, wie das Gitter Spalten hat. Jedes Quadrat muss mit einer "
+"Ziffer von 1 bis zu der Größe des Gitters befüllt werden, so dass"
+
+#. type: Plain text
+#: puzzles.but:934
+msgid "every row contains only one occurrence of each digit"
+msgstr "jede Zeile jede Ziffer nur einmal erhält,"
+
+#. type: Plain text
+#: puzzles.but:936
+msgid "every column contains only one occurrence of each digit"
+msgstr "jede Spalte jede Ziffer nur einmal erhält und"
+
+#. type: Plain text
+#: puzzles.but:938
+msgid "every block contains only one occurrence of each digit."
+msgstr "jeder Block jede Ziffer nur einmal erhält."
+
+#. type: Plain text
+#: puzzles.but:941
+msgid ""
+"(optionally, by default off) each of the square's two main diagonals "
+"contains only one occurrence of each digit."
+msgstr ""
+"Optional (und standardmäßig deaktiviert) jede der Hauptdiagonalen des "
+"Quadrats jede Ziffer nur einmal erhält."
+
+#. type: Plain text
+#: puzzles.but:944
+msgid ""
+"You are given some of the numbers as clues; your aim is to place the rest of "
+"the numbers correctly."
+msgstr ""
+"Sie bekommen einige Zahlen als Hinweise; Ihr Ziel besteht darin, die "
+"restlichen Zahlen korrekt zu platzieren."
+
+#. type: Plain text
+#: puzzles.but:952
+msgid ""
+"Under the default settings, the sub-blocks are square or rectangular. The "
+"default puzzle size is 3\\by\\.3 (a 9\\by\\.9 actual grid, divided into nine "
+"3\\by\\.3 blocks). You can also select sizes with rectangular blocks instead "
+"of square ones, such as 2\\by\\.3 (a 6\\by\\.6 grid divided into six 3\\by"
+"\\.2 blocks). Alternatively, you can select \\q{jigsaw} mode, in which the "
+"sub-blocks are arbitrary shapes which differ between individual puzzles."
+msgstr ""
+"Bei den Standardeinstellungen sind die Unterblöcke Quadrate oder Rechtecke. "
+"Die Standardpuzzlegröße ist 3\\by\\.3 (ein Gitter von tatsächlich 9\\by\\.9, "
+"eingeteilt in neun 3\\.by\\.3 Blöcke). Sie können auch Größen mit "
+"rechteckigen statt quadratischen Blöcken auswählen, wie beispielsweise 2\\by"
+"\\.3 (ein 6\\by\\.6 Gitter unterteilt in sechs 3\\by\\.2 Blöcke). Alternativ "
+"können Sie den \\q{Jigsaw}-Modus auswählen, bei dem die Unterblöcke "
+"beliebige Formen haben, die sich zwischen den einzelnen Puzzlen "
+"unterscheiden."
+
+#. type: Plain text
+#: puzzles.but:959
+msgid ""
+"Another available mode is \\q{killer}. In this mode, clues are not given in "
+"the form of filled-in squares; instead, the grid is divided into \\q{cages} "
+"by coloured lines, and for each cage the game tells you what the sum of all "
+"the digits in that cage should be. Also, no digit may appear more than once "
+"within a cage, even if the cage crosses the boundaries of existing regions."
+msgstr ""
+"Ein weiterer verfügbarer Modus ist \\q{killer}. In diesem Modus werden die "
+"Hinweise nicht in der Form vorbefüllter Quadrate gegeben, stattdessen ist "
+"das Gitter durch farbige Linien in \\q{Käfige} eingeteilt und für jeden "
+"Käfig informiert Sie das Spiel, was die Summe aller Ziffern in diesem Käfig "
+"sein soll. Auch darf keine Ziffer mehr als einmal in einem Käfig auftauchen, "
+"selbst wenn der Käfig die Grenzen existierender Regionen Ã¼berschreitet."
+
+#. type: Plain text
+#: puzzles.but:965
+msgid ""
+"If you select a puzzle size which requires more than 9 digits, the "
+"additional digits will be letters of the alphabet. For example, if you "
+"select 3\\by\\.4 then the digits which go in your grid will be 1 to 9, plus "
+"\\cq{a}, \\cq{b} and \\cq{c}. This cannot be selected for killer puzzles."
+msgstr ""
+"Falls Sie eine Puzzlegröße wählen, bei der mehr als 9 Ziffern benötigt "
+"werden, sind die zusätzlichen Ziffern die Buchstaben des Alphabets. Falls "
+"Sie beispielsweise 3\\by\\.4 auswählen, werden die Ziffern im Gitter 1 bis 9 "
+"sowie \\cq{a}, \\cq{b} und \\cq{c} sein. Dies kann für killer-Puzzle nicht "
+"ausgewählt werden."
+
+#. type: Plain text
+#: puzzles.but:973
+msgid ""
+"I first saw this puzzle in \\i{Nikoli} \\k{nikoli-solo}, although it's also "
+"been popularised by various newspapers under the name \\q{Sudoku} or \\q{Su "
+"Doku}.  Howard Garns is considered the inventor of the modern form of the "
+"puzzle, and it was first published in \\e{Dell Pencil Puzzles and Word "
+"Games}.  A more elaborate treatment of the history of the puzzle can be "
+"found on Wikipedia \\k{wikipedia-solo}."
+msgstr ""
+"Ich habe dieses Puzzle zuerst in \\i{Nikoli} \\k{nikoli-solo} gesehen, "
+"obwohl es auch durch verschiedene Zeitungen unter dem Namen \\q{Sudoku} oder "
+"\\q{Su Doku} bekannt wurde. Howard Garns wird als Erfinder der modernen Form "
+"des Puzzles betrachtet und es wurde zuerst in \\e{Dell Pencil Puzzles and "
+"Word Games} veröffentlicht. Eine tiefergehende Behandlung der Geschichte des "
+"Puzzles kann in Wikipedia \\k{wikipedia-solo} gefunden werden."
+
+#. type: Plain text
+#: puzzles.but:976
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/sudoku.html}\\cw{http://www.nikoli.co."
+"jp/en/puzzles/sudoku.html} (beware of Flash)"
+msgstr "\\W{http://www.nikoli.co.jp/en/puzzles/sudoku.html}\\cw{http://www.nikoli.co.jp/en/puzzles/sudoku.html} (Achtung Flash)"
+
+#. type: Plain text
+#: puzzles.but:978
+msgid ""
+"\\W{http://en.wikipedia.org/wiki/Sudoku}\\cw{http://en.wikipedia.org/wiki/"
+"Sudoku}"
+msgstr ""
+"\\W{http://de.wikipedia.org/wiki/Sudoku}\\cw{http://de.wikipedia.org/wiki/"
+"Sudoku}"
+
+#. type: Plain text
+#: puzzles.but:980
+msgid "\\I{controls, for Solo}Solo controls"
+msgstr "\\I{Steuerung, von Solo}Solo-Steuerung"
+
+#. type: Plain text
+#: puzzles.but:985
+msgid ""
+"To play Solo, simply click the mouse in any empty square and then type a "
+"digit or letter on the keyboard to fill that square. If you make a mistake, "
+"click the mouse in the incorrect square and press Space to clear it again "
+"(or use the Undo feature)."
+msgstr ""
+"Um Solo zu spielen, klicken Sie einfach mit der Maus in ein leeres Quadrat "
+"und tippen Sie dann eine Ziffer oder einen Buchstaben auf der Tastatur, um "
+"dieses Quadrat zu füllen. Falls Sie einen Fehler gemacht haben, klicken Sie "
+"mit der Maus in das fehlerhafte Quadrat und drücken Sie die Leertaste, um es "
+"wieder zu leeren (oder verwenden Sie die Undo-Funktion)."
+
+#. type: Plain text
+#: puzzles.but:990 puzzles.but:2336 puzzles.but:2569
+msgid ""
+"If you \\e{right}-click in a square and then type a number, that number will "
+"be entered in the square as a \\q{pencil mark}. You can have pencil marks "
+"for multiple numbers in the same square. Squares containing filled-in "
+"numbers cannot also contain pencil marks."
+msgstr ""
+"Falls Sie in ein Quadrat \\e{rechts-}klicken und dann eine Zahl tippen, wird "
+"diese Zahl im Quadrat als \\q{Bleistiftmarkierung} eingetragen. Sie können "
+"Bleistiftmarkierungen für mehrere Zahlen im gleichen Quadrat vornehmen. "
+"Quadrate, in denen Zahlen eingefüllt sind können nicht auch gleichzeitig "
+"über Bleistiftmarkierungen verfügen."
+
+#. type: Plain text
+#: puzzles.but:996 puzzles.but:2342 puzzles.but:2575 puzzles.but:2669
+msgid ""
+"The game pays no attention to pencil marks, so exactly what you use them for "
+"is up to you: you can use them as reminders that a particular square needs "
+"to be re-examined once you know more about a particular number, or you can "
+"use them as lists of the possible numbers in a given square, or anything "
+"else you feel like."
+msgstr ""
+"Das Spiel ignoriert Bleistiftmarkierungen, daher können Sie diese so "
+"einsetzen, wie Sie möchten: Sie können Sie als Erinnerung verwenden, dass "
+"ein bestimmtes Quadrat noch mal untersucht werden muss, sobald Sie mehr Ã¼ber "
+"eine bestimmte Zahl wissen, oder Sie können sie als Liste möglicher Zahlen "
+"für ein gegebenes Quadrat verwenden oder irgendetwas anderes, was Sie mögen."
+
+#. type: Plain text
+#: puzzles.but:999 puzzles.but:2345 puzzles.but:2578 puzzles.but:2672
+msgid ""
+"To erase a single pencil mark, right-click in the square and type the same "
+"number again."
+msgstr ""
+"Um eine einzelne Bleistiftmarkierung zu entfernen, klicken Sie rechts in das "
+"Quadrat und tippen Sie die Zahl noch mal."
+
+#. type: Plain text
+#: puzzles.but:1003 puzzles.but:2349 puzzles.but:2582 puzzles.but:2676
+msgid ""
+"All pencil marks in a square are erased when you left-click and type a "
+"number, or when you left-click and press space. Right-clicking and pressing "
+"space will also erase pencil marks."
+msgstr ""
+"Alle Bleistiftmarkierungen in einem Quadrat werden gelöscht, wenn Sie "
+"linksklicken und eine Zahl eingeben oder wenn Sie linksklicken und die "
+"Leertaste drücken. Auch rechtsklicken und drücken der Leertaste wird die "
+"Bleistiftmarkierungen löschen."
+
+#. type: Plain text
+#: puzzles.but:1009 puzzles.but:2360
+msgid ""
+"Alternatively, use the cursor keys to move the mark around the grid.  "
+"Pressing the return key toggles the mark (from a normal mark to a pencil "
+"mark), and typing a number in is entered in the square in the appropriate "
+"way; typing in a 0 or using the space bar will clear a filled square."
+msgstr ""
+"Verwenden Sie alternativ die Pfeiltasten, um die Markierung im Gitter zu "
+"bewegen. Durch Drücken der Eingabetaste schalten Sie die Markierung um (von "
+"normaler Markierung zur Bleistiftmarkierung). Geben Sie die Zahl ein, um "
+"diese in geeigneter Weise in das Quadrat einzutragen. Die Eingabe von 0 oder "
+"die Verwendung der Leertaste wird ein gefülltes Quadrat leeren."
+
+#. type: Plain text
+#: puzzles.but:1013
+msgid "\\I{parameters, for Solo}Solo parameters"
+msgstr "\\I{Parameter, für Solo}Solo-Parameter"
+
+#. type: Plain text
+#: puzzles.but:1019
+msgid ""
+"Solo allows you to configure two separate dimensions of the puzzle grid on "
+"the \\q{Type} menu: the number of columns, and the number of rows, into "
+"which the main grid is divided. (The size of a block is the inverse of this: "
+"for example, if you select 2 columns and 3 rows, each actual block will have "
+"3 columns and 2 rows.)"
+msgstr ""
+"Solo erlaubt Ihnen, zwei separate Dimensionen des Puzzlegitters im Menü "
+"\\q{Type} zu konfigurieren: die Anzahl der Spalten und die Anzahl der "
+"Zeilen, in die das Hauptgitter eingeteilt wird. (Die Größe eines Blocks ist "
+"hierzu invers: Falls Sie beispielsweise 2 Spalten und 3 Zeilen wählen, wird "
+"jeder Block tatsächlich 3 Spalten und 2 Zeilen haben.)"
+
+#. type: Plain text
+#: puzzles.but:1025
+msgid ""
+"If you tick the \\q{X} checkbox, Solo will apply the optional extra "
+"constraint that the two main diagonals of the grid also contain one of every "
+"digit. (This is sometimes known as \\q{Sudoku-X} in newspapers.) In this "
+"mode, the squares on the two main diagonals will be shaded slightly so that "
+"you know it's enabled."
+msgstr ""
+"Falls Sie die Auswahl \\q{X} ankreuzen, wird Solo die zusätzliche "
+"Randbedingung verwenden, dass die zwei Hauptdiagonalen auch jede Ziffer nur "
+"einmal verwenden. (In Zeitungen heißt dies manchmal \\q{Sudoku-X}). In "
+"diesem Modus werden die Quadrate der Hauptdiagonalen leicht schattiert, so "
+"dass Sie sehen können, dass der Modus aktiviert wurde."
+
+#. type: Plain text
+#: puzzles.but:1032
+msgid ""
+"If you tick the \\q{Jigsaw} checkbox, Solo will generate randomly shaped sub-"
+"blocks. In this mode, the actual grid size will be taken to be the product "
+"of the numbers entered in the \\q{Columns} and \\q{Rows} boxes. There is no "
+"reason why you have to enter a number greater than 1 in both boxes; Jigsaw "
+"mode has no constraint on the grid size, and it can even be a prime number "
+"if you feel like it."
+msgstr ""
+"Falls Sie die Auswahl \\q{Jigsaw} ankreuzen, wird Solo zufällig generierte "
+"Teilblöcke erstellen. In diesem Modus wird die tatsächliche Gittergröße das "
+"Produkt der in die Felder \\q{Columns} und \\q{Rows} eingetragenen Werte "
+"darstellen. Es gibt keinen Grund, warum Sie eine Zahl größer als 1 in beide "
+"Felder eingeben müssen; der Jigsaw-Modus kennt keine Grenzen in der "
+"Gittergröße und es kann sogar eine Primzahl sein, wenn Sie dies möchten."
+
+#. type: Plain text
+#: puzzles.but:1037
+msgid ""
+"If you tick the \\q{Killer} checkbox, Solo will generate a set of of cages, "
+"which are randomly shaped and drawn in an outline of a different colour.  "
+"Each of these regions contains a smaller clue which shows the digit sum of "
+"all the squares in this region."
+msgstr ""
+"Falls Sie die Auswahl \\q{Killer} ankreuzen, wird Solo einen Satz Käfige "
+"generieren, die eine zufällige Form haben und als Umriss in einer anderen "
+"Farbe gezeichnet werden. Jeder dieser Regionen enthält einen kleineren "
+"Hinweis, der die Summe der Ziffern aller Quadrate in dieser Region angibt."
+
+#. type: Plain text
+#: puzzles.but:1043
+msgid ""
+"You can also configure the type of symmetry shown in the generated puzzles. "
+"More symmetry makes the puzzles look prettier but may also make them easier, "
+"since the symmetry constraints can force more clues than necessary to be "
+"present. Completely asymmetric puzzles have the freedom to contain as few "
+"clues as possible."
+msgstr ""
+"Sie können auch die Art von Symmetrie im generierten Puzzle konfigurieren. "
+"Puzzle mit höherer Symmetrie sehen netter aus, allerdings können sie dadurch "
+"auch einfacher werden, da die Symmetrie-Randbedingungen mehr angezeigte "
+"Hilfen als notwendig erzwingen könnten. Bei komplett asymmetrische Puzzlen "
+"besteht die Freiheit, sowenige Hilfestellungen wie möglich zu enthalten."
+
+#. type: Plain text
+#: puzzles.but:1057
+msgid ""
+"Finally, you can configure the difficulty of the generated puzzles.  "
+"Difficulty levels are judged by the complexity of the techniques of "
+"deduction required to solve the puzzle: each level requires a mode of "
+"reasoning which was not necessary in the previous one. In particular, on "
+"difficulty levels \\q{Trivial} and \\q{Basic} there will be a square you can "
+"fill in with a single number at all times, whereas at \\q{Intermediate} "
+"level and beyond you will have to make partial deductions about the \\e{set} "
+"of squares a number could be in (or the set of numbers that could be in a "
+"square).  \\#{Advanced, Extreme?} At \\q{Unreasonable} level, even this is "
+"not enough, and you will eventually have to make a guess, and then backtrack "
+"if it turns out to be wrong."
+msgstr ""
+"Schließlich können Sie den Schwierigkeitsgrad der generierten Puzzle "
+"konfigurieren. Schwierigkeitsstufen basieren auf der Komplexität der "
+"Techniken, die zum Lösen des Puzzles benötigt werden: Jede Stufe benötigt "
+"einen Schlussfolgerungsmodus, der in der vorherigen Stufe nicht notwendig "
+"war. Insbesondere gibt es in den Schwierigkeitsstufen \\q{Trivial} und "
+"\\q{Basic} ein Quadrat, in dem Sie zu allen Zeiten eine einzelne Zahl "
+"eintragen können, während Sie in der Stufe \\q{Intermediate} und höher "
+"Teilschlussfolgerungen Ã¼ber die \\e{Menge} aller Quadrate machen müssen, in "
+"denen eine Zahl sein könnte (oder der Satz an Zahlen, der in einem Quadrat "
+"sein könnte). \\#{Advanced, Extreme?} In der Stufe \\q{Unreasonable} ist "
+"selbst dies nicht genug und Sie müssen schließlich raten und falls sich die "
+"geratene Zahl als falsch herausstellt wieder schrittweise zurückgehen."
+
+#. type: Plain text
+#: puzzles.but:1063
+msgid ""
+"Generating difficult puzzles is itself difficult: if you select one of the "
+"higher difficulty levels, Solo may have to make many attempts at generating "
+"a puzzle before it finds one hard enough for you. Be prepared to wait, "
+"especially if you have also configured a large puzzle size."
+msgstr ""
+"Die Erstellung schwieriger Puzzle ist selbst schwierig: Falls Sie eine der "
+"höheren Schwierigkeitsgrade auswählen, könnte Solo viele Versuche bei der "
+"Erstellung eines Puzzles machen, bevor es eines findet, das schwer genug für "
+"Sie ist. Seien Sie daher auf Wartezeit vorbereitet, insbesondere wenn Sie "
+"auch eine große Puzzlegröße ausgewählt haben."
+
+#. type: Plain text
+#: puzzles.but:1066
+msgid "\\i{Mines}"
+msgstr "\\i{Mines}"
+
+#. type: Plain text
+#: puzzles.but:1068
+msgid "\\cfg{winhelp-topic}{games.mines}"
+msgstr "\\cfg{winhelp-topic}{games.mines}"
+
+#. type: Plain text
+#: puzzles.but:1075
+msgid ""
+"You have a grid of covered squares, some of which contain mines, but you "
+"don't know which. Your job is to uncover every square which does \\e{not} "
+"contain a mine. If you uncover a square containing a mine, you lose. If you "
+"uncover a square which does not contain a mine, you are told how many mines "
+"are contained within the eight surrounding squares."
+msgstr ""
+"Sie bekommen ein Gitter mit abgedeckten Quadraten, von denen einige Minen "
+"enthalten, Sie aber nicht wissen, welche. Ihr Aufgabe besteht darin, jedes "
+"Quadrat aufzudecken, das \\e{keine} Mine enthält. Falls Sie ein Quadrat "
+"aufdecken, das eine Mine enthält, dann verlieren Sie. Falls Sie ein Quadrat "
+"aufdecken, das keine Mine enthält, erfahren Sie, wieviele Minen sich in den "
+"benachbarten acht Quadraten befinden."
+
+#. type: Plain text
+#: puzzles.but:1078
+msgid ""
+"This game needs no introduction; popularised by Windows, it is perhaps the "
+"single best known desktop puzzle game in existence."
+msgstr ""
+"Dieses Spiel muss nicht vorgestellt werden. Es wurde mit Windows populär, es "
+"ist vielleicht das bekannteste Desktop-Puzzle Ã¼berhaupt."
+
+#. type: Plain text
+#: puzzles.but:1086
+msgid ""
+"This version of it has an unusual property. By default, it will generate its "
+"mine positions in such a way as to ensure that you never need to \\e{guess} "
+"where a mine is: you will always be able to deduce it somehow. So you will "
+"never, as can happen in other versions, get to the last four squares and "
+"discover that there are two mines left but you have no way of knowing for "
+"sure where they are."
+msgstr ""
+"Diese Version verfügt Ã¼ber eine ungewöhnliche Eigenschaft. Standardmäßig "
+"generiert es die Minen in Positionen, bei denen sichergestellt ist, dass Sie "
+"nie \\e{raten} müssen, wo sich eine Mine befindet, sie können dies immer "
+"logisch schlussfolgern. Daher werden Sie niemals, wie das in anderen "
+"Versionen passieren kann, zu den letzten vier Quadraten kommen und "
+"entdecken, dass zwei Minen verblieben sind Sie aber keine Möglichkeit haben "
+"zu wissen, wo diese sind."
+
+#. type: Plain text
+#: puzzles.but:1088
+msgid "\\I{controls, for Mines}Mines controls"
+msgstr "\\I{Steuerung, von Mines}Mines-Steuerung"
+
+#. type: Plain text
+#: puzzles.but:1092
+msgid "If you left-click in a covered square, it will be uncovered."
+msgstr "Falls Sie auf ein bedecktes Quadrat linksklicken, wird es aufgedeckt."
+
+#. type: Plain text
+#: puzzles.but:1097
+msgid ""
+"If you right-click in a covered square, it will place a flag which indicates "
+"that the square is believed to be a mine. Left-clicking in a marked square "
+"will not uncover it, for safety. You can right-click again to remove a mark "
+"placed in error."
+msgstr ""
+"Falls Sie auf ein bedecktes Quadrat rechtsklicken, wird eine Flagge "
+"platziert, die anzeigt, dass darunter eine Mine vermutet wird. Aus "
+"Sicherheitsgründen werden markierte Quadrate beim Linksklicken nicht "
+"aufgedeckt. Durch Rechtsklick können Sie aber fehlerhafte Markierungen "
+"wieder entfernen."
+
+#. type: Plain text
+#: puzzles.but:1105
+msgid ""
+"If you left-click in an \\e{uncovered} square, it will \\q{clear around} the "
+"square. This means: if the square has exactly as many flags surrounding it "
+"as it should have mines, then all the covered squares next to it which are "
+"\\e{not} flagged will be uncovered. So once you think you know the location "
+"of all the mines around a square, you can use this function as a shortcut to "
+"avoid having to click on each of the remaining squares one by one."
+msgstr ""
+"Falls Sie in ein aufgedecktes Quadrat linksklicken, wird die Umgebung des "
+"Quadrats \\q{bereinigt}. Dies bedeutet: Falls um das Quadrat genausoviele "
+"Flaggen markiert wurden wie Minen vorhanden sein sollten, dann werden alle "
+"benachbarten abgedeckten Quadrate \\e{ohne} Flagge aufgedeckt. Sie können "
+"diese Funktion daher benutzen, wenn Sie glauben, dass Sie den Ort aller "
+"Minen rund um das Quadrat kennen, um nicht alle verbliebenen Quadrate "
+"einzeln durch Klicken aufdecken zu müssen."
+
+#. type: Plain text
+#: puzzles.but:1111
+msgid ""
+"If you uncover a square which has \\e{no} mines in the surrounding eight "
+"squares, then it is obviously safe to uncover those squares in turn, and so "
+"on if any of them also has no surrounding mines. This will be done for you "
+"automatically; so sometimes when you uncover a square, a whole new area will "
+"open up to be explored."
+msgstr ""
+"Falls Sie ein Quadrat aufdecken, bei dem sich \\e{keine} Minen in den "
+"benachbarten acht Quadraten befinden, ist es offensichtlich sicher, diese "
+"Quadrate ebenfalls aufzudecken. Dies wird für Sie automatisch vorgenommen. "
+"Daher kann manchmal das Aufdecken eines einzelnen Quadrates eine ganz neues "
+"Gebiet zur Erforschung Ã¶ffnen."
+
+#. type: Plain text
+#: puzzles.but:1117
+msgid ""
+"You can also use the cursor keys to move around the minefield.  Pressing the "
+"return key in a covered square uncovers it, and in an uncovered square will "
+"clear around it (so it acts as the left button), pressing the space bar in a "
+"covered square will place a flag (similarly, it acts as the right button)."
+msgstr ""
+"Sie können auch die Pfeiltasten zur Bewegung im Minenfeld verwenden. Ein "
+"verdecktes Quadrat wird mit der Eingabetaste aufgedeckt und um ein "
+"aufgedecktes Quadrat herum wird bereinigt (d.h. dies funktioniert wie bei "
+"der linken Maustaste). Durch Drücken der Leertaste auf einem verdeckten "
+"Quadrat wird eine Flagge angebracht (entsprechend verhält sie sich wie die "
+"rechten Taste)."
+
+#. type: Plain text
+#: puzzles.but:1119
+msgid "All the actions described in \\k{common-actions} are also available."
+msgstr ""
+"Alle in \\k{common-actions} beschriebenen Aktionen sind auch verfügbar."
+
+#. type: Plain text
+#: puzzles.but:1127
+msgid ""
+"Even Undo is available, although you might consider it cheating to use it. "
+"If you step on a mine, the program will only reveal the mine in question "
+"(unlike most other implementations, which reveal all of them). You can then "
+"Undo your fatal move and continue playing if you like. The program will "
+"track the number of times you died (and Undo will not reduce that counter), "
+"so when you get to the end of the game you know whether or not you did it "
+"without making any errors."
+msgstr ""
+"Sogar Undo ist verfügbar; allerdings sollten Sie dies als Schummeln "
+"betrachten. Falls Sie auf eine Mine treten, wird das Programm nur diese Mine "
+"anzeigen (anders als die meisten anderen Implementierungen, die dann alle "
+"Minen zeigen). Sie können Ihren fatalen Spielzug rückgängig machen und wenn "
+"Sie möchten weiterspielen. Das Programm merkt sich, wie häufig Sie gestorben "
+"sind (und Undo reduziert diese Anzahl nicht), daher wissen Sie beim "
+"Spielende, ob Sie es ohne Fehler geschafft haben."
+
+#. type: Plain text
+#: puzzles.but:1131
+msgid ""
+"(If you really want to know the full layout of the grid, which other "
+"implementations will show you after you die, you can always use the Solve "
+"menu option.)"
+msgstr ""
+"(Falls Sie wirklich das gesamte Layout des Gitters wissen wollen, das Ihnen "
+"andere Implementierungen nach Ihrem Tod zeigen, können Sie stets die "
+"Menüoption Solve verwenden.)"
+
+#. type: Plain text
+#: puzzles.but:1133
+msgid "\\I{parameters, for Mines}Mines parameters"
+msgstr "\\I{Parameter, für Mines}Mines-Parameter"
+
+#. type: Plain text
+#: puzzles.but:1136
+msgid ""
+"The options available from the \\q{Custom...} option on the \\q{Type} menu "
+"are:"
+msgstr "Die unter \\q{Custom} im Menü \\q{Type} verfügbaren Optionen sind:"
+
+#. type: Plain text
+#: puzzles.but:1140 puzzles.but:1212 puzzles.but:1285 puzzles.but:1748
+#: puzzles.but:1819 puzzles.but:1915 puzzles.but:2071 puzzles.but:2129
+#: puzzles.but:2245 puzzles.but:2450 puzzles.but:2758 puzzles.but:2910
+#: puzzles.but:2978 puzzles.but:3127 puzzles.but:3341
+msgid "Size of grid in squares."
+msgstr "Größe des Gitters in Quadraten"
+
+#. type: e{#1}
+#: puzzles.but:1142
+msgid "Mines"
+msgstr "Mines"
+
+#. type: Plain text
+#: puzzles.but:1147
+msgid ""
+"Number of mines in the grid. You can enter this as an absolute mine count, "
+"or alternatively you can put a \\cw{%} sign on the end in which case the "
+"game will arrange for that proportion of the squares in the grid to be mines."
+msgstr ""
+"Anzahl der Minen im Gitter. Sie können diese als absolute Minenzahl angeben "
+"oder alternativ können Sie ein \\cw{%}-Zeichen ans Ende setzen, wodurch das "
+"Spiel für den gewünschten Anteil an Minen auf Quadraten im Spiel sorgen wird."
+
+#. type: Plain text
+#: puzzles.but:1154
+msgid ""
+"Beware of setting the mine count too high. At very high densities, the "
+"program may spend forever searching for a solvable grid."
+msgstr ""
+"Setzen Sie die Minenzahl nicht zu hoch. Bei sehr hohen Dichten kann das "
+"Programm ewig suchen, um ein lösbares Gitter zu ermitteln."
+
+#. type: e{#1}
+#: puzzles.but:1156 puzzles.but:1228
+msgid "Ensure solubility"
+msgstr "Ensure solubility"
+
+#. type: Plain text
+#: puzzles.but:1161
+msgid ""
+"When this option is enabled (as it is by default), Mines will ensure that "
+"the entire grid can be fully deduced starting from the initial open space. "
+"If you prefer the riskier grids generated by other implementations, you can "
+"switch off this option."
+msgstr ""
+"Wenn diese Option aktiviert ist (sie ist es standardmäßig) wird Mines "
+"sicherstellen, dass das gesamte Gitter komplett vom anfänglich offenen Platz "
+"aus hergeleitet werden kann. Falls Sie die riskanteren Gitter, wie sie von "
+"anderen Implementierungen generiert werden, bevorzugen, können Sie diese "
+"Option abschalten."
+
+#. type: Plain text
+#: puzzles.but:1164
+msgid "\\i{Same Game}"
+msgstr "\\i{Same Game}"
+
+#. type: Plain text
+#: puzzles.but:1166
+msgid "\\cfg{winhelp-topic}{games.samegame}"
+msgstr "\\cfg{winhelp-topic}{games.samegame}"
+
+#. type: Plain text
+#: puzzles.but:1171
+msgid ""
+"You have a grid of coloured squares, which you have to clear by highlighting "
+"contiguous regions of more than one coloured square; the larger the region "
+"you highlight, the more points you get (and the faster you clear the arena)."
+msgstr ""
+"Sie bekommen ein Gitter farbiger Quadrate, das Sie bereinigen müssen, indem "
+"Sie zusammenhängende Regionen von mehr als einem gefärbtem Quadrat "
+"hervorheben müssen. Je größer die hervorgehobene Region, desto mehr Punkte "
+"bekommen Sie (und desto schneller bereinigen Sie die Arena)."
+
+#. type: Plain text
+#: puzzles.but:1175
+msgid ""
+"If you clear the grid you win. If you end up with nothing but single squares "
+"(i.e., there are no more clickable regions left) you lose."
+msgstr ""
+"Falls Sie das gesamte Gitter bereinigen, gewinnen Sie. Falls Sie am Ende nur "
+"einzelne Quadrate haben (d.h. es keine klickbaren Regionen mehr gibt), "
+"verlieren Sie."
+
+#. type: Plain text
+#: puzzles.but:1179
+msgid ""
+"Removing a region causes the rest of the grid to shuffle up: blocks that are "
+"suspended will fall down (first), and then empty columns are filled from the "
+"right."
+msgstr ""
+"Das Entfernen einer Region führt dazu, dass das Gitter "
+"durcheinandergewürfelt wird: Frei hängende Blöcke fallen herunter (als "
+"erstes) und dann werden leere Spalten von rechts aus aufgefüllt."
+
+#. type: Plain text
+#: puzzles.but:1181
+msgid "Same Game was contributed to this collection by James Harvey."
+msgstr "Same Game ist ein Beitrag von James Harvey zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:1183
+msgid "\\i{Same Game controls}"
+msgstr "\\i{Same Game-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:1184 puzzles.but:1185 puzzles.but:1186
+msgid "Same Game controls"
+msgstr "Same Game-Steuerung"
+
+#. type: IM
+#: puzzles.but:1184
+#, no-wrap
+msgid "controls, for Same Game"
+msgstr "Steuerung, von Same Game"
+
+#. type: IM
+#: puzzles.but:1185
+#, no-wrap
+msgid "keys, for Same Game"
+msgstr "Tasten, für Same Game"
+
+#. type: IM
+#: puzzles.but:1186
+#, no-wrap
+msgid "shortcuts (keyboard), for Same Game"
+msgstr "Tastaturkürzel, für Same Game"
+
+#. type: Plain text
+#: puzzles.but:1192
+msgid ""
+"If you left-click an unselected region, it becomes selected (possibly "
+"clearing the current selection)."
+msgstr ""
+"Falls Sie auf eine nicht ausgewählte Region linksklicken, wird sie "
+"ausgewählt (und möglicherweise eine bestehende Auswahl aufgehoben)."
+
+#. type: Plain text
+#: puzzles.but:1195
+msgid ""
+"If you left-click the selected region, it will be removed (and the rest of "
+"the grid shuffled immediately)."
+msgstr ""
+"Falls Sie auf eine ausgewählte Region linksklicken wird diese entfernt (und "
+"der Rest des Gitters sofort durcheinandergewürfelt)."
+
+#. type: Plain text
+#: puzzles.but:1197
+msgid "If you right-click the selected region, it will be unselected."
+msgstr ""
+"Falls Sie auf eine ausgewählte Region rechtsklicken, wird die Auswahl "
+"aufgehoben."
+
+#. type: Plain text
+#: puzzles.but:1201
+msgid ""
+"The cursor keys move a cursor around the grid. Pressing the Space or Enter "
+"keys while the cursor is in an unselected region selects it; pressing Space "
+"or Enter again removes it as above."
+msgstr ""
+"Die Pfeiltasten bewegen den Cursor Ã¼ber das Gitter. Durch Drücken der "
+"Eingabe- oder Leertaste in einer nicht ausgewählten Region wird diese "
+"ausgewählt, durch Drücken der Leer- oder Eingabetaste wird diese, wie oben "
+"beschrieben, entfernt."
+
+#. type: Plain text
+#: puzzles.but:1205
+msgid "\\I{parameters, for Same Game}Same Game parameters"
+msgstr "\\I{Parameter, für Same Game}Same Game-Parameter"
+
+#. type: e{#1}
+#: puzzles.but:1214
+msgid "No. of colours"
+msgstr "No. of colours"
+
+#. type: Plain text
+#: puzzles.but:1218
+msgid ""
+"Number of different colours used to fill the grid; the more colours, the "
+"fewer large regions of colour and thus the more difficult it is to "
+"successfully clear the grid."
+msgstr ""
+"Anzahl an verschiedenen Farben, die zum Auffüllen des Gitters verwandt "
+"werden. Je mehr Farben, desto weniger große Regionen einer Farbe existieren "
+"und desto schwieriger ist es, das Gitter erfolgreich zu bereinigen."
+
+#. type: e{#1}
+#: puzzles.but:1220
+msgid "Scoring system"
+msgstr "Scoring system"
+
+#. type: Plain text
+#: puzzles.but:1226
+msgid ""
+"Controls the precise mechanism used for scoring. With the default system, "
+"\\q{(n-2)^2}, only regions of three squares or more will score any points at "
+"all. With the alternative \\q{(n-1)^2} system, regions of two squares score "
+"a point each, and larger regions score relatively more points."
+msgstr ""
+"Steuert den genauen Mechanismus der Punkteverteilung. Mit dem "
+"Standardsystem, \\q{(n-2)^2} werden nur Regionen mit drei oder mehr "
+"Quadraten Ã¼berhaupt Punkte liefern. Mit dem alternativen System \\q{(n-1)^2} "
+"bringen Regionen von zwei Quadraten jeweils einen Punkt und größere Regionen "
+"bringen relativ mehr Punkte."
+
+#. type: Plain text
+#: puzzles.but:1231
+msgid ""
+"If this option is ticked (the default state), generated grids will be "
+"guaranteed to have at least one solution."
+msgstr ""
+"Falls diese Option angekreuzt ist (der Standardzustand) haben die "
+"generierten Gitter mindestens eine Lösung."
+
+#. type: Plain text
+#: puzzles.but:1243
+msgid ""
+"If you turn it off, the game generator will not try to guarantee soluble "
+"grids; it will, however, still ensure that there are at least 2 squares of "
+"each colour on the grid at the start (since a grid with exactly one square "
+"of a given colour is \\e{definitely} insoluble). Grids generated with this "
+"option disabled may contain more large areas of contiguous colour, leading "
+"to opportunities for higher scores; they can also take less time to generate."
+msgstr ""
+"Falls Sie dies ausschalten, wird der Spielegenerator nicht versuchen, "
+"lösbare Gitter zu erzeugen; er wird allerdings sicherstellen, dass am Anfang "
+"mindestens zwei Quadrate im Gitter von jeder Farbe vorhanden sind (da ein "
+"Gitter mit genau einem Quadrat einer Farbe \\e{definitiv} unlösbar ist). "
+"Gitter, bei denen diese Option beim Erzeugen deaktiviert wurde, können mehr "
+"große Gebiete mit durchlaufender Farbe enthalten und damit zur Möglichkeit "
+"größerer Punktzahlen führen; sie könnten auch schneller generiert sein."
+
+#. type: Plain text
+#: puzzles.but:1246
+msgid "\\i{Flip}"
+msgstr "\\i{Flip}"
+
+#. type: Plain text
+#: puzzles.but:1248
+msgid "\\cfg{winhelp-topic}{games.flip}"
+msgstr "\\cfg{winhelp-topic}{games.flip}"
+
+#. type: Plain text
+#: puzzles.but:1253
+msgid ""
+"You have a grid of squares, some light and some dark. Your aim is to light "
+"all the squares up at the same time. You can choose any square and flip its "
+"state from light to dark or dark to light, but when you do so, other squares "
+"around it change state as well."
+msgstr ""
+"Sie verfügen Ã¼ber ein Gitter von Quadraten, einige hell und andere dunkel. "
+"Ihr Ziel besteht darin, alle Quadrate gleichzeitig aufzuhellen. Sie können "
+"jedes Quadrat auswählen und seinen Zustand von hell auf dunkel oder "
+"umgekehrt umschalten. Allerdings Ã¤ndern dabei auch andere benachbarte "
+"Quadrate ihren Zustand."
+
+#. type: Plain text
+#: puzzles.but:1256
+msgid ""
+"Each square contains a small diagram showing which other squares change when "
+"you flip it."
+msgstr ""
+"Jedes Quadrat enthält ein kleines Diagramm, das anzeigt, welche anderen "
+"Quadrate sich Ã¤ndern, wenn Sie es umschalten."
+
+#. type: Plain text
+#: puzzles.but:1258
+msgid "\\i{Flip controls}"
+msgstr "\\i{Flip-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:1259 puzzles.but:1260 puzzles.but:1261
+msgid "Flip controls"
+msgstr "Flip-Steuerung"
+
+#. type: IM
+#: puzzles.but:1259
+#, no-wrap
+msgid "controls, for Flip"
+msgstr "Steuerung, von Flip"
+
+#. type: IM
+#: puzzles.but:1260
+#, no-wrap
+msgid "keys, for Flip"
+msgstr "Tasten, für Flip"
+
+#. type: IM
+#: puzzles.but:1261
+#, no-wrap
+msgid "shortcuts (keyboard), for Flip"
+msgstr "Tastaturkürzel, für Flip"
+
+#. type: Plain text
+#: puzzles.but:1268
+msgid ""
+"Left-click in a square to flip it and its associated squares, or use the "
+"cursor keys to choose a square and the space bar or Enter key to flip."
+msgstr ""
+"Linksklick in ein Quadrat dreht es und seine zugehörigen Quadrate. Sie "
+"können auch die Pfeiltasten verwenden, um ein Quadrat auszuwählen und die "
+"Leer- oder Eingabetaste, um es umzudrehen."
+
+#. type: Plain text
+#: puzzles.but:1274
+msgid ""
+"If you use the \\q{Solve} function on this game, it will mark some of the "
+"squares in red. If you click once in every square with a red mark, the game "
+"should be solved. (If you click in a square \\e{without} a red mark, a red "
+"mark will appear in it to indicate that you will need to reverse that "
+"operation to reach the solution.)"
+msgstr ""
+"Falls Sie die Funktion \\q{Solve} in diesem Spiel benutzen, wird sie einige "
+"Quadrate rot markieren. Falls Sie einmal auf jedes Quadrat mit einer roten "
+"Markierung klicken, sollte das Spiel gelöst sein. (Falls Sie auf ein Quadrat "
+"\\e{ohne} eine rote Markierung klicken, wird darin eine rote Markierung "
+"erscheinen, um anzudeuten, dass Sie diese Operation zurücknehmen müssen, um "
+"die Lösung zu erreichen.)"
+
+#. type: Plain text
+#: puzzles.but:1278
+msgid "\\I{parameters, for flip}Flip parameters"
+msgstr "\\I{Parameter, für Flip}Flip-Parameter"
+
+#. type: e{#1}
+#: puzzles.but:1287
+msgid "Shape type"
+msgstr "Shape type"
+
+#. type: Plain text
+#: puzzles.but:1294
+msgid ""
+"This control determines the shape of the region which is flipped by clicking "
+"in any given square. The default setting, \\q{Crosses}, causes every square "
+"to flip itself and its four immediate neighbours (or three or two if it's at "
+"an edge or corner). The other setting, \\q{Random}, causes a random shape to "
+"be chosen for every square, so the game is different every time."
+msgstr ""
+"Diese Einstellung bestimmt die Form der Region, die durch Klicken in eines "
+"der zugehörigen Quadrate gedreht wird. \\q{Crosses} führt dazu, dass jedes "
+"Quadrat und seine vier direkten Nachbarn (oder drei oder zwei, falls es an "
+"einer Seite oder in einer Ecke ist) umgedreht werden. Die andere "
+"Einstellung, \\q{Random}, führt dazu, dass eine zufällige Region um jedes "
+"Quadrat gewählt wird, so dass das Spiel jedes mal anders ist."
+
+#. type: Plain text
+#: puzzles.but:1297
+msgid "\\i{Guess}"
+msgstr "\\i{Guess}"
+
+#. type: Plain text
+#: puzzles.but:1299
+msgid "\\cfg{winhelp-topic}{games.guess}"
+msgstr "\\cfg{winhelp-topic}{games.guess}"
+
+#. type: Plain text
+#: puzzles.but:1303
+msgid ""
+"You have a set of coloured pegs, and have to reproduce a predetermined "
+"sequence of them (chosen by the computer) within a certain number of guesses."
+msgstr ""
+"Sie haben einen Satz an gefärbten Stiften und müssen eine vorgegebene "
+"Sequenz (die vom Computer bestimmt wird) innerhalb einer bestimmten Anzahl "
+"von Rateversuchen reproduzieren."
+
+#. type: Plain text
+#: puzzles.but:1307
+msgid ""
+"Each guess gets marked with the number of correctly-coloured pegs in the "
+"correct places (in black), and also the number of correctly-coloured pegs in "
+"the wrong places (in white)."
+msgstr ""
+"Jede Vermutung wird mit der Anzahl der korrekt gefärbten Stifte an den "
+"korrekten Plätzen (in schwarz) und der Anzahl an korrekt gefärbten Stiften "
+"an den falschen Plätzen (in weiß) markiert."
+
+#. type: Plain text
+#: puzzles.but:1312
+msgid ""
+"This game is also known (and marketed, by Hasbro, mainly) as a board game "
+"\\q{\\i{Mastermind}}, with 6 colours, 4 pegs per row, and 10 guesses. "
+"However, this version allows custom settings of number of colours (up to "
+"10), number of pegs per row, and number of guesses."
+msgstr ""
+"Dieses Spiel ist auch (als von hauptsächlich Hasbro vertriebenes) Brettspiel "
+"\\q{\\i{Mastermind}} mit sechs Farben, vier Stiften pro Zeile und 10 "
+"Rateversuchen bekannt. Die Version in dieser Sammlung erlaubt allerdings die "
+"Anpassung der Farbanzahl (bis zu 10), der Anzahl der Stifte pro Zeile und "
+"der Anzahl der Rateversuche."
+
+#. type: Plain text
+#: puzzles.but:1314
+msgid "Guess was contributed to this collection by James Harvey."
+msgstr "Guess ist ein Beitrag von James Harvey zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:1316
+msgid "\\i{Guess controls}"
+msgstr "\\i{Guess-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:1317 puzzles.but:1318 puzzles.but:1319
+msgid "Guess controls"
+msgstr "Guess-Steuerung"
+
+#. type: IM
+#: puzzles.but:1317
+#, no-wrap
+msgid "controls, for Guess"
+msgstr "Steuerung, von Guess"
+
+#. type: IM
+#: puzzles.but:1318
+#, no-wrap
+msgid "keys, for Guess"
+msgstr "Tasten, für Guess"
+
+#. type: IM
+#: puzzles.but:1319
+#, no-wrap
+msgid "shortcuts (keyboard), for Guess"
+msgstr "Tastaturkürzel, für Guess"
+
+#. type: Plain text
+#: puzzles.but:1327
+msgid ""
+"With the mouse, drag a coloured peg from the tray on the left-hand side to "
+"its required position in the current guess; pegs may also be dragged from "
+"current and past guesses to copy them elsewhere. To remove a peg, drag it "
+"off its current position to somewhere invalid."
+msgstr ""
+"Ziehen Sie mit der Maus einen farbigen Stift von der Ablage auf der linken "
+"Seite an die benötigte Position für die aktuelle Vermutung; Stifte können "
+"auch von aktuellen und vorherigen Vermutungen als Kopie gezogen werden. Um "
+"einen Stift zu entfernen, ziehen Sie ihn von seiner aktuellen Position an "
+"eine beliebige ungültige Position."
+
+#. type: Plain text
+#: puzzles.but:1331
+msgid ""
+"Right-clicking in the current guess adds a \\q{hold} marker; pegs that have "
+"hold markers will be automatically added to the next guess after marking."
+msgstr ""
+"Rechtsklick auf eine aktuelle Vermutung fügt eine \\q{Haltemarkierung} "
+"hinzu. Stifte, die Ã¼ber eine Haltemarkierung verfügen werden nach der "
+"Markierung automatisch bei der nächsten Vermutungsrunde hinzugefügt."
+
+#. type: Plain text
+#: puzzles.but:1337
+msgid ""
+"Alternatively, with the keyboard, the up and down cursor keys can be used to "
+"select a peg colour, the left and right keys to select a peg position, and "
+"the space bar or Enter key to place a peg of the selected colour in the "
+"chosen position. \\q{D} or Backspace removes a peg, and Space adds a hold "
+"marker."
+msgstr ""
+"Alternativ kann auf der Tastatur mit den Hoch- und Runtertasten eine "
+"Stiftfarbe und mit den Rechts- und Linkstasten die Stiftposition ausgewählt "
+"werden. Die Leer- oder Eingabetaste platziert den Stift der gewählten Farbe "
+"an der gewählten Position. \\q{D} oder Rückschritt entfernt einen Stift und "
+"die Leertaste fügt eine Haltemarkierung hinzu."
+
+#. type: Plain text
+#: puzzles.but:1341
+msgid ""
+"Pressing \\q{h} or \\q{?} will fill the current guess with a suggested "
+"guess.  Using this is not recommended for 10 or more pegs as it is slow."
+msgstr ""
+"Mit \\q{h} oder \\q{?} wird die aktuelle Vermutung mit einer vorgeschlagenen "
+"Vermutung ausgefüllt. Bei 10 oder mehr Stiften wird dies nicht empfohlen, da "
+"es langsam ist."
+
+#. type: Plain text
+#: puzzles.but:1347
+msgid ""
+"When the guess is complete, the smaller feedback pegs will be highlighted; "
+"clicking on these (or moving the peg cursor to them with the arrow keys and "
+"pressing the space bar or Enter key) will mark the current guess, copy any "
+"held pegs to the next guess, and move the \\q{current guess} marker."
+msgstr ""
+"Wenn die Vermutung komplett ist, werden die kleineren Rückmeldestifte "
+"hervorgehoben; durch Draufklicken (oder Bewegen der Stiftemarkierung mit den "
+"Pfeiltasten zu ihnen und Drücken der Leer- oder Eingabetaste) wird die die "
+"aktuelle Vermutung markiert, alle gehaltenen Stifte zur nächsten Vermutung "
+"kopiert und die \\q{aktuelle Vermutungsmarkierung} verschoben."
+
+#. type: Plain text
+#: puzzles.but:1351
+msgid ""
+"If you correctly position all the pegs the solution will be displayed below; "
+"if you run out of guesses (or select \\q{Solve...}) the solution will also "
+"be revealed."
+msgstr ""
+"Falls Sie alle Stifte korrekt platzieren, wird die Lösung unten angezeigt; "
+"falls Ihnen die Vermutungsrunden ausgehen (oder Sie \\q{Solve...} verwenden) "
+"wird die Lösung auch offengelegt."
+
+#. type: Plain text
+#: puzzles.but:1355
+msgid "\\I{parameters, for Guess}Guess parameters"
+msgstr "\\I{Parameter, für Guess}Guess-Parameter"
+
+#. type: Plain text
+#: puzzles.but:1359
+msgid ""
+"These parameters are available from the \\q{Custom...} option on the "
+"\\q{Type} menu. The default game matches the parameters for the board game "
+"\\q{Mastermind}."
+msgstr ""
+"Diese Parameter sind von der Option \\q{Custom...} im Menü \\q{Type} "
+"verfügbar. Das Standardspiel stimmt mit den Parametern für das Brettspiel "
+"\\q{Mastermind} Ã¼berein."
+
+#. type: e{#1}
+#: puzzles.but:1361 puzzles.but:3226
+msgid "Colours"
+msgstr "Colours"
+
+#. type: Plain text
+#: puzzles.but:1364
+msgid ""
+"Number of colours the solution is chosen from; from 2 to 10 (more is harder)."
+msgstr ""
+"Anzahl der Farben, aus der die Lösung ausgewählt wird, von 2 bis 10 (mehr "
+"sind schwieriger)."
+
+#. type: e{#1}
+#: puzzles.but:1366
+msgid "Pegs per guess"
+msgstr "Pegs per guess"
+
+#. type: Plain text
+#: puzzles.but:1368
+msgid "Number of pegs per guess (more is harder)."
+msgstr "Anzahl der Stifte pro Vermutung (mehr ist schwerer)"
+
+#. type: e{#1}
+#: puzzles.but:1370
+msgid "Guesses"
+msgstr "Guesses"
+
+#. type: Plain text
+#: puzzles.but:1372
+msgid "Number of guesses you have to find the solution in (fewer is harder)."
+msgstr ""
+"Anzahl der Vermutungsrunden, die Sie zum Finden der Lösung haben (weniger "
+"ist schwerer)"
+
+#. type: e{#1}
+#: puzzles.but:1374
+msgid "Allow blanks"
+msgstr "Allow blanks"
+
+#. type: Plain text
+#: puzzles.but:1378
+msgid ""
+"Allows blank pegs to be given as part of a guess (makes it easier, because "
+"you know that those will never be counted as part of the solution). This is "
+"turned off by default."
+msgstr ""
+"Erlaubt Ihnen, leere Stifte als Teil einer Vermutungsrunde anzugeben (dies "
+"erleichtert es, da Sie wissen, dass diese niemals als Teil einer Lösung "
+"gezählt werden). Dies ist standardmäßig abgeschaltet."
+
+#. type: Plain text
+#: puzzles.but:1385
+msgid ""
+"Note that this doesn't allow blank pegs in the solution; if you really "
+"wanted that, use one extra colour."
+msgstr ""
+"Beachten Sie, dass dies keine leeren Stifte in der Lösung erlaubt; falls Sie "
+"das wirklich möchten, verwenden Sie eine zusätzliche Farbe."
+
+#. type: e{#1}
+#: puzzles.but:1387
+msgid "Allow duplicates"
+msgstr "Allow duplicates"
+
+#. type: Plain text
+#: puzzles.but:1391
+msgid ""
+"Allows the solution (and the guesses) to contain colours more than once; "
+"this increases the search space (making things harder), and is turned on by "
+"default."
+msgstr ""
+"Erlaubt, dass die Lösung (und die Vermutungsrunden) Farben mehr als einmal "
+"enthalten. Dies vergrößert den Suchraum (und erschwert dadurch die Lösung) "
+"und ist standardmäßig aktiviert."
+
+#. type: Plain text
+#: puzzles.but:1394
+msgid "\\i{Pegs}"
+msgstr "\\i{Pegs}"
+
+#. type: Plain text
+#: puzzles.but:1396
+msgid "\\cfg{winhelp-topic}{games.pegs}"
+msgstr "\\cfg{winhelp-topic}{games.pegs}"
+
+#. type: Plain text
+#: puzzles.but:1401
+msgid ""
+"A number of pegs are placed in holes on a board. You can remove a peg by "
+"jumping an adjacent peg over it (horizontally or vertically)  to a vacant "
+"hole on the other side. Your aim is to remove all but one of the pegs "
+"initially present."
+msgstr ""
+"Eine Reihe von Stiften in in Löchern auf einem Brett platziert. Sie können "
+"einen Stift entfernen, indem Sie einen benachbarten Stift (horizontal oder "
+"vertikal) in ein leeres Loch auf der anderen Seite darüber springen lassen "
+"Ihr Ziel besteht darin, alle bis auf einen der anfänglich verfügbaren Stifte "
+"zu entfernen."
+
+#. type: Plain text
+#: puzzles.but:1404
+msgid ""
+"This game, best known as \\I{Solitaire, Peg}\\q{Peg Solitaire}, is possibly "
+"one of the oldest puzzle games still commonly known."
+msgstr ""
+"Dieses Spiel, am besten als \\I{Solitaire, Peg}\\q{Stifte-Solitaire} "
+"bekannt, ist möglicherweise eines der Ã¤ltesten noch bekannten Puzzlespiele."
+
+#. type: Plain text
+#: puzzles.but:1406
+msgid "\\i{Pegs controls}"
+msgstr "\\i{Pegs-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:1407
+msgid "Pegs controls"
+msgstr "Pegs-Steuerung"
+
+#. type: IM
+#: puzzles.but:1407
+#, no-wrap
+msgid "controls, for Pegs"
+msgstr "Steuerung, von Pegs"
+
+#. type: Plain text
+#: puzzles.but:1414
+msgid ""
+"To move a peg, drag it with the mouse from its current position to its final "
+"position. If the final position is exactly two holes away from the initial "
+"position, is currently unoccupied by a peg, and there is a peg in the "
+"intervening square, the move will be permitted and the intervening peg will "
+"be removed."
+msgstr ""
+"Um einen Stift zu bewegen, ziehen Sie ihn mit der Maus von der aktuellen auf "
+"die endgültige Position. Falls die endgültige Position genau zwei Löcher von "
+"der Anfangsposition entfernt ist, in ihr kein Stift ist und sich in dem "
+"dazwischen liegenden Quadrat ein Stift befindet, wird der Spielzug erlaubt "
+"und der dazwischenliegende Stift entfernt."
+
+#. type: Plain text
+#: puzzles.but:1418
+msgid ""
+"Vacant spaces which you can move a peg into are marked with holes. A space "
+"with no peg and no hole is not available for moving at all: it is an "
+"obstacle which you must work around."
+msgstr ""
+"Leerräume, in denen Sie einen Stift bewegen können, werden mit Löchern "
+"markiert. Ein Leerraum ohne Stift und ohne Loch ist nicht für Spielzüge "
+"verfügbar: Es ist ein Hindernis, um das Sie sich herumarbeiten müssen."
+
+#. type: Plain text
+#: puzzles.but:1423
+msgid ""
+"You can also use the cursor keys to move a position indicator around the "
+"board. Pressing the return key while over a peg, followed by a cursor key, "
+"will jump the peg in that direction (if that is a legal move)."
+msgstr ""
+"Sie können auch die Pfeiltasten verwenden, um einen Positionsanzeiger Ã¼ber "
+"das Brett zu bewegen. Wenn Sie die Eingabetaste gefolgt von einer Pfeiltaste "
+"drücken, während Sie sich Ã¼ber einem Stift befinden, wird der Stift in die "
+"angegebene Richtung springen (falls das ein gültiger Spielzug ist)."
+
+#. type: Plain text
+#: puzzles.but:1427
+msgid "\\I{parameters, for Pegs}Pegs parameters"
+msgstr "\\I{Parameter, für Pegs}Pegs-Parameter"
+
+#. type: Plain text
+#: puzzles.but:1434
+msgid "Size of grid in holes."
+msgstr "Größe des Gitters in Löchern."
+
+#. type: e{#1}
+#: puzzles.but:1436
+msgid "Board type"
+msgstr "Board type"
+
+#. type: Plain text
+#: puzzles.but:1443
+msgid ""
+"Controls whether you are given a board of a standard shape or a randomly "
+"generated shape. The two standard shapes currently supported are \\q{Cross} "
+"and \\q{Octagon} (also commonly known as the English and European "
+"traditional board layouts respectively).  Selecting \\q{Random} will give "
+"you a different board shape every time (but always one that is known to have "
+"a solution)."
+msgstr ""
+"Stellt ein, ob Sie ein Brett in der Standardform oder in einer zufällig "
+"erstellten Form erhalten. Die derzeit unterstützen Standardformen sind "
+"\\q{Cross} (Kreuz) und \\q{Octagon} (Oktaeder) (auch als englisches bzw "
+"europäisches Brettformat bekannt). Durch die Auswahl von \\q{Random} "
+"(Zufall) erhalten Sie jedes Mal eine andere Brettform (aber immer eine, von "
+"der eine Lösung bekannt ist)."
+
+#. type: Plain text
+#: puzzles.but:1446
+msgid "\\i{Dominosa}"
+msgstr "\\i{Dominosa}"
+
+#. type: Plain text
+#: puzzles.but:1448
+msgid "\\cfg{winhelp-topic}{games.dominosa}"
+msgstr "\\cfg{winhelp-topic}{games.dominosa}"
+
+#. type: Plain text
+#: puzzles.but:1455
+msgid ""
+"A normal set of dominoes \\dash that is, one instance of every (unordered) "
+"pair of numbers from 0 to 6 \\dash has been arranged irregularly into a "
+"rectangle; then the number in each square has been written down and the "
+"dominoes themselves removed. Your task is to reconstruct the pattern by "
+"arranging the set of dominoes to match the provided array of numbers."
+msgstr ""
+"Ein normaler Satz Dominos \\dash d.h. jedes (ungeordnete) Paar von Zahlen "
+"von 0 bis 6 ist einmal vorhanden \\dash wurde unregelmäßig auf ein Rechteck "
+"arrangiert; dann wurde die Zahl in jedem Quadrat notiert und die Dominos "
+"selbst wurden entfernt. Ihre Aufgabe besteht darin, das Muster zu "
+"rekonstruieren, indem Sie den Satz an Dominos so arrangieren, dass Sie zu "
+"dem vorgegebenen Zahlenraster passen."
+
+#. type: Plain text
+#: puzzles.but:1458
+msgid ""
+"This puzzle is widely credited to O. S. Adler, and takes part of its name "
+"from those initials."
+msgstr ""
+"Dieses Puzzle wird häufig O. S. Adler zugeschrieben und erhält einen Teil "
+"seines Namens aus diesen Initialen."
+
+#. type: Plain text
+#: puzzles.but:1460
+msgid "\\i{Dominosa controls}"
+msgstr "\\i{Dominosa-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:1461
+msgid "Dominosa controls"
+msgstr "Dominosa-Steuerung"
+
+#. type: IM
+#: puzzles.but:1461
+#, no-wrap
+msgid "controls, for Dominosa"
+msgstr "Steuerung, von Dominosa"
+
+#. type: Plain text
+#: puzzles.but:1467
+msgid ""
+"Left-clicking between any two adjacent numbers places a domino covering "
+"them, or removes one if it is already present. Trying to place a domino "
+"which overlaps existing dominoes will remove the ones it overlaps."
+msgstr ""
+"Klicken mit der linken Maustaste zwischen zwei benachbarten Zahlen "
+"positioniert einen Domino, der beide bedeckt oder entfernt diesen, falls er "
+"bereits vorhanden ist. Wird versucht, einen Domino zu positionieren, der "
+"existierende Dominos Ã¼berlappt, so werden die Ã¼berlappten Dominos entfernt."
+
+#. type: Plain text
+#: puzzles.but:1472
+msgid ""
+"Right-clicking between two adjacent numbers draws a line between them, which "
+"you can use to remind yourself that you know those two numbers are \\e{not} "
+"covered by a single domino. Right-clicking again removes the line."
+msgstr ""
+"Durch Klicken mit der rechten Maustaste zwischen zwei benachbarte Zahlen "
+"wird eine Linie zwischen ihnen gezogen, die Sie dazu verwenden können, sich "
+"daran zu erinnern, dass diese zwei Zahlen \\e{nicht} von einem einzelnen "
+"Domino Ã¼berdeckt werden. Durch erneutes Klicken mit der rechten Maustaste "
+"wird die Linie wieder entfernt."
+
+#. type: Plain text
+#: puzzles.but:1478
+msgid ""
+"You can also use the cursor keys to move a cursor around the grid.  When the "
+"cursor is half way between two adjacent numbers, pressing the return key "
+"will place a domino covering those numbers, or pressing the space bar will "
+"lay a line between the two squares.  Repeating either action removes the "
+"domino or line."
+msgstr ""
+"Sie können auch die Pfeiltasten verwenden, um den Cursor durch das Gitter zu "
+"bewegen. Wenn der Cursor in der Mitte zwischen zwei benachbarten Zahlen ist, "
+"wird durch Drücken der Eingabetaste ein Domino platziert, der diese zwei "
+"Zahlen abdeckt. Wird stattdessen die Leertaste gedrückt, wird eine Linie "
+"zwischen den zwei Quadraten eingefügt. Durch Wiederholung einer der beiden "
+"Aktionen wird der Domino oder die Linie wieder entfernt."
+
+#. type: Plain text
+#: puzzles.but:1482
+msgid ""
+"Pressing a number key will highlight all occurrences of that number. "
+"Pressing that number again will clear the highlighting. Up to two different "
+"numbers can be highlighted at any given time."
+msgstr ""
+"Durch Drücken einer Zahltaste werden alle Vorkommen dieser Zahl "
+"hervorgehoben. Durch erneutes Drücken dieser Zahl wird die Hervorhebung "
+"aufgehoben. Bis zu zwei verschiedene Zahlen können auf diese Weise "
+"gleichzeitig hervorgehoben werden."
+
+#. type: Plain text
+#: puzzles.but:1486
+msgid "\\I{parameters, for Dominosa}Dominosa parameters"
+msgstr "\\I{Parameter, für Dominosa}Dominosa-Parameter"
+
+#. type: e{#1}
+#: puzzles.but:1491
+msgid "Maximum number on dominoes"
+msgstr "Maximum number on dominoes"
+
+#. type: Plain text
+#: puzzles.but:1496
+msgid ""
+"Controls the size of the puzzle, by controlling the size of the set of "
+"dominoes used to make it. Dominoes with numbers going up to N will give rise "
+"to an (N+2) \\by (N+1) rectangle; so, in particular, the default value of 6 "
+"gives an 8\\by\\.7 grid."
+msgstr ""
+"Steuert die Größe des Puzzles, indem es die Größe der Menge von hierzu "
+"verwandten Dominos steuert. Dominos mit Zahlen bis N ergeben ein (N+2) \\by "
+"(N+1)-Rechteck, damit ergibt der Vorgabewert von 6 ein 8\\by\\.7-Gitter."
+
+#. type: Plain text
+#: puzzles.but:1505
+msgid ""
+"Normally, Dominosa will make sure that the puzzles it presents have only one "
+"solution. Puzzles with ambiguous sections can be more difficult and "
+"sometimes more subtle, so if you like you can turn off this feature. Also, "
+"finding \\e{all} the possible solutions can be an additional challenge for "
+"an advanced player. Turning off this option can also speed up puzzle "
+"generation."
+msgstr ""
+"Normalerweise stellt Dominosa sicher, dass die vorgestellten Puzzle nur eine "
+"Lösung haben. Puzzle mit mehrdeutigen Abschnitten können schwieriger und "
+"manchmal subtiler sein, falls Sie dies mögen, können Sie daher diese "
+"Funktion abstellen. Auch kann das Finden \\e{aller} möglicher Lösungen eine "
+"zusätzliche Herausforderung für den fortgeschrittenen Spieler darstellen. "
+"Abschalten dieser Option kann auch die Puzzleerstellung beschleunigen."
+
+#. type: Plain text
+#: puzzles.but:1508
+msgid "\\i{Untangle}"
+msgstr "\\i{Untangle}"
+
+#. type: Plain text
+#: puzzles.but:1510
+msgid "\\cfg{winhelp-topic}{games.untangle}"
+msgstr "\\cfg{winhelp-topic}{games.untangle}"
+
+#. type: Plain text
+#: puzzles.but:1514
+msgid ""
+"You are given a number of points, some of which have lines drawn between "
+"them. You can move the points about arbitrarily; your aim is to position the "
+"points so that no line crosses another."
+msgstr ""
+"Sie bekommen eine Reihe von Punkten. Zwischen einigen davon sind Linien "
+"gezogen. Sie können die Punkte beliebig verschieben; Ihr Ziel besteht darin, "
+"die Punkte so zu positionieren, dass keine Linie eine andere Linie kreuzt."
+
+#. type: Plain text
+#: puzzles.but:1517
+msgid ""
+"I originally saw this in the form of a Flash game called \\i{Planarity} "
+"\\k{Planarity}, written by John Tantalo."
+msgstr ""
+"Ich habe das Spiel ursprünglich als Flash-Spiel mit dem Namen \\i{Planarity} "
+"\\k{Planarity}, geschrieben von John Tantalo, gesehen."
+
+#. type: Plain text
+#: puzzles.but:1519
+msgid "\\W{http://planarity.net}\\cw{http://planarity.net}"
+msgstr "\\W{http://planarity.net}\\cw{http://planarity.net}"
+
+#. type: Plain text
+#: puzzles.but:1521
+msgid "\\i{Untangle controls}"
+msgstr "\\i{Untangle-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:1522
+msgid "Untangle controls"
+msgstr "Untangle-Steuerung"
+
+#. type: IM
+#: puzzles.but:1522
+#, no-wrap
+msgid "controls, for Untangle"
+msgstr "Steuerung, von Untangle"
+
+#. type: Plain text
+#: puzzles.but:1526
+msgid ""
+"To move a point, click on it with the left mouse button and drag it into a "
+"new position."
+msgstr ""
+"Um einen Punkt zu bewegen, klicken Sie mit der linken Maustaste darauf und "
+"ziehen Sie ihn an seine neue Position."
+
+#. type: Plain text
+#: puzzles.but:1530
+msgid "\\I{parameters, for Untangle}Untangle parameters"
+msgstr "\\I{Parameter, für Untangle}Untangle-Parameter"
+
+#. type: Plain text
+#: puzzles.but:1533
+msgid ""
+"There is only one parameter available from the \\q{Custom...} option on the "
+"\\q{Type} menu:"
+msgstr ""
+"Es gibt nur einen Ã¼ber die \\q{Custom...}-Option im \\q{Type}-Menü "
+"verfügbaren Parameter:"
+
+#. type: e{#1}
+#: puzzles.but:1535
+msgid "Number of points"
+msgstr "Number of points"
+
+#. type: Plain text
+#: puzzles.but:1538
+msgid ""
+"Controls the size of the puzzle, by specifying the number of points in the "
+"generated graph."
+msgstr ""
+"Steuert die Größe des Puzzles, indem die Anzahl der Punkte im erstellten "
+"Graphen angegeben wird."
+
+#. type: Plain text
+#: puzzles.but:1541
+msgid "\\i{Black Box}"
+msgstr "\\i{Black Box}"
+
+#. type: Plain text
+#: puzzles.but:1543
+msgid "\\cfg{winhelp-topic}{games.blackbox}"
+msgstr "\\cfg{winhelp-topic}{games.blackbox}"
+
+#. type: Plain text
+#: puzzles.but:1547
+msgid ""
+"A number of balls are hidden in a rectangular arena. You have to deduce the "
+"positions of the balls by firing lasers positioned at the edges of the arena "
+"and observing how their beams are deflected."
+msgstr ""
+"Eine Reihe von Bällen sind in einem rechteckigen Gebiet versteckt. Sie "
+"müssen die Position der Bälle erschließen, indem Sie Laser aus Positionen an "
+"den Rändern der Arena abfeuern und beobachten, wie ihre Strahlen reflektiert "
+"werden."
+
+#. type: Plain text
+#: puzzles.but:1551
+msgid ""
+"Beams will travel straight from their origin until they hit the opposite "
+"side of the arena (at which point they emerge), unless affected by balls in "
+"one of the following ways:"
+msgstr ""
+"Strahlen laufen gradlinig von ihrem Ursprung bis sie die gegenüberliegende "
+"Seite der Arena treffen (wo sie wieder auftauchen), falls sie nicht in einer "
+"der folgenden Arten von Bällen betroffen sind:"
+
+#. type: Plain text
+#: puzzles.but:1555
+msgid ""
+"A beam that hits a ball head-on is absorbed and will never re-emerge. This "
+"includes beams that meet a ball on the first rank of the arena."
+msgstr ""
+"Ein Strahl, der einen Ball frontal trifft, wird absorbiert und nicht wieder "
+"auftauchen. Dies betrifft auch Strahlen, die einen Ball in der ersten Linie "
+"der Arena treffen."
+
+#. type: Plain text
+#: puzzles.but:1558
+msgid ""
+"A beam with a ball to its front-left square gets deflected 90 degrees to the "
+"right."
+msgstr ""
+"Ein Strahl mit einem Ball im Quadrat vorne links wird um 90 Grad nach rechts "
+"reflektiert."
+
+#. type: Plain text
+#: puzzles.but:1561
+msgid ""
+"A beam with a ball to its front-right square gets similarly deflected to the "
+"left."
+msgstr ""
+"Ein Strahl mit einem Ball im Quadrat vorne rechts wird entsprechend nach "
+"links reflektiert."
+
+#. type: Plain text
+#: puzzles.but:1564
+msgid ""
+"A beam that would re-emerge from its entry location is considered to be "
+"\\q{reflected}."
+msgstr ""
+"Ein Strahl, der an seiner Ursprungsposition wieder auftauchen würde, gilt "
+"als \\q{reflektiert}."
+
+#. type: Plain text
+#: puzzles.but:1568
+msgid ""
+"A beam which would get deflected before entering the arena by a ball to the "
+"front-left or front-right of its entry point is also considered to be "
+"\\q{reflected}."
+msgstr ""
+"Ein Strahl, der von einem Ball links oder rechts vor dem Eintrittspunkt "
+"abgelenkt würde, bevor er in die Arena eintritt, wird auch als "
+"\\q{reflektiert} betrachtet."
+
+#. type: Plain text
+#: puzzles.but:1573
+msgid ""
+"Beams that are reflected appear as a \\q{R}; beams that hit balls head-on "
+"appear as \\q{H}. Otherwise, a number appears at the firing point and the "
+"location where the beam emerges (this number is unique to that shot)."
+msgstr ""
+"Reflektierte Strahlen tauchen als \\q{R} auf; Strahlen, die Bälle frontal "
+"treffen, tauchen als \\q{H} auf. Andernfalls erscheint eine Nummer am "
+"Feuerpunkt und dem Ort, an dem der Strahl wieder auftaucht (diese Nummer ist "
+"eindeutig diesem Schuss zugeordnet)."
+
+#. type: Plain text
+#: puzzles.but:1577
+msgid ""
+"You can place guesses as to the location of the balls, based on the entry "
+"and exit patterns of the beams; once you have placed enough balls a button "
+"appears enabling you to have your guesses checked."
+msgstr ""
+"Sie können Vermutungen Ã¼ber den Ort der Bälle, basierend auf den Eintritts- "
+"und Austrittsmuster der Strahlen, platzieren; sobald Sie genug Bälle "
+"platziert haben, erscheint ein Knopf, der Ihnen die Ãœberprüfung Ihrer "
+"Vermutungen erlaubt."
+
+#. type: Plain text
+#: puzzles.but:1580
+msgid ""
+"Here is a diagram showing how the positions of balls can create each of the "
+"beam behaviours shown above:"
+msgstr ""
+"Hier ist ein Diagramm, das Ihnen zeigt, wie die Positionen der Bälle jedes "
+"der oben beschriebenen Strahlverhalten erzeugen können:"
+
+#. type: c
+#: puzzles.but:1581
+#, no-wrap
+msgid "1RHR----"
+msgstr "1RHR----"
+
+#. type: c
+#: puzzles.but:1582
+#, no-wrap
+msgid "|..O.O...|"
+msgstr "|..O.O...|"
+
+#. type: c
+#: puzzles.but:1583
+#, no-wrap
+msgid "2........3"
+msgstr "2........3"
+
+#. type: c
+#: puzzles.but:1584 puzzles.but:1585 puzzles.but:1603 puzzles.but:1604
+#: puzzles.but:1609 puzzles.but:1610
+#, no-wrap
+msgid "|........|"
+msgstr "|........|"
+
+#. type: c
+#: puzzles.but:1586
+#, no-wrap
+msgid "3........|"
+msgstr "3........|"
+
+#. type: c
+#: puzzles.but:1587
+#, no-wrap
+msgid "|......O.|"
+msgstr "|......O.|"
+
+#. type: c
+#: puzzles.but:1588
+#, no-wrap
+msgid "H........|"
+msgstr "H........|"
+
+#. type: c
+#: puzzles.but:1589
+#, no-wrap
+msgid "|.....O..|"
+msgstr "|.....O..|"
+
+#. type: c
+#: puzzles.but:1590
+#, no-wrap
+msgid "12-RR---"
+msgstr "12-RR---"
+
+#. type: Plain text
+#: puzzles.but:1596
+msgid ""
+"As shown, it is possible for a beam to receive multiple reflections before "
+"re-emerging (see turn 3). Similarly, a beam may be reflected (possibly more "
+"than once) before receiving a hit (the \\q{H} on the left side of the "
+"example)."
+msgstr ""
+"Wie gezeigt ist es möglich, dass ein Strahl mehrfach reflektiert wird, bevor "
+"er wieder auftaucht (siehe Spielschritt 3). Ã„hnlich kann ein Strahl "
+"(möglicherweise mehr als einmal) reflektiert werden, bevor er einen Treffer "
+"erhält (das \\q{H} auf der linken Seite im Beispiel)."
+
+#. type: Plain text
+#: puzzles.but:1601
+msgid ""
+"Note that any layout with more than 4 balls may have a non-unique solution.  "
+"The following diagram illustrates this; if you know the board contains 5 "
+"balls, it is impossible to determine where the fifth ball is (possible "
+"positions marked with an \\cw{x}):"
+msgstr ""
+"Beachten Sie, dass jede Anordnung mit mehr als vier Bällen nicht eindeutige "
+"Lösungen haben könnte. Das folgende Diagramm illustriert dies; falls Sie "
+"wissen, dass das Brett fünf Bälle enthält, ist es unmöglich, zu bestimmen, "
+"wo der fünfte Ball ist (mögliche Lösungen sind durch \\cw{x} gekennzeichnet):"
+
+#. type: c
+#: puzzles.but:1602 puzzles.but:1611
+#, no-wrap
+msgid "--------"
+msgstr "--------"
+
+#. type: c
+#: puzzles.but:1605 puzzles.but:1608
+#, no-wrap
+msgid "|..O..O..|"
+msgstr "|..O..O..|"
+
+#. type: c
+#: puzzles.but:1606 puzzles.but:1607
+#, no-wrap
+msgid "|...xx...|"
+msgstr "|...xx...|"
+
+#. type: Plain text
+#: puzzles.but:1619
+msgid ""
+"For this reason, when you have your guesses checked, the game will check "
+"that your solution \\e{produces the same results} as the computer's, rather "
+"than that your solution is identical to the computer's. So in the above "
+"example, you could put the fifth ball at \\e{any} of the locations marked "
+"with an \\cw{x}, and you would still win."
+msgstr ""
+"Aus diesem Grund testet das Spiel, wenn Sie Ihre Vermutung Ã¼berprüft haben "
+"wollen, dass Ihre Lösung \\e{das gleiche Ergebnis} wie die des Computers "
+"produziert, statt zu prüfen, ob Ihre Lösung mit der des Computers "
+"übereinstimmt. Daher können Sie im obigen Beispiel den fünften Ball auf "
+"\\e{einen beliebigen} der mit \\cw{x} markierten Plätze setzen und Sie "
+"würden immer noch gewinnen."
+
+#. type: Plain text
+#: puzzles.but:1621
+msgid "Black Box was contributed to this collection by James Harvey."
+msgstr "Black Box ist ein Beitrag von James Harvey zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:1623
+msgid "\\i{Black Box controls}"
+msgstr "\\i{Black Box-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:1624 puzzles.but:1625 puzzles.but:1626
+msgid "Black Box controls"
+msgstr "Black Box-Steuerung"
+
+#. type: IM
+#: puzzles.but:1624
+#, no-wrap
+msgid "controls, for Black Box"
+msgstr "Steuerung, von Black Box"
+
+#. type: IM
+#: puzzles.but:1625
+#, no-wrap
+msgid "keys, for Black Box"
+msgstr "Tasten, für Black Box"
+
+#. type: IM
+#: puzzles.but:1626
+#, no-wrap
+msgid "shortcuts (keyboard), for Black Box"
+msgstr "Tastaturkürzel, für Black Box"
+
+#. type: Plain text
+#: puzzles.but:1633
+msgid ""
+"To fire a laser beam, left-click in a square around the edge of the arena. "
+"The results will be displayed immediately. Clicking or holding the left "
+"button on one of these squares will highlight the current go (or a previous "
+"go) to confirm the exit point for that laser, if applicable."
+msgstr ""
+"Um einen Laserstrahl abzufeuern, klicken Sie links in ein Quadrat am Rande "
+"der Arena. Das Ergebnis wird sofort angezeigt. Der aktuelle (oder alte) "
+"Durchlauf kann durch Drücken oder Halten der linken Taste hervorgehoben "
+"werden, um den Austrittspunkt für den Laser, falls zutreffend, zu bestätigen."
+
+#. type: Plain text
+#: puzzles.but:1637
+msgid ""
+"To guess the location of a ball, left-click within the arena and a black "
+"circle will appear marking the guess; click again to remove the guessed ball."
+msgstr ""
+"Um den Ort eines Balles zu raten, klicken Sie links in die Arena und ein "
+"schwarzer Kreis markiert dort die vermutete Position; klicken Sie erneut, um "
+"den vermuteten Ball zu entfernen."
+
+#. type: Plain text
+#: puzzles.but:1642
+msgid ""
+"Locations in the arena may be locked against modification by right-clicking; "
+"whole rows and columns may be similarly locked by right-clicking in the "
+"laser square above/below that column, or to the left/right of that row."
+msgstr ""
+"Durch Rechtsklick können Stellen in der Arena gegen Veränderungen gesperrt "
+"werden; ganze Zeilen und Spalten können entsprechend durch Rechtsklick im "
+"Laserquadrat oberhalb oder unterhalb der Spalte bzw. rechts oder links der "
+"Zeile gesperrt werden."
+
+#. type: Plain text
+#: puzzles.but:1646
+msgid ""
+"The cursor keys may also be used to move around the grid. Pressing the Enter "
+"key will fire a laser or add a new ball-location guess, and pressing Space "
+"will lock a cell, row, or column."
+msgstr ""
+"Die Pfeiltasten können auch zu Bewegung im Gitter verwandt werden. Durch "
+"Drücken der Eingabetaste wird ein Laser gefeuert oder eine neue Ballort-"
+"Vermutung hinzugefügt und durch Drücken der Leertaste wird eine Zelle, Zeile "
+"oder Spalte gesperrt."
+
+#. type: Plain text
+#: puzzles.but:1650
+msgid ""
+"When an appropriate number of balls have been guessed, a button will appear "
+"at the top-left corner of the grid; clicking that (with mouse or cursor) "
+"will check your guesses."
+msgstr ""
+"Wenn eine geeignete Zahl an Bällen geraten wurde erscheint ein Knopf in der "
+"oberen linken Ecke des Gitters; durch Anklicken (mit der Maus oder dem "
+"Cursor) wird Ihre Vermutung Ã¼berprüft."
+
+#. type: Plain text
+#: puzzles.but:1659
+msgid ""
+"If you click the \\q{check} button and your guesses are not correct, the "
+"game will show you the minimum information necessary to demonstrate this to "
+"you, so you can try again. If your ball positions are not consistent with "
+"the beam paths you already know about, one beam path will be circled to "
+"indicate that it proves you wrong. If your positions match all the existing "
+"beam paths but are still wrong, one new beam path will be revealed (written "
+"in red)  which is not consistent with your current guesses."
+msgstr ""
+"Falls Sie den \\q{Check}-Knopf anklicken und Ihre Vermutungen nicht korrekt "
+"sind, wird das Spiel Ihnen das Minimum an Informationen zeigen, um Ihnen "
+"dies vorzuführen, damit Sie es erneut versuchen können. Falls Ihre "
+"Ballpositionen nicht mit den Ihnen bereits bekannten Strahlen konsistent "
+"sind, wird ein Strahl eingekreist, um Ihnen anzudeuten, dass Sie falsch "
+"liegen. Falls die Positionen zu allen existierenden Strahlen passt, Sie aber "
+"immer noch falsch liegen, wird ein neuer Strahl (angezeigt in rot) "
+"aufgedeckt, der nicht zu Ihrer aktuellen Vermutung passt."
+
+#. type: Plain text
+#: puzzles.but:1669
+msgid ""
+"If you decide to give up completely, you can select Solve to reveal the "
+"actual ball positions. At this point, correctly-placed balls will be "
+"displayed as filled black circles, incorrectly-placed balls as filled black "
+"circles with red crosses, and missing balls as filled red circles. In "
+"addition, a red circle marks any laser you had already fired which is not "
+"consistent with your ball layout (just as when you press the \\q{check} "
+"button), and red text marks any laser you \\e{could} have fired in order to "
+"distinguish your ball layout from the correct one."
+msgstr ""
+"Falls Sie sich entscheiden, komplett aufzugeben, können Sie Solve anwählen, "
+"um die tatsächlichen Ballpositionen aufzudecken. Zu diesem Zeitpunkt werden "
+"korrekt positionierte Bälle als ausgefüllte schwarze Kreise dargestellt, "
+"inkorrekt positionierte Bälle als ausgefüllte schwarze Kreise mit roten "
+"Kreuzen und fehlende Bälle als ausgefüllte rote Kreise. Zusätzlich markieren "
+"rote Kreise alle Laser, die Sie bereits abgefeuert haben und die nicht mit "
+"Ihrer Ballverteilung konsistent waren (genauso wie beim Drücken des "
+"\\q{Check}-Knopfes), und roter Text markiert alle Laser, die Sie abgefeuert "
+"hätten \\e{können}, um Ihre Ballverteilung von der richtigen zu "
+"unterscheiden."
+
+#. type: Plain text
+#: puzzles.but:1673
+msgid "\\I{parameters, for Black Box}Black Box parameters"
+msgstr "\\I{Parameter, für Black Box}Black Box-Parameter"
+
+#. type: Plain text
+#: puzzles.but:1681
+msgid ""
+"Size of grid in squares. There are 2 \\by \\e{Width} \\by \\e{Height} lasers "
+"per grid, two per row and two per column."
+msgstr ""
+"Größe des Gitters in Quadraten. Es gibt 2 \\by \\e{Width} \\by \\e{Height} "
+"Laser pro Gitter, zwei pro Zeile und zwei pro Spalte."
+
+#. type: e{#1}
+#: puzzles.but:1683
+msgid "No. of balls"
+msgstr "No. of balls"
+
+#. type: Plain text
+#: puzzles.but:1690
+msgid ""
+"Number of balls to place in the grid. This can be a single number, or a "
+"range (separated with a hyphen, like \\q{2-6}), and determines the number of "
+"balls to place on the grid. The \\q{reveal} button is only enabled if you "
+"have guessed an appropriate number of balls; a guess using a different "
+"number to the original solution is still acceptable, if all the beam inputs "
+"and outputs match."
+msgstr ""
+"Anzahl der im Gitter zu positionierenden Bälle. Dies kann eine einzelne Zahl "
+"oder ein Bereich (getrennt durch einen Bindestrich wie \\q{2-6} sein) und "
+"bestimmt die Anzahl der im Gitter zu positionierenden Bälle. Der \\q{reveal}-"
+"Knopf wird nur aktiviert, falls Sie die entsprechende Anzahl von Bällen "
+"geraten haben; eine Vermutung mit einer anderen Anzahl als die ursprüngliche "
+"Lösung ist nur akzeptabel, falls alle Strahleingänge und -ausgänge passen."
+
+#. type: Plain text
+#: puzzles.but:1693
+msgid "\\i{Slant}"
+msgstr "\\i{Slant}"
+
+#. type: Plain text
+#: puzzles.but:1695
+msgid "\\cfg{winhelp-topic}{games.slant}"
+msgstr "\\cfg{winhelp-topic}{games.slant}"
+
+#. type: Plain text
+#: puzzles.but:1699
+msgid ""
+"You have a grid of squares. Your aim is to draw a diagonal line through each "
+"square, and choose which way each line slants so that the following "
+"conditions are met:"
+msgstr ""
+"Sie bekommen ein Gitter von Quadraten. Ihr Ziel besteht darin, eine "
+"diagonale Linie durch jedes Quadrat zu zeichnen und auszuwählen, in welche "
+"Richtung sich jede Linie neigt, so dass die folgenden Bedingungen erfüllt "
+"sind:"
+
+#. type: Plain text
+#: puzzles.but:1701
+msgid "The diagonal lines never form a loop."
+msgstr "Die diagonalen Linien bilden niemals eine Schleife."
+
+#. type: Plain text
+#: puzzles.but:1707
+msgid ""
+"Any point with a circled number has precisely that many lines meeting at it. "
+"(Thus, a 4 is the centre of a cross shape, whereas a zero is the centre of a "
+"diamond shape \\dash or rather, a partial diamond shape, because a zero can "
+"never appear in the middle of the grid because that would immediately cause "
+"a loop.)"
+msgstr ""
+"An jedem Punkt mit einer eingekreisten Zahl treffen sich genau diese Anzahl "
+"an Linien. (Daher ist die 4 das Zentrum einer Kreuzform, während eine Null "
+"das Zentrum einer Diamantform ist \\dash oder besser, einer teilweisen "
+"Diamantform, da eine Null niemals in der Mitte des Gitters auftauchen darf, "
+"da sie sofort zu einer Schleife führen würde.)"
+
+#. type: Plain text
+#: puzzles.but:1709
+msgid "Credit for this puzzle goes to \\i{Nikoli} \\k{nikoli-slant}."
+msgstr "Dank für dieses Puzzle geht an \\i{Nikoli} \\k{nikoli-slant}."
+
+#. type: Plain text
+#: puzzles.but:1713
+msgid ""
+"\\W{http://www.nikoli.co.jp/ja/puzzles/gokigen_naname}\\cw{http://www.nikoli."
+"co.jp/ja/puzzles/gokigen_naname} (in Japanese)"
+msgstr "\\W{http://www.nikoli.co.jp/ja/puzzles/gokigen_naname}\\cw{http://www.nikoli.co.jp/ja/puzzles/gokigen_naname} (auf Japanisch)"
+
+#. type: Plain text
+#: puzzles.but:1715
+msgid "\\i{Slant controls}"
+msgstr "\\i{Slant-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:1716
+msgid "Slant controls"
+msgstr "Slant-Steuerung"
+
+#. type: IM
+#: puzzles.but:1716
+#, no-wrap
+msgid "controls, for Slant"
+msgstr "Steuerung, von Slant"
+
+#. type: Plain text
+#: puzzles.but:1723
+msgid ""
+"Left-clicking in a blank square will place a \\cw{\\\\} in it (a line "
+"leaning to the left, i.e. running from the top left of the square to the "
+"bottom right). Right-clicking in a blank square will place a \\cw{/} in it "
+"(leaning to the right, running from top right to bottom left)."
+msgstr ""
+"Durch Linksklick in ein leeres Quadrat wird dort ein \\cw{\\\\} (eine Linie, "
+"die sich nach links neigt, d.h. von der linken oberen in die rechte untere "
+"Ecke des Quadrats läuft) platziert. Durch Rechtsklick in ein leeres Quadrat "
+"wird dort ein \\cw{/} (Neigung nach rechts, von der rechten oberen in die "
+"linke untere Ecke) platziert."
+
+#. type: Plain text
+#: puzzles.but:1730
+msgid ""
+"Continuing to click either button will cycle between the three possible "
+"square contents. Thus, if you left-click repeatedly in a blank square it "
+"will change from blank to \\cw{\\\\} to \\cw{/} back to blank, and if you "
+"right-click repeatedly the square will change from blank to \\cw{/} to "
+"\\cw{\\\\} back to blank. (Therefore, you can play the game entirely with "
+"one button if you need to.)"
+msgstr ""
+"Durch fortlaufendes Drücken eines der Knöpfe wird zyklisch zwischen den drei "
+"möglichen Quadratinhalten umgeschaltet. Falls Sie daher wiederholt in ein "
+"leeres Quadrat linksklicken wird es von leer zu \\cw{\\\\} zu \\cw{/} und "
+"wieder zurück zu leer umschalten und falls Sie wiederholt linksklicken wird "
+"das Quadrat von leer zu \\cw{/} zu \\cw{\\\\} und wieder zurück zu leer "
+"umschalten. (Daher können Sie falls notwendig das Spiel komplett mit einer "
+"Taste spielen)."
+
+#. type: Plain text
+#: puzzles.but:1737
+msgid ""
+"You can also use the cursor keys to move around the grid. Pressing the "
+"return or space keys will place a \\cw{\\\\} or a \\cw{/}, respectively, and "
+"will then cycle them as above.  You can also press \\cw{/} or \\cw{\\\\} to "
+"place a \\cw{/} or \\cw{\\\\}, respectively, independent of what is already "
+"in the cursor square.  Backspace removes any line from the cursor square."
+msgstr ""
+"Sie können auch die Pfeiltasten verwenden, um sich auf dem Gitter zu "
+"bewegen. Durch Drücken der Eingabe- oder Leertaste wird ein \\cw{\\\\} bzw. "
+"ein \\cw{/} platziert und dies dann zyklisch wie oben durchlaufen. Sie können "
+"auch \\cw{/} oder \\cw{\\\\} drücken, um ein \\cw{/} oder entsprechend "
+"\\cw{\\\\} zu setzen, unabhängig davon, was bereits im Quadrat unter dem "
+"Cursor vorliegt. Rückschritt entfernt jede Zeile aus dem Quadrat unter dem "
+"Cursor."
+
+#. type: Plain text
+#: puzzles.but:1741
+msgid "\\I{parameters, for Slant}Slant parameters"
+msgstr "\\I{Parameter, für Slant}Slant-Parameter"
+
+#. type: e{#1}
+#: puzzles.but:1750 puzzles.but:1839 puzzles.but:1921 puzzles.but:2005
+#: puzzles.but:2131 puzzles.but:2247 puzzles.but:2382 puzzles.but:2452
+#: puzzles.but:2606 puzzles.but:2704 puzzles.but:2760 puzzles.but:2829
+#: puzzles.but:3129 puzzles.but:3176 puzzles.but:3290
+msgid "Difficulty"
+msgstr "Difficulty"
+
+#. type: Plain text
+#: puzzles.but:1759
+msgid ""
+"Controls the difficulty of the generated puzzle. At Hard level, you are "
+"required to do deductions based on knowledge of \\e{relationships} between "
+"squares rather than always being able to deduce the exact contents of one "
+"square at a time. (For example, you might know that two squares slant in the "
+"same direction, even if you don't yet know what that direction is, and this "
+"might enable you to deduce something about still other squares.) Even at "
+"Hard level, guesswork and backtracking should never be necessary."
+msgstr ""
+"Steuert die Schwierigkeit des generierten Puzzles. In der Stufe Hard wird "
+"von Ihnen verlangt, Herleitungen basierend auf Wissen Ã¼ber \\e{Beziehungen} "
+"zwischen Quadraten zu verwenden, statt immer den Inhalt eines Quadrates auf "
+"einmal zu erschließen. (Beispielsweise könnten Sie wissen, dass sich zwei "
+"Quadrate immer in die gleiche Richtung neigen, ohne schon zu wissen, in "
+"welche Richtung sie es tun und dies könnte Ihnen erlauben, bereits etwas "
+"anderes Ã¼ber andere Quadrate herzuleiten.) Selbst auf der Stufe Hard sollte "
+"Raten und Rückverfolgung niemals notwendig sein."
+
+#. type: Plain text
+#: puzzles.but:1762
+msgid "\\i{Light Up}"
+msgstr "\\i{Light Up}"
+
+#. type: Plain text
+#: puzzles.but:1764
+msgid "\\cfg{winhelp-topic}{games.lightup}"
+msgstr "\\cfg{winhelp-topic}{games.lightup}"
+
+#. type: Plain text
+#: puzzles.but:1768
+msgid ""
+"You have a grid of squares. Some are filled in black; some of the black "
+"squares are numbered. Your aim is to \\q{light up} all the empty squares by "
+"placing light bulbs in some of them."
+msgstr ""
+"Sie haben ein Gitter von Quadraten. Einige sind schwarz ausgefüllt, einige "
+"der schwarzen Quadrate sind nummeriert. Ihr Ziel besteht darin, alle leeren "
+"Quadrate zu \\q{erleuchten}, indem Sie in einige davon Glühbirnen platzieren."
+
+#. type: Plain text
+#: puzzles.but:1772
+msgid ""
+"Each light bulb illuminates the square it is on, plus all squares in line "
+"with it horizontally or vertically unless a black square is blocking the way."
+msgstr ""
+"Jede Glühbirne erleuchtet das Quadrat, in dem es sich befindet, sowie alle "
+"Quadrate in einer Linie (sowohl horizontal als auch vertikal) soweit kein "
+"schwarzes Quadrat den Weg blockiert."
+
+#. type: Plain text
+#: puzzles.but:1774
+msgid "To win the game, you must satisfy the following conditions:"
+msgstr "Um das Spiel zu gewinnen, müssen folgende Bedingungen erfüllt sein:"
+
+#. type: Plain text
+#: puzzles.but:1776
+msgid "All non-black squares are lit."
+msgstr "Alle nicht schwarzen Quadrate müssen erleuchtet sein."
+
+#. type: Plain text
+#: puzzles.but:1778
+msgid "No light is lit by another light."
+msgstr "Kein Licht wird von einem anderen Licht erleuchtet."
+
+#. type: Plain text
+#: puzzles.but:1781
+msgid ""
+"All numbered black squares have exactly that number of lights adjacent to "
+"them (in the four squares above, below, and to the side)."
+msgstr ""
+"Jedes nummerierte schwarze Quadrat hat genau die angegebene Anzahl an "
+"Lichtern direkt daneben (in den vier Quadraten oberhalb, unterhalb und an "
+"den Seiten)."
+
+#. type: Plain text
+#: puzzles.but:1783
+msgid ""
+"Non-numbered black squares may have any number of lights adjacent to them."
+msgstr ""
+"Bei nicht nummerierten schwarzen Quadraten darf eine beliebige Anzahl von "
+"Lichtern in der direkten Nachbarschaft sein."
+
+#. type: Plain text
+#: puzzles.but:1785
+msgid "Credit for this puzzle goes to \\i{Nikoli} \\k{nikoli-lightup}."
+msgstr "Dank für dieses Puzzle geht an \\i{Nikoli} \\k{nikoli-lightup}."
+
+#. type: Plain text
+#: puzzles.but:1787
+msgid "Light Up was contributed to this collection by James Harvey."
+msgstr "Light Up ist ein Beitrag von James Harvey zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:1791
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/akari.html}\\cw{http://www.nikoli.co."
+"jp/en/puzzles/akari.html} (beware of Flash)"
+msgstr "\\W{http://www.nikoli.co.jp/en/puzzles/akari.html}\\cw{http://www.nikoli.co.jp/en/puzzles/akari.html} (Achtung Flash)"
+
+#. type: Plain text
+#: puzzles.but:1793
+msgid "\\i{Light Up controls}"
+msgstr "\\i{Light Up-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:1794
+msgid "Light Up controls"
+msgstr "Light Up-Steuerung"
+
+#. type: IM
+#: puzzles.but:1794
+#, no-wrap
+msgid "controls, for Light Up"
+msgstr "Steuerung, von Light Up"
+
+#. type: Plain text
+#: puzzles.but:1799
+msgid ""
+"Left-clicking in a non-black square will toggle the presence of a light in "
+"that square. Right-clicking in a non-black square toggles a mark there to "
+"aid solving; it can be used to highlight squares that cannot be lit, for "
+"example."
+msgstr ""
+"Durch Linksklick in ein nicht schwarzes Quadrat schalten Sie die Anwesenheit "
+"eines Lichts an oder aus. Durch Rechtsklick auf ein nicht schwarzes Quadrat "
+"wird eine Markierung ein- oder ausgeschaltet, um Ihnen bei der Lösung zu "
+"helfen; beispielsweise kann es Quadrate hervorheben, die nicht beleuchtet "
+"werden können."
+
+#. type: Plain text
+#: puzzles.but:1801
+msgid ""
+"You may not place a light in a marked square, nor place a mark in a lit "
+"square."
+msgstr ""
+"Sie dürfen weder ein Licht in ein markiertes Quadrat noch eine Markierung in "
+"ein beleuchtetes Quadrat setzten."
+
+#. type: Plain text
+#: puzzles.but:1805
+msgid ""
+"The game will highlight obvious errors in red. Lights lit by other lights "
+"are highlighted in this way, as are numbered squares which do not (or "
+"cannot) have the right number of lights next to them."
+msgstr ""
+"Das Spiel wird offensichtliche Fehler rot markieren. Lichter, die von "
+"anderen Lichtern erleuchtet werden, werden so hervorgehoben, genauso wie "
+"nummerierte Quadrate, die nicht die richtige Anzahl an Lichtern in der "
+"direkten Nachbarschaft haben (oder haben können)."
+
+#. type: Plain text
+#: puzzles.but:1808
+msgid ""
+"Thus, the grid is solved when all non-black squares have yellow highlights "
+"and there are no red lights."
+msgstr ""
+"Daher ist das Gitter gelöst, wenn alle nicht schwarzen Quadrate gelb "
+"hervorgehoben sind und es keine roten Lichter gibt."
+
+#. type: Plain text
+#: puzzles.but:1812
+msgid "\\I{parameters, for Light Up}Light Up parameters"
+msgstr "\\I{Parameter, für Light Up}Light Up-Parameter"
+
+#. type: e{#1}
+#: puzzles.but:1821
+msgid "%age of black squares"
+msgstr "%age of black squares"
+
+#. type: Plain text
+#: puzzles.but:1823
+msgid "Rough percentage of black squares in the grid."
+msgstr "Grobe Prozentzahl an schwarzen Quadraten im Gitter."
+
+#. type: Plain text
+#: puzzles.but:1831
+msgid ""
+"This is a hint rather than an instruction. If the grid generator is unable "
+"to generate a puzzle to this precise specification, it will increase the "
+"proportion of black squares until it can."
+msgstr ""
+"Dies ist eher ein Hinweis als eine Anweisung. Falls die Gittererzeugung "
+"eines Puzzles mit der präzisen Spezifikation nicht möglich ist, wird das "
+"Verhältnis der schwarzen Quadrate solange erhöht, bis die Gittererzeugung "
+"gelingt."
+
+#. type: e{#1}
+#: puzzles.but:1833
+msgid "Symmetry"
+msgstr "Symmetry"
+
+#. type: Plain text
+#: puzzles.but:1837
+msgid ""
+"Allows you to specify the required symmetry of the black squares in the "
+"grid. (This does not affect the difficulty of the puzzles noticeably.)"
+msgstr ""
+"Erlaubt Ihnen, die benötigte Symmetrie der schwarzen Quadrate im Gitter "
+"anzugeben. (Dies beeinflusst die Schwierigkeit des Puzzles nicht merklich.)"
+
+#. type: Plain text
+#: puzzles.but:1843
+msgid ""
+"\\q{Easy} means that the puzzles should be soluble without backtracking or "
+"guessing, \\q{Hard} means that some guesses will probably be necessary."
+msgstr ""
+"\\q{Easy} bedeutet, dass das Spiel ohne Rückverfolgungen oder Raten gelöst "
+"werden kann, \\q{Hard} bedeutet, dass Raten wahrscheinlich notwendig sein "
+"wird."
+
+#. type: Plain text
+#: puzzles.but:1846
+msgid "\\i{Map}"
+msgstr "\\i{Map}"
+
+#. type: Plain text
+#: puzzles.but:1848
+msgid "\\cfg{winhelp-topic}{games.map}"
+msgstr "\\cfg{winhelp-topic}{games.map}"
+
+#. type: Plain text
+#: puzzles.but:1854
+msgid ""
+"You are given a map consisting of a number of regions. Your task is to "
+"colour each region with one of four colours, in such a way that no two "
+"regions sharing a boundary have the same colour. You are provided with some "
+"regions already coloured, sufficient to make the remainder of the solution "
+"unique."
+msgstr ""
+"Sie bekommen eine Karte bestehend aus einer Anzahl an Regionen. Ihre Aufgabe "
+"besteht darin, jede Region in einer der vier Farben einzufärben und zwar "
+"derart, dass keine zwei Regionen mit gemeinsamer Grenze die gleiche Farbe "
+"haben. Sie erhalten bereits einige Regionen eingefärbt; ausreichend viele, "
+"um den Rest der Lösung eindeutig zu gestalten."
+
+#. type: Plain text
+#: puzzles.but:1858
+msgid ""
+"Only regions which share a length of border are required to be different "
+"colours. Two regions which meet at only one \\e{point} (i.e. are diagonally "
+"separated) may be the same colour."
+msgstr ""
+"Nur Regionen, die ein gemeinsames Stück Grenze haben, müssen in "
+"verschiedenen Farben vorliegen. Zwei Regionen, die sich nur an einem "
+"\\e{Punkt} treffen (d.h. diagonal separiert sind) können die gleiche Farbe "
+"haben."
+
+#. type: Plain text
+#: puzzles.but:1865
+msgid ""
+"I believe this puzzle is original; I've never seen an implementation of it "
+"anywhere else. The concept of a \\i{four-colouring} puzzle was suggested by "
+"Owen Dunn; credit must also go to Nikoli and to Verity Allan for inspiring "
+"the train of thought that led to me realising Owen's suggestion was a viable "
+"puzzle. Thanks also to Gareth Taylor for many detailed suggestions."
+msgstr ""
+"Ich bin der Meinung, dieses Puzzle ist ein Original; ich habe niemals "
+"irgendwo anders eine Implementierung davon gesehen. Das Konzept eines "
+"\\i{vier Farben}-Puzzles wurde von Owen Dunn vorgeschlagen; Dank muss auch "
+"an Nikoli und an Verity Allan für die Anregung des Gedankengangs gehen, der "
+"mich dazu brachte, Owens Vorschlag als mögliches Puzzle zu begreifen. Dank "
+"auch an Gareth Taylor für viele detaillierte Vorschläge."
+
+#. type: Plain text
+#: puzzles.but:1867
+msgid "\\i{Map controls}"
+msgstr "\\i{Map-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:1868
+msgid "Map controls"
+msgstr "Map-Steuerung"
+
+#. type: IM
+#: puzzles.but:1868
+#, no-wrap
+msgid "controls, for Map"
+msgstr "Steuerung, von Map"
+
+#. type: Plain text
+#: puzzles.but:1873
+msgid ""
+"To colour a region, click the left mouse button on an existing region of the "
+"desired colour and drag that colour into the new region."
+msgstr ""
+"Um ein Gebiet einzufärben, klicken Sie mit der linken Maustaste in ein "
+"existierendes Gebiet der gewünschten Farbe und ziehen Sie die Farbe in die "
+"neue Region."
+
+#. type: Plain text
+#: puzzles.but:1876
+msgid ""
+"(The program will always ensure the starting puzzle has at least one region "
+"of each colour, so that this is always possible!)"
+msgstr ""
+"(Das Programm wird immer sicherstellen, dass das Startpuzzle mindestens eine "
+"Region in jeder Farbe hat, so dass dies immer möglich ist!)"
+
+#. type: Plain text
+#: puzzles.but:1879
+msgid ""
+"If you need to clear a region, you can drag from an empty region, or from "
+"the puzzle boundary if there are no empty regions left."
+msgstr ""
+"Falls Sie die Farbe in einer Region entfernen möchten, können Sie von einer "
+"leeren Region hineinziehen oder vom Rand des Puzzles, falls keine leeren "
+"Regionen mehr Ã¼brig sind."
+
+#. type: Plain text
+#: puzzles.but:1885
+msgid ""
+"Dragging a colour using the \\e{right} mouse button will stipple the region "
+"in that colour, which you can use as a note to yourself that you think the "
+"region \\e{might} be that colour. A region can contain stipples in multiple "
+"colours at once. (This is often useful at the harder difficulty levels.)"
+msgstr ""
+"Ziehen einer Farbe mit der \\e{rechten} Maustaste tüpfelt die Region in der "
+"Farbe. Dies können Sie als Hinweis für sich selbst verwenden, dass Sie "
+"denken, die Region \\e{könnte} diese Farbe haben. Eine Region kann "
+"gleichzeitig in mehreren Farben getüpfelt werden. (Dies ist bei höheren "
+"Schwierigkeitsgraden oft nützlich.)"
+
+#. type: Plain text
+#: puzzles.but:1897
+msgid ""
+"You can also use the cursor keys to move around the map: the colour of the "
+"cursor indicates the position of the colour you would drag (which is not "
+"obvious if you're on a region's boundary, since it depends on the direction "
+"from which you approached the boundary). Pressing the return key starts a "
+"drag of that colour, as above, which you control with the cursor keys; "
+"pressing the return key again finishes the drag. The space bar can be used "
+"similarly to create a stippled region.  Double-pressing the return key "
+"(without moving the cursor) will clear the region, as a drag from an empty "
+"region does: this is useful with the cursor mode if you have filled the "
+"entire map in but need to correct the layout."
+msgstr ""
+"Sie könne auch die Pfeiltasten verwenden, um sich in der Karte zu bewegen; "
+"die Farbe des Cursors deutet die Position der Farbe, die sie ziehen würden, "
+"an (die nicht offensichtlich ist, falls Sie auf der Grenze einer Region "
+"sind, da sie von der Richtung abhängt, von der Sie die Grenze erreicht "
+"haben). Durch Drücken der Eingabetaste beginnen Sie ein Ziehen dieser Farbe, "
+"wie oben, die Sie mit den Pfeiltasten steuern. Durch erneutes Drücken der "
+"Eingabetaste beenden Sie das Ziehen. Ã„hnlich kann die Leertaste zum Tüpfeln "
+"einer Region verwandt werden. Doppeltes Drücken der Eingabetaste (ohne "
+"Bewegen des Cursors) bereinigt die Region, wie dies auch Ziehen von einer "
+"leeren Region aus tut. Dies ist im Cursor-Modus nützlich, falls Sie die "
+"gesamte Karte ausgefüllt haben, aber die Verteilung korrigieren müssen."
+
+#. type: Plain text
+#: puzzles.but:1904
+msgid ""
+"If you press L during play, the game will toggle display of a number in each "
+"region of the map. This is useful if you want to discuss a particular puzzle "
+"instance with a friend \\dash having an unambiguous name for each region is "
+"much easier than trying to refer to them all by names such as \\q{the one "
+"down and right of the brown one on the top border}."
+msgstr ""
+"Falls Sie während des Spiels L drücken, wird das Spiel eine Nummer in jeder "
+"Region der Karte ein- bzw. ausschalten. Dies ist nützlich, falls Sie eine "
+"bestimmte Puzzleinstanz mit einem Freund diskutieren möchten \\dash ein "
+"eindeutiger Name für jede Region ist viel einfacher als der Versuch, sie mit "
+"Namen der Art \\q{die Region unterhalb und rechts von der braunen oben an "
+"der Grenze} zu referenzieren."
+
+#. type: Plain text
+#: puzzles.but:1908
+msgid "\\I{parameters, for Map}Map parameters"
+msgstr "\\I{Parameter, für Map}Map-Parameter"
+
+#. type: e{#1}
+#: puzzles.but:1917
+msgid "Regions"
+msgstr "Regions"
+
+#. type: Plain text
+#: puzzles.but:1919
+msgid "Number of regions in the generated map."
+msgstr "Anzahl der Regionen in der erzeugten Karte."
+
+#. type: Plain text
+#: puzzles.but:1927
+msgid ""
+"In \\q{Easy} mode, there should always be at least one region whose colour "
+"can be determined trivially. In \\q{Normal} and \\q{Hard} modes, you will "
+"have to use increasingly complex logic to deduce the colour of some regions. "
+"However, it will always be possible without having to guess or backtrack."
+msgstr ""
+"Im Modus \\q{Easy} sollte es immer mindestens eine Region geben, dessen "
+"Farbe trivial ermittelt werden kann. In den Modi \\q{Normal} und \\q{Hard} "
+"müssen Sie zunehmend komplexe Logik verwenden, um die Farbe einiger Regionen "
+"zu bestimmen. Es wird allerdings immer ohne Raten oder Rückverfolgen möglich "
+"sein."
+
+#. type: Plain text
+#: puzzles.but:1936
+msgid ""
+"In \\q{Unreasonable} mode, the program will feel free to generate puzzles "
+"which are as hard as it can possibly make them: the only constraint is that "
+"they should still have a unique solution. Solving Unreasonable puzzles may "
+"require guessing and backtracking."
+msgstr ""
+"Im Modus \\q{Unreasonable} wird das Programm die Freiheit einsetzen, so "
+"schwer wie möglich lösbare Puzzle zu generieren. Die einzige Randbedingung "
+"ist, dass sie immer noch eine eindeutige Lösung haben sollten. Das Lösen von "
+"Puzzlen dieser Schwierigkeit kann Raten und Rückverfolgung verlangen."
+
+#. type: Plain text
+#: puzzles.but:1939
+msgid "\\i{Loopy}"
+msgstr "\\i{Loopy}"
+
+#. type: Plain text
+#: puzzles.but:1941
+msgid "\\cfg{winhelp-topic}{games.loopy}"
+msgstr "\\cfg{winhelp-topic}{games.loopy}"
+
+#. type: Plain text
+#: puzzles.but:1946
+msgid ""
+"You are given a grid of dots, marked with yellow lines to indicate which "
+"dots you are allowed to connect directly together. Your aim is to use some "
+"subset of those yellow lines to draw a single unbroken loop from dot to dot "
+"within the grid."
+msgstr ""
+"Ihnen wird ein Netz an Punkten zur Verfügung gestellt, die mit gelben Linien "
+"markiert sind, um anzuzeigen, welche Punkte Sie direkt miteinander verbinden "
+"dürfen. Ihr Ziel besteht darin, eine Teilmenge der gelben Linien zu "
+"verwenden, um innerhalb des Netzes eine einzige, nicht unterbrochene "
+"Schleife von Punkt zu Punkt zu zeichnen."
+
+#. type: Plain text
+#: puzzles.but:1951
+msgid ""
+"Some of the spaces between the lines contain numbers. These numbers indicate "
+"how many of the lines around that space form part of the loop. The loop you "
+"draw must correctly satisfy all of these clues to be considered a correct "
+"solution."
+msgstr ""
+"Einige der Leerräume zwischen den Zeilen enthalten Zahlen. Diese Zahlen "
+"geben an, wie viele der Zeilen um diesen Leerraum herum Teil der Schleife "
+"sind. Die von Ihnen gezeichnete Schleife muss alle diese Hinweise korrekt "
+"berücksichtigen, um als korrekte Lösung betrachtet zu werden."
+
+#. type: Plain text
+#: puzzles.but:1955
+msgid ""
+"In the default mode, the dots are arranged in a grid of squares; however, "
+"you can also play on triangular or hexagonal grids, or even more exotic ones."
+msgstr ""
+"Im Standardmodus sind die Punkte als Quadratgitter angeordnet; Sie können "
+"aber auch auf dreieckigen oder hexagonalen Gittern oder sogar noch "
+"exotischeren spielen."
+
+#. type: Plain text
+#: puzzles.but:1958
+msgid "Credit for the basic puzzle idea goes to \\i{Nikoli} \\k{nikoli-loopy}."
+msgstr ""
+"Die Danksagung für die grundlegende Puzzle-Idee geht an \\i{Nikoli} "
+"\\k{nikoli-loopy}."
+
+#. type: Plain text
+#: puzzles.but:1962
+msgid ""
+"Loopy was originally contributed to this collection by Mike Pinna, and "
+"subsequently enhanced to handle various types of non-square grid by Lambros "
+"Lambrou."
+msgstr ""
+"Ursprünglich steuerte Mike Pinna Loopy zu dieser Sammlung bei und Lambros "
+"Lambrou erweiterte es im Folgenden um den Umgang mit verschiedenen, nicht "
+"quadratischen Gittern."
+
+#. type: Plain text
+#: puzzles.but:1966
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/slitherlink.html}\\cw{http://www."
+"nikoli.co.jp/en/puzzles/slitherlink.html} (beware of Flash)"
+msgstr "\\W{http://www.nikoli.com/en/puzzles/slitherlink.html}\\cw{http://www.nikoli.com/en/puzzles/slitherlink.html} (Achtung Flash)"
+
+#. type: Plain text
+#: puzzles.but:1968
+msgid "\\i{Loopy controls}"
+msgstr "\\i{Loopy-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:1969
+msgid "Loopy controls"
+msgstr "Loopy-Steuerung"
+
+#. type: IM
+#: puzzles.but:1969
+#, no-wrap
+msgid "controls, for Loopy"
+msgstr "Steuerung, von Loopy"
+
+#. type: Plain text
+#: puzzles.but:1974
+msgid ""
+"Click the left mouse button on a yellow line to turn it black, indicating "
+"that you think it is part of the loop. Click again to turn the line yellow "
+"again (meaning you aren't sure yet)."
+msgstr ""
+"Klicken Sie mit dem linken Mausknopf auf eine gelbe Linie, um sie zu "
+"schwärzen und damit anzuzeigen, dass Sie glauben, diese Linie sei Teil der "
+"Schleife. Klicken Sie erneut darauf, um sie wieder in Gelb umzuwandeln (was "
+"bedeutet, dass Sie sich noch nicht sicher sind)."
+
+#. type: Plain text
+#: puzzles.but:1979
+msgid ""
+"If you are sure that a particular line segment is \\e{not} part of the loop, "
+"you can click the right mouse button to remove it completely. Again, "
+"clicking a second time will turn the line back to yellow."
+msgstr ""
+"Falls Sie sich sicher sind, dass ein bestimmtes Liniensegment \\e{nicht} "
+"Teil der Schleife ist, können Sie mit der rechten Maustaste darauf klicken, "
+"um es komplett zu entfernen. Ein zweiter Klick wird die Linie wieder Gelb "
+"einfärben."
+
+#. type: Plain text
+#: puzzles.but:1983
+msgid "\\I{parameters, for Loopy}Loopy parameters"
+msgstr "\\I{Parameter, für Loopy}Loopy-Parameter"
+
+#. type: Plain text
+#: puzzles.but:1993
+msgid ""
+"Size of grid, measured in number of regions across and down. For square "
+"grids, it's clear how this is counted; for other types of grid you may have "
+"to think a bit to see how the dimensions are measured."
+msgstr ""
+"Größe des Gitters, gemessen in der Anzahl der Regionen horizontal und "
+"vertikal. Für quadratische Gitter ist es klar, wie dies gezählt wird; bei "
+"anderen Gittern müssen Sie ein bisschen Nachdenken, um zu verstehen, wie "
+"diese Dimensionen gemessen werden."
+
+#. type: e{#1}
+#: puzzles.but:1995
+msgid "Grid type"
+msgstr "Grid type"
+
+#. type: Plain text
+#: puzzles.but:2003
+msgid ""
+"Allows you to choose between a selection of types of tiling.  Some have all "
+"the faces the same but may have multiple different types of vertex (e.g. the "
+"\\e{Cairo} or \\e{Kites} mode); others have all the vertices the same but "
+"may have different types of face (e.g.  the \\e{Great Hexagonal}). The "
+"square, triangular and honeycomb grids are fully regular, and have all their "
+"vertices \\e{and} faces the same; this makes them the least confusing to "
+"play."
+msgstr ""
+"Erlaubt Ihnen, zwischen einer Auswahl von Kacheltypen zu wählen. Einige "
+"haben nur gleiche Flächen, können jedoch unterschiedliche Eckpunkte haben (z."
+"B der \\e{Cairo}- oder \\e{Kites}-Modus). Andere haben alle Eckpunkte "
+"gleich, können aber unterschiedliche Flächentypen haben (z.B \\e{Great "
+"Hexagonal}). Die quadratischen, dreieckigen und wabenförmigen Gitter sind "
+"völlig gleichmäßig und haben gleiche Eckpunkte \\e{und} Flächen; dies macht "
+"sie die am wenigsten Verwirrenden beim Spielen."
+
+#. type: Plain text
+#: puzzles.but:2009
+msgid ""
+"Controls the difficulty of the generated puzzle.  \\#{FIXME: what "
+"distinguishes Easy, Medium, and Hard? In particular, when are backtracking/"
+"guesswork required, if ever?}"
+msgstr ""
+"Steuert die Schwierigkeit des erzeugten Puzzles. \\#{FIXME: was "
+"unterscheidet Easy, Medium und Hard? Wann werden insbesondere backtracking/"
+"guessword, falls Ã¼berhaupt, benötigt?}"
+
+#. type: Plain text
+#: puzzles.but:2012
+msgid "\\i{Inertia}"
+msgstr "\\i{Inertia}"
+
+#. type: Plain text
+#: puzzles.but:2014
+msgid "\\cfg{winhelp-topic}{games.inertia}"
+msgstr "\\cfg{winhelp-topic}{games.inertia}"
+
+#. type: Plain text
+#: puzzles.but:2017
+msgid ""
+"You are a small green ball sitting in a grid full of obstacles. Your aim is "
+"to collect all the gems without running into any mines."
+msgstr ""
+"Sie sind ein kleiner grüner Ball, der sich in einem Gitter voller "
+"Hindernisse befindet. Ihr Ziel besteht darin, alle Edelsteine einzusammeln, "
+"ohne auf eine Mine zu treffen."
+
+#. type: Plain text
+#: puzzles.but:2026
+msgid ""
+"You can move the ball in any orthogonal \\e{or diagonal} direction.  Once "
+"the ball starts moving, it will continue until something stops it. A wall "
+"directly in its path will stop it (but if it is moving diagonally, it will "
+"move through a diagonal gap between two other walls without stopping). Also, "
+"some of the squares are \\q{stops}; when the ball moves on to a stop, it "
+"will stop moving no matter what direction it was going in. Gems do \\e{not} "
+"stop the ball; it picks them up and keeps on going."
+msgstr ""
+"Sie können den Ball in jede orthogonale \\e{oder diagonale} Richtung "
+"bewegen. Sobald der Ball sich einmal bewegt, fährt er fort, bis er gestoppt "
+"wird. Eine Mauer direkt im Weg stoppt ihn (falls er sich aber diagonal "
+"bewegt, wird er durch einen diagonalen Spalt zwischen zwei anderen Mauern "
+"hindurchlaufen, ohne anzuhalten). Auch sind einige der Quadrate "
+"\\q{Stoppquadrate}; wenn ein Ball auf diese läuft, hält er an, unabhängig "
+"davon, in welche Richtung er lief. Edelsteine stoppen den Ball \\e{nicht}; "
+"er nimmt diese auf und läuft weiter."
+
+#. type: Plain text
+#: puzzles.but:2030
+msgid ""
+"Running into a mine is fatal. Even if you picked up the last gem in the same "
+"move which then hit a mine, the game will count you as dead rather than "
+"victorious."
+msgstr ""
+"Das Treffen einer Mine ist fatal. Selbst wenn Sie den letzten Edelstein im "
+"gleichen Spielzug aufgenommen haben und dann auf eine Mine treffen, wird das "
+"Spiel Sie als Tod und nicht als Sieger registrieren."
+
+#. type: Plain text
+#: puzzles.but:2034
+msgid ""
+"This game was originally implemented for Windows by Ben Olmstead \\k{bem}, "
+"who was kind enough to release his source code on request so that it could "
+"be re-implemented for this collection."
+msgstr ""
+"Dieses Spiel wurde ursprünglich von Ben Olmstead \\k{bem} für Windows "
+"implementiert, der nett genug war, auf Nachfrage seinen Quellcode zu "
+"veröffentlichen, so dass das Spiel für diese Sammlung neu implementiert "
+"werden konnte."
+
+#. type: Plain text
+#: puzzles.but:2036
+msgid "\\W{http://xn13.com/}\\cw{http://xn13.com/}"
+msgstr "\\W{http://xn13.com/}\\cw{http://xn13.com/}"
+
+#. type: Plain text
+#: puzzles.but:2038
+msgid "\\i{Inertia controls}"
+msgstr "\\i{Inertia-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:2039 puzzles.but:2040 puzzles.but:2041
+msgid "Inertia controls"
+msgstr "Inertia-Steuerung"
+
+#. type: IM
+#: puzzles.but:2039
+#, no-wrap
+msgid "controls, for Inertia"
+msgstr "Steuerung, von Inertia"
+
+#. type: IM
+#: puzzles.but:2040
+#, no-wrap
+msgid "keys, for Inertia"
+msgstr "Tasten, für Inertia"
+
+#. type: IM
+#: puzzles.but:2041
+#, no-wrap
+msgid "shortcuts (keyboard), for Inertia"
+msgstr "Tastaturkürzel, für Inertia"
+
+#. type: Plain text
+#: puzzles.but:2047
+msgid ""
+"You can move the ball in any of the eight directions using the numeric "
+"keypad. Alternatively, if you click the left mouse button on the grid, the "
+"ball will begin a move in the general direction of where you clicked."
+msgstr ""
+"Sie können den Ball in jede der acht Richtungen mit dem numerischen "
+"Tastaturfeld bewegen. Alternativ bewegt sich der Ball durch Klicken mit der "
+"linken Maustaste in dem Gitter in die dadurch vorgegebene Richtung."
+
+#. type: Plain text
+#: puzzles.but:2057
+msgid ""
+"If you use the \\q{Solve} function on this game, the program will compute a "
+"path through the grid which collects all the remaining gems and returns to "
+"the current position. A hint arrow will appear on the ball indicating the "
+"direction in which you should move to begin on this path. If you then move "
+"in that direction, the arrow will update to indicate the next direction on "
+"the path. You can also press Space to automatically move in the direction of "
+"the hint arrow. If you move in a different direction from the one shown by "
+"the arrow, arrows will be shown only if the puzzle is still solvable."
+msgstr ""
+"Falls Sie die Funktion \\q{Solve} in diesem Spiel verwenden, wird das "
+"Programm einen Pfad durch das Gitter berechnen, auf dem alle verbliebenen "
+"Edelsteine einsammelt und zu der aktuellen Position zurückkehrt wird. Ein "
+"Hinweispfeil wird am Ball erscheinen, der die Richtung anzeigt, in die Sie "
+"ihn bewegen sollten, um den Pfad zu beginnen. Falls Sie ihn dann in diese "
+"Richtung bewegen, wird der Pfeil aktualisiert, um die nächste Richtung im "
+"Pfad anzuzeigen. Sie können auch die Leertaste drücken, um den Ball "
+"automatisch in die Richtung des Hinweispfeils zu bewegen. Falls Sie den Ball "
+"in eine andere Richtung als die vom Hinweispfeil angezeigte bewegen, dann "
+"werden die Hinweispfeile nur noch angezeigt, falls das Puzzle noch lösbar ist."
+
+#. type: Plain text
+#: puzzles.but:2062
+msgid ""
+"All the actions described in \\k{common-actions} are also available.  In "
+"particular, if you do run into a mine and die, you can use the Undo function "
+"and resume playing from before the fatal move. The game will keep track of "
+"the number of times you have done this."
+msgstr ""
+"Alle in \\k{common-actions} beschriebenen Aktionen sind auch verfügbar. "
+"Insbesondere können Sie die Undo-Funktion benutzen, falls Sie in eine Mine "
+"laufen und sterben, und das Spiel vor dem fatalen Spielzug fortsetzen. Das "
+"Spiel verfolgt mit, wie häufig Sie das gemacht haben."
+
+#. type: Plain text
+#: puzzles.but:2064
+msgid "\\I{parameters, for Inertia}Inertia parameters"
+msgstr "\\I{Parameter, für Inertia}Inertia-Parameter"
+
+#. type: Plain text
+#: puzzles.but:2074
+msgid "\\i{Tents}"
+msgstr "\\i{Tents}"
+
+#. type: Plain text
+#: puzzles.but:2076
+msgid "\\cfg{winhelp-topic}{games.tents}"
+msgstr "\\cfg{winhelp-topic}{games.tents}"
+
+#. type: Plain text
+#: puzzles.but:2080
+msgid ""
+"You have a grid of squares, some of which contain trees. Your aim is to "
+"place tents in some of the remaining squares, in such a way that the "
+"following conditions are met:"
+msgstr ""
+"Sie bekommen ein Gitter aus Quadraten, von denen auf einigen Bäume stehen. "
+"Ihr Ziel besteht darin, auf einige der verbliebenen Quadrate Zelte "
+"aufzustellen, so dass die folgenden Bedingungen erfüllt sind:"
+
+#. type: Plain text
+#: puzzles.but:2082
+msgid "There are exactly as many tents as trees."
+msgstr "Es gibt genausoviele Zelte wie Bäume."
+
+#. type: Plain text
+#: puzzles.but:2087
+msgid ""
+"The tents and trees can be matched up in such a way that each tent is "
+"directly adjacent (horizontally or vertically, but not diagonally) to its "
+"own tree. However, a tent may be adjacent to other trees as well as its own."
+msgstr ""
+"Die Zelte und Bäume können so zugeordnet werden, dass sich jedes Zelt "
+"(horizontal oder vertikal, aber nicht diagonal) neben seinem Baum befindet. "
+"Ein Zelt darf sich aber auch neben anderen als dem eigenen Baum befinden."
+
+#. type: Plain text
+#: puzzles.but:2090
+msgid "No two tents are adjacent horizontally, vertically \\e{or diagonally}."
+msgstr ""
+"Keine zwei Zelte befinden sich horizontal, vertikal \\e{oder diagonal} "
+"nebeneinander."
+
+#. type: Plain text
+#: puzzles.but:2093
+msgid ""
+"The number of tents in each row, and in each column, matches the numbers "
+"given round the sides of the grid."
+msgstr ""
+"Die Anzahl der Zelte in jeder Zeile und in jeder Spalte passt zu der Zahl, "
+"die am Rande des Gitters angegeben ist."
+
+#. type: Plain text
+#: puzzles.but:2097
+msgid ""
+"This puzzle can be found in several places on the Internet, and was brought "
+"to my attention by e-mail. I don't know who I should credit for inventing it."
+msgstr ""
+"Dieses Puzzle kann an verschiedenen Stellen im Internet gefunden werden und "
+"ich wurde per E-Mail darauf aufmerksam gemacht. Ich weiß nicht, wem ich für "
+"die Erfindung meinen Dank aussprechen soll."
+
+#. type: Plain text
+#: puzzles.but:2099
+msgid "\\i{Tents controls}"
+msgstr "\\i{Tents-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:2100
+msgid "Tents controls"
+msgstr "Tents-Steuerung"
+
+#. type: IM
+#: puzzles.but:2100
+#, no-wrap
+msgid "controls, for Tents"
+msgstr "Steuerung, von Tents"
+
+#. type: Plain text
+#: puzzles.but:2106
+msgid ""
+"Left-clicking in a blank square will place a tent in it.  Right-clicking in "
+"a blank square will colour it green, indicating that you are sure it "
+"\\e{isn't} a tent. Clicking either button in an occupied square will clear "
+"it."
+msgstr ""
+"Durch Linksklick in ein leeres Quadrat wird dort ein Zelt positioniert. "
+"Durch Rechtsklick in ein leeres Quadrat wird dieses grün eingefärbt, um "
+"anzudeuten, dass Sie sich sicher sind, dass hier \\e{kein} Zelt ist. Durch "
+"Klicken eines beliebigen Knopfes auf ein nicht leeres Quadrat wird dies "
+"bereinigt."
+
+#. type: Plain text
+#: puzzles.but:2111
+msgid ""
+"If you \\e{drag} with the right button along a row or column, every blank "
+"square in the region you cover will be turned green, and no other squares "
+"will be affected. (This is useful for clearing the remainder of a row once "
+"you have placed all its tents.)"
+msgstr ""
+"Falls Sie mit dem rechten Knopf entlang einer Zeile oder Spalte \\e{ziehen}, "
+"wird jedes leere Quadrat in der Ã¼berstrichenen Region grün gefärbt und alle "
+"anderen Quadrate bleiben unverändert. (Dies ist nützlich, wenn Sie den Rest "
+"einer Zeile bereinigen wollen, nachdem Sie alle Zelte gesetzt haben.)"
+
+#. type: Plain text
+#: puzzles.but:2118
+msgid ""
+"You can also use the cursor keys to move around the grid. Pressing the "
+"return key over an empty square will place a tent, and pressing the space "
+"bar over an empty square will colour it green; either key will clear an "
+"occupied square.  Holding Shift and pressing the cursor keys will colour "
+"empty squares green.  Holding Control and pressing the cursor keys will "
+"colour green both empty squares and squares with tents."
+msgstr ""
+"Sie können auch die Pfeiltasten verwenden, um sich im Gitter zu bewegen. "
+"Durch Drücken der Eingabetaste auf einem leeren Feld wird dort ein Zelt "
+"positioniert und durch Drücken der Leertaste auf einem leeren Feld wird dies "
+"grün eingefärbt; jede der beiden Tasten wird ein besetztes Quadrat "
+"bereinigen. Durch Drücken von Umschalten und von Pfeiltasten wird ein leeres "
+"Quadrat grün eingefärbt. Durch Drücken von Strg und Pfeiltasten werden sowohl "
+"leere als auch Quadrate mit Zelten grün eingefärbt."
+
+#. type: Plain text
+#: puzzles.but:2122
+msgid "\\I{parameters, for Tents}Tents parameters"
+msgstr "\\I{Parameter, für Tents}Tents-Parameter"
+
+#. type: Plain text
+#: puzzles.but:2135
+msgid ""
+"Controls the difficulty of the generated puzzle. More difficult puzzles "
+"require more complex deductions, but at present none of the available "
+"difficulty levels requires guesswork or backtracking."
+msgstr ""
+"Steuert die Schwierigkeit der generierten Puzzles. Schwerere Puzzle "
+"benötigen komplexere Herleitungen, aber derzeit sollte keine der "
+"Schwierigkeitsstufen Raten und Rückverfolgung benötigen."
+
+#. type: Plain text
+#: puzzles.but:2138
+msgid "\\i{Bridges}"
+msgstr "\\i{Bridges}"
+
+#. type: Plain text
+#: puzzles.but:2140
+msgid "\\cfg{winhelp-topic}{games.bridges}"
+msgstr "\\cfg{winhelp-topic}{games.bridges}"
+
+#. type: Plain text
+#: puzzles.but:2144
+msgid ""
+"You have a set of islands distributed across the playing area. Each island "
+"contains a number. Your aim is to connect the islands together with bridges, "
+"in such a way that:"
+msgstr ""
+"Sie verfügen Ã¼ber einen Satz von Inseln, die Ã¼ber das Spielfeld verteilt "
+"sind. Jede Insel enthält eine Nummer. Ihr Ziel besteht darin, die Inseln mit "
+"Brücken zu verbinden, so dass folgende Bedingungen erfüllt sind:"
+
+#. type: Plain text
+#: puzzles.but:2146
+msgid "Bridges run horizontally or vertically."
+msgstr "Brücken laufen horizontal oder vertikal."
+
+#. type: Plain text
+#: puzzles.but:2149
+msgid ""
+"The number of bridges terminating at any island is equal to the number "
+"written in that island."
+msgstr ""
+"Die Anzahl der auf einer Insel endenden Brücken stimmt mit der auf der Insel "
+"angegebenen Nummer Ã¼berein."
+
+#. type: Plain text
+#: puzzles.but:2152
+msgid ""
+"Two bridges may run in parallel between the same two islands, but no more "
+"than two may do so."
+msgstr ""
+"Zwei Brücken dürfen parallel zwischen den gleichen zwei Inseln laufen, aber "
+"nicht mehr als zwei."
+
+#. type: Plain text
+#: puzzles.but:2154
+msgid "No bridge crosses another bridge."
+msgstr "Keine Brücke kreuzt eine andere Brücke."
+
+#. type: Plain text
+#: puzzles.but:2156
+msgid "All the islands are connected together."
+msgstr "Alle Inseln sind mit Brücken verbunden."
+
+#. type: Plain text
+#: puzzles.but:2162
+msgid ""
+"There are some configurable alternative modes, which involve changing the "
+"parallel-bridge limit to something other than 2, and introducing the "
+"additional constraint that no sequence of bridges may form a loop from one "
+"island back to the same island. The rules stated above are the default ones."
+msgstr ""
+"Es gibt einige konfigurierbare andere Modi, die die Begrenzung auf zwei "
+"parallele Brücken auf etwas anderes als zwei setzen und die zusätzliche "
+"Randbedingung einführen, dass keine Sequenz von Brücken eine Schleife von "
+"einer Insel zurück zu der gleichen Insel bilden dürfen. Die oben angegebenen "
+"Regeln sind die Standardregeln."
+
+#. type: Plain text
+#: puzzles.but:2164
+msgid "Credit for this puzzle goes to \\i{Nikoli} \\k{nikoli-bridges}."
+msgstr "Dank für dieses Puzzle geht an \\i{Nikoli} \\k{nikoli-bridges}."
+
+#. type: Plain text
+#: puzzles.but:2166
+msgid "Bridges was contributed to this collection by James Harvey."
+msgstr "Bridges ist ein Beitrag von James Harvey zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:2170
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/hashiwokakero.html}\\cw{http://www."
+"nikoli.co.jp/en/puzzles/hashiwokakero.html} (beware of Flash)"
+msgstr "\\W{http://www.nikoli.com/en/puzzles/hashiwokakero.html}\\cw{http://www.nikoli.com/en/puzzles/hashiwokakero.html} (Achtung Flash)"
+
+#. type: Plain text
+#: puzzles.but:2172
+msgid "\\i{Bridges controls}"
+msgstr "\\i{Bridges-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:2173
+msgid "Bridges controls"
+msgstr "Bridges-Steuerung"
+
+#. type: IM
+#: puzzles.but:2173
+#, no-wrap
+msgid "controls, for Bridges"
+msgstr "Steuerung, von Bridges"
+
+#. type: Plain text
+#: puzzles.but:2181
+msgid ""
+"To place a bridge between two islands, click the mouse down on one island "
+"and drag it towards the other. You do not need to drag all the way to the "
+"other island; you only need to move the mouse far enough for the intended "
+"bridge direction to be unambiguous. (So you can keep the mouse near the "
+"starting island and conveniently throw bridges out from it in many "
+"directions.)"
+msgstr ""
+"Um eine Brücke zwischen zwei Inseln zu positionieren, klicken Sie mit der "
+"Maus auf eine der Inseln und ziehen Sie sie dann auf die andere zu. Sie "
+"müssen sie nicht den ganzen Weg zur anderen Insel ziehen; Sie müssen die "
+"Maus nur weit genug ziehen, so dass die geplante Brückenrichtung eindeutig "
+"ist. (Somit können Sie die Maus in der Nähe der Startinsel belassen und "
+"bequem Brücken von dieser aus in viele Richtungen werfen.)"
+
+#. type: Plain text
+#: puzzles.but:2186
+msgid ""
+"Doing this again when a bridge is already present will add another parallel "
+"bridge. If there are already as many bridges between the two islands as "
+"permitted by the current game rules (i.e. two by default), the same dragging "
+"action will remove all of them."
+msgstr ""
+"Ist bereits eine Brücke vorhanden und Sie wiederholen dies, dann wird eine "
+"weitere, parallele Brücke hinzugefügt. Falls bereits so viele Brücken "
+"zwischen zwei Inseln vorhanden sind, wie von den aktuellen Spielregeln "
+"erlaubt sind (d.h. standardmäßig zwei), wird die gleiche Zieh-Aktion alle "
+"Brücken wieder entfernen."
+
+#. type: Plain text
+#: puzzles.but:2190
+msgid ""
+"If you want to remind yourself that two islands definitely \\e{do not} have "
+"a bridge between them, you can right-drag between them in the same way to "
+"draw a \\q{non-bridge} marker."
+msgstr ""
+"Falls Sie sich daran erinnern wollen, dass sich zwischen zwei Inseln "
+"definitiv \\e{keine} Brücke befindet, können Sie in der gleichen Weise mit "
+"der rechten Maustaste eine \\q{keine-Brücke}-Markierung hinziehen."
+
+#. type: Plain text
+#: puzzles.but:2198
+msgid ""
+"If you think you have finished with an island (i.e. you have placed all its "
+"bridges and are confident that they are in the right places), you can mark "
+"the island as finished by left-clicking on it.  This will highlight it and "
+"all the bridges connected to it, and you will be prevented from accidentally "
+"modifying any of those bridges in future. Left-clicking again on a "
+"highlighted island will unmark it and restore your ability to modify it."
+msgstr ""
+"Falls Sie glauben, Sie haben eine Insel abgeschlossen (d.h. Sie haben alle "
+"deren Brücken gesetzt und sind sich sicher, dass sie korrekt sind), können "
+"Sie die Insel durch Anklicken mit der rechten Maustaste als abgeschlossen "
+"markieren. Dies wird sie und alle daran angeschlossenen Brücken hervorheben "
+"und Sie davon abhalten, versehentlich in der Zukunft eine dieser Brücken zu "
+"verändern. Durch erneutes Klicken mit der linken Maustaste entfernen Sie die "
+"Markierung wieder und stellen die Möglichkeit wieder her, die Insel zu "
+"bearbeiten."
+
+#. type: Plain text
+#: puzzles.but:2206
+msgid ""
+"You can also use the cursor keys to move around the grid: if possible the "
+"cursor will always move orthogonally, otherwise it will move towards the "
+"nearest island to the indicated direction. Holding Control and pressing a "
+"cursor key will lay a bridge in that direction (if available); Shift and a "
+"cursor key will lay a \\q{non-bridge} marker.  Pressing the return key "
+"followed by a cursor key will also lay a bridge in that direction."
+msgstr ""
+"Sie können auch die Pfeiltasten zur Bewegung im Gitter verwenden: Falls "
+"möglich, wird sich der Cursor immer orthogonal bewegen, andernfalls wird er "
+"sich zur Insel bewegen, die der angezeigten Richtung am nächsten liegt. "
+"Durch Drücken von Strg gefolgt von einer Pfeiltaste wird eine Brücke "
+"in diese Richtung gelegt (falls möglich). Durch Drücken der Leertaste "
+"gefolgt von einer Pfeiltaste wird eine \\q{keine-Brücke}-Markierung gesetzt. "
+"Durch Druck der Eingabetaste gefolgt von einer Pfeiltaste wird auch eine "
+"Brücke in diese Richtung gelegt."
+
+#. type: Plain text
+#: puzzles.but:2209
+msgid ""
+"You can mark an island as finished by pressing the space bar or by pressing "
+"the return key twice."
+msgstr ""
+"Durch zweifaches Drücken der Leer- oder Eingabetaste können Sie eine Insel als beendet "
+"markieren."
+
+#. type: Plain text
+#: puzzles.but:2213
+msgid ""
+"By pressing a number key, you can jump to the nearest island with that "
+"number.  Letters \\q{a}, ..., \\q{f} count as 10, ..., 15 and \\q{0} as 16."
+msgstr ""
+"Durch Drücken einer Zahltaste können Sie zur nächsten Insel mit dieser Zahl "
+"springen. Die Buchstaben \\q{a} â€¦ \\q{f} zählen als 10 â€¦ 15 und \\q{0} als 16."
+
+#. type: Plain text
+#: puzzles.but:2215
+msgid "Violations of the puzzle rules will be marked in red:"
+msgstr "Verletzungen der Puzzleregeln werden in rot markiert:"
+
+#. type: Plain text
+#: puzzles.but:2217
+msgid "An island with too many bridges will be highlighted in red."
+msgstr "Eine Insel mit zu vielen Brücken wird in rot hervorgehoben."
+
+#. type: Plain text
+#: puzzles.but:2223
+msgid ""
+"An island with too few bridges will be highlighted in red if it is "
+"definitely an error (as opposed to merely not being finished yet): if adding "
+"enough bridges would involve having to cross another bridge or remove a non-"
+"bridge marker, or if the island has been highlighted as complete."
+msgstr ""
+"Eine Insel mit zu wenigen Brücken wird in rot hervorgehoben, wenn es "
+"definitiv ein Fehler ist (im Gegensatz zur Situation, in der Sie einfach "
+"noch nicht fertig sind): Falls das Hinzufügen einer ausreichenden Anzahl an "
+"Brücken dazu führte, dass eine andere Brücke gekreuzt oder eine nicht-"
+"Brücken-Markierung entfernt würde oder falls die Insel als komplett markiert "
+"wurde."
+
+#. type: Plain text
+#: puzzles.but:2230
+msgid ""
+"A group of islands and bridges may be highlighted in red if it is a closed "
+"subset of the puzzle with no way to connect it to the rest of the islands. "
+"For example, if you directly connect two 1s together with a bridge and they "
+"are not the only two islands on the grid, they will light up red to indicate "
+"that such a group cannot be contained in any valid solution."
+msgstr ""
+"Eine Gruppe von Inseln und Brücken kann in rot hervorgehoben werden, falls "
+"sie eine geschlossene Untermenge des Puzzles darstellen, die nicht mehr mit "
+"dem Rest der Inseln verbunden werden kann. Falls Sie beispielsweise zwei 1er-"
+"Inseln direkt mit einer Brücke verbinden und sie nicht die einzigen Inseln "
+"im Gitter sind, werden sie rot markiert, um anzuzeigen, dass eine solche "
+"Gruppe nicht in einer gültigen Lösung enthalten sein kann."
+
+#. type: Plain text
+#: puzzles.but:2234
+msgid ""
+"If you have selected the (non-default) option to disallow loops in the "
+"solution, a group of bridges which forms a loop will be highlighted."
+msgstr ""
+"Falls Sie die (standardmäßig aktivierte) Option Â»Allow Loops« deaktiviert "
+"haben, wird eine Gruppe von Brücken, die eine Schleife darstellen, "
+"hervorgehoben. "
+
+#. type: Plain text
+#: puzzles.but:2238
+msgid "\\I{parameters, for Bridges}Bridges parameters"
+msgstr "\\I{Parameter, für Bridges}Bridges-Parameter"
+
+#. type: Plain text
+#: puzzles.but:2249
+msgid "Difficulty level of puzzle."
+msgstr "Schwierigkeitsgrad des Puzzles."
+
+#. type: e{#1}
+#: puzzles.but:2251
+msgid "Allow loops"
+msgstr "Allow loops"
+
+#. type: Plain text
+#: puzzles.but:2255
+msgid ""
+"This is set by default. If cleared, puzzles will be generated in such a way "
+"that they are always soluble without creating a loop, and solutions which do "
+"involve a loop will be disallowed."
+msgstr ""
+"Standardmäßig aktiviert. Falls entfernt, werden die Puzzles derart erzeugt, "
+"dass sie immer ohne die Erstellung von Schleifen lösbar sind und Lösungen, "
+"die eine Schleife enthalten, verboten werden."
+
+#. type: e{#1}
+#: puzzles.but:2257
+msgid "Max. bridges per direction"
+msgstr "Max. bridges per direction"
+
+#. type: Plain text
+#: puzzles.but:2261
+msgid ""
+"Maximum number of bridges in any particular direction. The default is 2, but "
+"you can change it to 1, 3 or 4. In general, fewer is easier."
+msgstr ""
+"Maximale Anzahl an Brücken in jede Richtung. Die Vorgabe ist 2 aber Sie "
+"können Sie auf 1, 3 oder 4 Ã¤ndern. Im Allgemeinen sind weniger leichter."
+
+#. type: e{#1}
+#: puzzles.but:2263
+msgid "%age of island squares"
+msgstr "%age of island squares"
+
+#. type: Plain text
+#: puzzles.but:2267
+msgid ""
+"Gives a rough percentage of islands the generator will try and lay before "
+"finishing the puzzle. Certain layouts will not manage to lay enough islands; "
+"this is an upper bound."
+msgstr ""
+"Gibt eine grobe Pozentzahl von Inseln an, die der Generator vor Beenden des "
+"Puzzles ausprobieren und legen wird. Bestimmte Layouts werden nicht in der "
+"Lage sein, genügend Inseln zu legen; dies ist eine Obergrenze."
+
+#. type: e{#1}
+#: puzzles.but:2269
+msgid "Expansion factor (%age)"
+msgstr "Expansion factor (%age)"
+
+#. type: Plain text
+#: puzzles.but:2276
+msgid ""
+"The grid generator works by picking an existing island at random (after "
+"first creating an initial island somewhere). It then decides on a direction "
+"(at random), and then works out how far it could extend before creating "
+"another island. This parameter determines how likely it is to extend as far "
+"as it can, rather than choosing somewhere closer."
+msgstr ""
+"Der Gitter-Generator funktioniert folgendermaßen: Zuerst wird irgendwo "
+"zufällig eine Insel erzeugt (falls noch keine vorhanden ist) oder zufällig "
+"ausgewählt. Dann wird zufällig eine Richtung ausgewählt und ermittelt, wie "
+"weit in diese Richtung gegangen werden könnte, bevor eine neue Insel "
+"erstellt werden muss. Dieser Parameter bestimmt, wie wahrscheinlich es ist, "
+"das der Generator soweit wie möglich in eine Richtung geht, statt einen "
+"näheren Ort auszuwählen."
+
+#. type: Plain text
+#: puzzles.but:2284
+msgid ""
+"High expansion factors usually mean easier puzzles with fewer possible "
+"islands; low expansion factors can create lots of tightly-packed islands."
+msgstr ""
+"Hohe Ausdehnungsfaktoren bedeuten für gewöhnlich leichtere Puzzles mit "
+"weniger möglichen Inseln; niedrige Ausdehnungsfaktoren können zu vielen, eng "
+"gepackten Inseln führen."
+
+#. type: Plain text
+#: puzzles.but:2287
+msgid "\\i{Unequal}"
+msgstr "\\i{Unequal}"
+
+#. type: Plain text
+#: puzzles.but:2289
+msgid "\\cfg{winhelp-topic}{games.unequal}"
+msgstr "\\cfg{winhelp-topic}{games.unequal}"
+
+#. type: Plain text
+#: puzzles.but:2293
+msgid ""
+"You have a square grid; each square may contain a digit from 1 to the size "
+"of the grid, and some squares have clue signs between them. Your aim is to "
+"fully populate the grid with numbers such that:"
+msgstr ""
+"Sie bekommen ein Quadratgitter; jedes Quadrat darf eine Ziffer zwischen 1 "
+"und der Größe des Gitters enthalten. Zwischen einigen Quadraten befindet "
+"sich ein Hinweiszeichen. Ihr Ziel besteht darin, das Gitter komplett mit "
+"Zahlen zu befüllen, so dass:"
+
+#. type: Plain text
+#: puzzles.but:2295 puzzles.but:2517
+msgid "Each row contains only one occurrence of each digit"
+msgstr "Jede Zeile jede Ziffer nur einmal enthält"
+
+#. type: Plain text
+#: puzzles.but:2297 puzzles.but:2519
+msgid "Each column contains only one occurrence of each digit"
+msgstr "Jede Spalte jede Ziffer nur einmal enthält"
+
+#. type: Plain text
+#: puzzles.but:2299
+msgid "All the clue signs are satisfied."
+msgstr "Alle Hinweiszeichen sind beachtet worden."
+
+#. type: Plain text
+#: puzzles.but:2301
+msgid "There are two modes for this game, \\q{Unequal} and \\q{Adjacent}."
+msgstr "Es gibt zwei Modi für dieses Spiel, \\q{Unequal} und \\q{Adjacent}."
+
+#. type: Plain text
+#: puzzles.but:2305
+msgid ""
+"In \\q{Unequal} mode, the clue signs are greater-than symbols indicating one "
+"square's value is greater than its neighbour's. In this mode not all clues "
+"may be visible, particularly at higher difficulty levels."
+msgstr ""
+"Im Modus \\q{Unequal} sind die Hinweiszeichen Größer-Als-Symbole, die "
+"angeben, dass der Wert eines Quadrats größer als der seines Nachbarn ist. In "
+"diesem Modus könnten nicht alle Hinweise sichtbar sein, insbesondere bei "
+"höheren Schwierigkeitsgraden."
+
+#. type: Plain text
+#: puzzles.but:2311
+msgid ""
+"In \\q{Adjacent} mode, the clue signs are bars indicating one square's value "
+"is numerically adjacent (i.e. one higher or one lower)  than its neighbour. "
+"In this mode all clues are always visible: absence of a bar thus means that "
+"a square's value is definitely not numerically adjacent to that neighbour's."
+msgstr ""
+"Im Modus \\q{Adjacent} sind die Hinweiszeichen senkrechte Striche, die "
+"angeben, dass der Wert eines Quadrats nummerisch benachbart (d.h. einen "
+"größer oder kleiner) zu dem des Nachbarn ist. In diesem Modus sind alle "
+"Hinweise immer sichtbar; Abwesenheit eines Striches bedeutet daher, dass der "
+"Wert eines Quadrats definitiv nicht nummerisch benachbart zu dem des "
+"Nachbarquadrats ist."
+
+#. type: Plain text
+#: puzzles.but:2315
+msgid ""
+"In \\q{Trivial} difficulty level (available via the \\q{Custom} game type "
+"selector), there are no greater-than signs in \\q{Unequal} mode; the puzzle "
+"is to solve the \\i{Latin square} only."
+msgstr ""
+"Im Schwierigkeitsgrad \\q{Trivial} (erreichbar Ã¼ber die \\q{Custom}-"
+"Spieltypauswahl) gibt es keine Größer-als-Zeichen im \\q{Unequal}-Modus; das "
+"Puzzle besteht nur darin, das \\i{Lateinische Quadrat} zu lösen."
+
+#. type: Plain text
+#: puzzles.but:2318
+msgid ""
+"At the time of writing, the \\q{Unequal} mode of this puzzle is appearing in "
+"the Guardian weekly under the name \\q{\\i{Futoshiki}}."
+msgstr ""
+"Zum Zeitpunkt des Schreibens erscheint der Modus \\q{Unequal} des Puzzles in "
+"der Â»Guardian weekly« unter dem Namen \\q{\\i{Futoshiki}}."
+
+#. type: Plain text
+#: puzzles.but:2320
+msgid "Unequal was contributed to this collection by James Harvey."
+msgstr "Unequal ist ein Beitrag von James Harvey zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:2322
+msgid "\\i{Unequal controls}"
+msgstr "\\i{Unequal-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:2323
+msgid "Unequal controls"
+msgstr "Unequal-Steuerung"
+
+#. type: IM
+#: puzzles.but:2323
+#, no-wrap
+msgid "controls, for Unequal"
+msgstr "Steuerung, von Unequal"
+
+#. type: Plain text
+#: puzzles.but:2326
+msgid "Unequal shares much of its control system with Solo."
+msgstr "Unequal hat viel mit dem Steuersystem von Solo gemeinsam."
+
+#. type: Plain text
+#: puzzles.but:2331
+msgid ""
+"To play Unequal, simply click the mouse in any empty square and then type a "
+"digit or letter on the keyboard to fill that square. If you make a mistake, "
+"click the mouse in the incorrect square and press Space to clear it again "
+"(or use the Undo feature)."
+msgstr ""
+"Um Unequal zu spielen, klicken Sie mit der Maus einfach in ein leeres "
+"Quadrat und geben mit der Tastatur eine Ziffer oder einen Buchstaben ein, um "
+"das Quadrat zu füllen. Falls Sie einen Fehler machen, klicken Sie mit der "
+"Maus in das falsch ausgefüllte Quadrat und drücken Sie die Leertaste, um es "
+"wieder zu leeren (oder verwenden Sie die Undo-Funktionalität)."
+
+#. type: Plain text
+#: puzzles.but:2354
+msgid ""
+"As for Solo, the cursor keys can be used in conjunction with the digit keys "
+"to set numbers or pencil marks. You can also use the \\q{M} key to auto-fill "
+"every numeric hint, ready for removal as required, or the \\q{H} key to do "
+"the same but also to remove all obvious hints."
+msgstr ""
+"Wie bei Solo können die Pfeiltasten zusammen mit den Zifferntasten verwendet "
+"werden, um Nummern oder Bleistiftmarkierungen zu setzen. Sie können auch die "
+"Taste \\q{M} verwenden, um jeden Vorschlag automatisch eintragen zu lassen, der "
+"dann zur Entfernung (soweit notwendig) bereit steht oder die Taste \\q{H}, um "
+"das gleiche durchzuführen und zusätzlich alle offensichtlichen Vorschläge zu "
+"entfernen."
+
+#. type: Plain text
+#: puzzles.but:2365
+msgid ""
+"Left-clicking a clue will mark it as done (grey it out), or unmark it if it "
+"is already marked.  Holding Control or Shift and pressing an arrow key "
+"likewise marks any clue adjacent to the cursor in the given direction."
+msgstr ""
+"Durch Linksklick auf einen Hinweis wird dieser als erledigt markiert "
+"(ausgegraut) oder die Markierung entfernt, falls er bereits markiert ist. "
+"Durch Halten von Strg oder Umschalten und Drücken einer Pfeiltaste werden "
+"entsprechende Hinweise neben dem Cursor in der angegebenen Richtung markiert."
+
+#. type: Plain text
+#: puzzles.but:2369
+msgid "\\I{parameters, for Unequal}Unequal parameters"
+msgstr "\\I{Parameter, für Unequal}Unequal-Parameter"
+
+#. type: e{#1}
+#: puzzles.but:2374
+msgid "Mode"
+msgstr "Mode"
+
+#. type: Plain text
+#: puzzles.but:2376
+msgid "Mode of the puzzle (\\q{Unequal} or \\q{Adjacent})"
+msgstr "Modus des Puzzles (\\q{Unequal} oder \\q{Adjacent})"
+
+#. type: e{#1}
+#: puzzles.but:2378
+msgid "Size (s*s)"
+msgstr "Size (s*s)"
+
+#. type: Plain text
+#: puzzles.but:2380
+msgid "Size of grid."
+msgstr "Größe des Gitters."
+
+#. type: Plain text
+#: puzzles.but:2389
+msgid ""
+"Controls the difficulty of the generated puzzle. At Trivial level, there are "
+"no greater-than signs; the puzzle is to solve the Latin square only. At "
+"Recursive level (only available via the \\q{Custom} game type selector) "
+"backtracking will be required, but the solution should still be unique. The "
+"levels in between require increasingly complex reasoning to avoid having to "
+"backtrack."
+msgstr ""
+"Steuert die Schwierigkeit des erstellten Puzzles. Auf der Stufe Trivial gibt "
+"es keine Größer-als-Zeichen; das zu lösende Puzzle ist nur das lateinische "
+"Quadrat. In der Recursive-Stufe (nur Ã¼ber die \\q{Custom}-Spieltypauswahl "
+"verfügbar) ist Rückverfolgung notwendig, aber die Lösung sollte immer noch "
+"eindeutig sein. Die Stufen dazwischen benötigen zunehmend komplexe "
+"Schlussfolgerungen, um Rückverfolgung zu vermeiden."
+
+#. type: Plain text
+#: puzzles.but:2393
+msgid "\\i{Galaxies}"
+msgstr "\\i{Galaxies}"
+
+#. type: Plain text
+#: puzzles.but:2395
+msgid "\\cfg{winhelp-topic}{games.galaxies}"
+msgstr "\\cfg{winhelp-topic}{games.galaxies}"
+
+#. type: Plain text
+#: puzzles.but:2401
+msgid ""
+"You have a rectangular grid containing a number of dots. Your aim is to draw "
+"edges along the grid lines which divide the rectangle into regions in such a "
+"way that every region is 180\\u00b0{-degree} rotationally symmetric, and "
+"contains exactly one dot which is located at its centre of symmetry."
+msgstr ""
+"Sie bekommen ein rechteckiges Gitter, das eine Anzahl von Punkten enthält. "
+"Ihr Ziel besteht darin, Kanten entlang der Gitterlinien zu zeichnen, so dass "
+"das Gitter in Regionen eingeteilt wird, die 180\\u00b0{-degree} "
+"rotationssymmetrisch sind und jeweils genau einen Punkt im Symmetriezentrum "
+"enthalten."
+
+#. type: Plain text
+#: puzzles.but:2405
+msgid ""
+"This puzzle was invented by \\i{Nikoli} \\k{nikoli-galaxies}, under the name "
+"\\q{Tentai Show}; its name is commonly translated into English as \\q{Spiral "
+"Galaxies}."
+msgstr ""
+"Dieses Puzzle wurde von \\i{Nikoli} \\k{nikoli-galaxies} unter dem Namen "
+"\\q{Tentai Show} erfunden; der Name wird normalerweise als \\q{Spiral "
+"Galaxies} ins Englische Ã¼bersetzt."
+
+#. type: Plain text
+#: puzzles.but:2407
+msgid "Galaxies was contributed to this collection by James Harvey."
+msgstr "Galaxies ist ein Beitrag von James Harvey zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:2409
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/astronomical_show.html}\\cw{http://"
+"www.nikoli.co.jp/en/puzzles/astronomical_show.html}"
+msgstr "\\W{http://www.nikoli.co.jp/en/puzzles/astronomical_show.html}\\cw{http://www.nikoli.co.jp/en/puzzles/astronomical_show.html}"
+
+#. type: Plain text
+#: puzzles.but:2411
+msgid "\\i{Galaxies controls}"
+msgstr "\\i{Galaxies-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:2412
+msgid "Galaxies controls"
+msgstr "Galaxies-Steuerung"
+
+#. type: IM
+#: puzzles.but:2412
+#, no-wrap
+msgid "controls, for Galaxies"
+msgstr "Steuerung, von Galaxies"
+
+#. type: Plain text
+#: puzzles.but:2420
+msgid ""
+"Left-click on any grid line to draw an edge if there isn't one already, or "
+"to remove one if there is. When you create a valid region (one which is "
+"closed, contains exactly one dot, is 180\\u00b0{-degree} symmetric about "
+"that dot, and contains no extraneous edges inside it) it will be highlighted "
+"automatically; so your aim is to have the whole grid highlighted in that way."
+msgstr ""
+"Klicken Sie links auf jede Gitterlinie, um eine Kante zu zeichnen, falls "
+"noch keine vorhanden ist oder diese zu entfernen. Wenn Sie eine gültige "
+"Region erstellt haben (d.h. die Region ist geschlossen, enthält genau einen "
+"Punkt, ist um diesen 180\\u00b0{-degree} symmetrisch und enthält keine "
+"fehlerhaften Kanten) wird sie automatisch hervorgehoben; Ihr Ziel besteht "
+"darin, das gesamte Gitter auf diese Weise hervorgehoben zu bekommen."
+
+#. type: Plain text
+#: puzzles.but:2432
+msgid ""
+"During solving, you might know that a particular grid square belongs to a "
+"specific dot, but not be sure of where the edges go and which other squares "
+"are connected to the dot. In order to mark this so you don't forget, you can "
+"right-click on the dot and drag, which will create an arrow marker pointing "
+"at the dot. Drop that in a square of your choice and it will remind you "
+"which dot it's associated with.  You can also right-click on existing arrows "
+"to pick them up and move them, or destroy them by dropping them off the edge "
+"of the grid.  (Also, if you're not sure which dot an arrow is pointing at, "
+"you can pick it up and move it around to make it clearer. It will swivel "
+"constantly as you drag it, to stay pointed at its parent dot.)"
+msgstr ""
+"Beim Lösen könnte es sein, dass Sie wissen, dass ein bestimmtes "
+"Gitterquadrat zu einem bestimmten Punkt gehört, ohne dass Sie sich sicher "
+"sind, wo die Kanten liegen und welche anderen Quadrate mit dem Punkt "
+"verbunden sind. Um dies zu markieren (damit sie es nicht vergessen) können "
+"Sie rechts auf den Punkt klicken und ziehen, womit eine Pfeilmarkierung, die "
+"auf den Punkt zeigt, erstellt wird. Lassen Sie diese in ein Quadrat Ihrer "
+"Wahl fallen und Sie werden daran erinnert, zu welchem Punkt es zugeordnet "
+"ist. Sie können auf bestehende Pfeile auch rechtsklicken, um sie aufzunehmen "
+"und zu bewegen, oder sie durch Ziehen Ã¼ber den Rand des Spielfeldes zu "
+"zerstören. (Falls Sie sich nicht sicher sind, zu welchem Punkt ein Pfeil "
+"zeigt, können Sie ihn auch aufnehmen und herumbewegen, um die klar zu "
+"stellen. Er wird sich ständig drehen, während Sie ihn ziehen, um weiterhin "
+"auf den Elternpunkt zu zeigen."
+
+#. type: Plain text
+#: puzzles.but:2439
+msgid ""
+"You can also use the cursor keys to move around the grid squares and lines.  "
+"Pressing the return key when over a grid line will draw or clear its edge, "
+"as above. Pressing the return key when over a dot will pick up an arrow, to "
+"be dropped the next time the return key is pressed; this can also be used to "
+"move existing arrows around, removing them by dropping them on a dot or "
+"another arrow."
+msgstr ""
+"Sie können auch die Pfeiltasten verwenden, um sich auf den Gitterquadraten "
+"und -linen zu bewegen. Durch Drücken der Eingabetaste Ã¼ber einer Gitterlinie "
+"wird wie oben eine Kante eingefügt oder entfernt. Durch Drücken der "
+"Eingabetaste Ã¼ber einem Punkt wird ein Pfeil aufgenommen, der dann beim "
+"nächsten Drücken der Eingabetaste wieder abgelegt wird. Dies kann auch dazu "
+"verwandt werden, bestehende Pfeile herumzubewegen und sie durch Ablegen auf "
+"einen Punkt oder einen anderen Pfeil zu entfernen."
+
+#. type: Plain text
+#: puzzles.but:2443
+msgid "\\I{parameters, for Galaxies}Galaxies parameters"
+msgstr "\\I{Parameter, für Galaxies}Galaxies-Parameter"
+
+#. type: Plain text
+#: puzzles.but:2456
+msgid ""
+"Controls the difficulty of the generated puzzle. More difficult puzzles "
+"require more complex deductions, and the \\q{Unreasonable} difficulty level "
+"may require backtracking."
+msgstr ""
+"Steuert die Schwierigkeit des erstellten Puzzles. Schwierigere Puzzle "
+"verlangen komplexere Schlüsse und bei der Schwierigkeitsstufe "
+"\\q{Unreasonable} könnte Rückverfolgung notwendig sein."
+
+#. type: Plain text
+#: puzzles.but:2460
+msgid "\\i{Filling}"
+msgstr "\\i{Filling}"
+
+#. type: Plain text
+#: puzzles.but:2462
+msgid "\\cfg{winhelp-topic}{games.filling}"
+msgstr "\\cfg{winhelp-topic}{games.filling}"
+
+#. type: Plain text
+#: puzzles.but:2467
+msgid ""
+"You have a grid of squares, some of which contain digits, and the rest of "
+"which are empty. Your job is to fill in digits in the empty squares, in such "
+"a way that each connected region of squares all containing the same digit "
+"has an area equal to that digit."
+msgstr ""
+"Sie bekommen ein Gitter an Quadraten, von denen einige Ziffern enthalten und "
+"der Rest leer ist. Ihre Aufgabe besteht darin, Ziffern in die leeren "
+"Quadrate dergestalt einzufügen, dass jede zusammenhängende Region an "
+"Quadraten, die die gleiche Ziffer enthalten, ein Fläche abdeckt, die der "
+"Ziffer entspricht."
+
+#. type: Plain text
+#: puzzles.but:2470
+msgid ""
+"(\\q{Connected region}, for the purposes of this game, does not count "
+"diagonally separated squares as adjacent.)"
+msgstr ""
+"(Für die Zwecke dieses Spiels zählen diagonal getrennte Quadrate bei den "
+"\\q{verbundenen Regionen} nicht als benachbart.)"
+
+#. type: Plain text
+#: puzzles.but:2475
+msgid ""
+"For example, it follows that no square can contain a zero, and that two "
+"adjacent squares can not both contain a one.  No region has an area greater "
+"than 9 (because then its area would not be a single digit)."
+msgstr ""
+"Daraus folgt beispielsweise, dass kein Quadrat eine Null enthalten kann und "
+"zwei benachbarte Quadrate keine Eins. Keine Region hat ein Gebiet größer als "
+"9 (da dann sein Gebiet nicht eine einzelne Ziffer wäre)."
+
+#. type: Plain text
+#: puzzles.but:2477
+msgid "Credit for this puzzle goes to \\i{Nikoli} \\k{nikoli-fillomino}."
+msgstr "Dank für dieses Puzzle geht an \\i{Nikoli} \\k{nikoli-fillomino}."
+
+#. type: Plain text
+#: puzzles.but:2479
+msgid "Filling was contributed to this collection by Jonas K\\u00F6{oe}lker."
+msgstr ""
+"Filling ist ein Beitrag von Jonas K\\u00F6{oe}lker zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:2482
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/fillomino.html}\\cw{http://www.nikoli."
+"co.jp/en/puzzles/fillomino.html}"
+msgstr "\\W{http://www.nikoli.co.jp/en/puzzles/fillomino.html}\\cw{http://www.nikoli.co.jp/en/puzzles/fillomino.html}"
+
+#. type: Plain text
+#: puzzles.but:2484
+msgid "\\I{controls, for Filling}Filling controls"
+msgstr "\\I{Steuerung, von Filling}Filling-Steuerung"
+
+#. type: Plain text
+#: puzzles.but:2491
+msgid ""
+"To play Filling, simply click the mouse in any empty square and then type a "
+"digit on the keyboard to fill that square. By dragging the mouse, you can "
+"select multiple squares to fill with a single keypress.  If you make a "
+"mistake, click the mouse in the incorrect square and press 0, Space, "
+"Backspace or Enter to clear it again (or use the Undo feature)."
+msgstr ""
+"Um Filling zu spielen, klicken Sie einfach mit der Maus in ein leeres "
+"Quadrat und tippen Sie eine Ziffer auf der Tastatur, um es zu füllen. Durch "
+"Ziehen mit der Maus können sie mehrere Quadrate auswählen, um sie durch eine "
+"einzige Tastatureingabe zu füllen. Falls Sie einen Fehler machen, klicken "
+"Sie mit der Maus in das inkorrekte Quadrat und drücken 0, die Leer-, "
+"Rückschritt- oder Eingabetaste, um das Feld wieder zu leeren (oder verwenden "
+"Sie die Undo-Funktion)."
+
+#. type: Plain text
+#: puzzles.but:2498
+msgid ""
+"You can also move around the grid with the cursor keys; typing a digit will "
+"fill the square containing the cursor with that number; typing 0 will clear "
+"it.  You can also select multiple squares for numbering or clearing with the "
+"return and arrow keys, before typing a digit to fill or clear the "
+"highlighted squares (as above).  The space bar adds and removes single "
+"squares to and from the selection.  Backspace and escape remove all squares "
+"from the selection."
+msgstr ""
+"Sie können sich im Gitter auch mit den Pfeiltasten bewegen. Durch Drücken "
+"einer Ziffer wird das Quadrat unter dem Cursor mit der Zahl gefüllt, durch "
+"Drücken der 0 wird es wieder "
+"bereinigt. Sie können auch mehrere Quadrate zur Nummerierung oder "
+"Bereinigung mit der Eingabe- und den Pfeiltasten auswählen, bevor Sie eine "
+"Ziffer eingeben, um die hervorgehobenen Quadrate auszufüllen oder zu "
+"bereinigen (wie oben). Die Leertaste fügt einzelne Quadrate zu der Auswahl "
+"hinzu oder entfernt sie daraus. Rückschritt oder Escape entfernen alle "
+"Quadrate aus der Auswahl."
+
+#. type: Plain text
+#: puzzles.but:2502
+msgid "\\I{parameters, for Filling}Filling parameters"
+msgstr "\\I{Parameter, für Filling}Filling-Parameter"
+
+#. type: Plain text
+#: puzzles.but:2505
+msgid ""
+"Filling allows you to configure the number of rows and columns of the grid, "
+"through the \\q{Type} menu."
+msgstr ""
+"Bei Filling können Sie die Anzahl der Zeilen und Spalten des Gitters mittels "
+"des \\q{Type}-Menüs einstellen."
+
+#. type: Plain text
+#: puzzles.but:2508
+msgid "\\i{Keen}"
+msgstr "\\i{Keen}"
+
+#. type: Plain text
+#: puzzles.but:2510
+msgid "\\cfg{winhelp-topic}{games.keen}"
+msgstr "\\cfg{winhelp-topic}{games.keen}"
+
+#. type: Plain text
+#: puzzles.but:2515
+msgid ""
+"You have a square grid; each square may contain a digit from 1 to the size "
+"of the grid. The grid is divided into blocks of varying shape and size, with "
+"arithmetic clues written in them. Your aim is to fully populate the grid "
+"with digits such that:"
+msgstr ""
+"Sie bekommen ein Quadratgitter; jedes Quadrat darf eine Ziffer zwischen 1 "
+"und der Größe des Gitters enthalten. Das Gitter ist in Blöcke verschiedener "
+"Form und Größe eingeteilt, in denen sich arithmetische Hinweise befinden. "
+"Ihr Ziel besteht darin, das Gitter komplett mit Zahlen zu befüllen, so dass:"
+
+#. type: Plain text
+#: puzzles.but:2523
+msgid ""
+"The digits in each block can be combined to form the number stated in the "
+"clue, using the arithmetic operation given in the clue. That is:"
+msgstr ""
+"Die Ziffern in jedem Block kombiniert werden können, um die im Hinweis "
+"angegebene Nummer mit dem im Hinweis gegebenen arithmetischen Operator zu "
+"bilden. Dies heißt:"
+
+#. type: Plain text
+#: puzzles.but:2550
+msgid ""
+"An addition clue means that the sum of the digits in the block must be the "
+"given number. For example, \\q{15+} means the contents of the block adds up "
+"to fifteen."
+msgstr ""
+"Ein Additionshinweis bedeutet, dass die Summe der Ziffern in den Blöcken "
+"eine gegebene Nummer sein muss. Beispielsweise bedeutet \\q{15+}, dass die "
+"Summe der Blöcke 15 ergibt."
+
+#. type: Plain text
+#: puzzles.but:2550
+msgid ""
+"A multiplication clue (e.g. \\q{60\\times}), similarly, means that the "
+"product of the digits in the block must be the given number."
+msgstr ""
+"Ein Multiplikationshinweis (z.B. \\q{60\\times}) bedeutet entsprechend, dass "
+"das Produkt der Ziffern in dem Block die angegebene Zahl ergeben muss."
+
+#. type: Plain text
+#: puzzles.but:2550
+msgid ""
+"A subtraction clue will always be written in a block of size two, and it "
+"means that one of the digits in the block is greater than the other by the "
+"given amount. For example, \\q{2\\minus} means that one of the digits in the "
+"block is 2 more than the other, or equivalently that one digit minus the "
+"other one is 2. The two digits could be either way round, though."
+msgstr ""
+"Ein Subtraktionshinweis wird immer in einen Block der Größe zwei geschrieben "
+"und bedeutet, dass eine der Ziffern in dem Block um den angegeben Wert "
+"größer als die andere sein muss. Beispielsweise bedeutet \\q{2\\minus}, dass "
+"eine der Ziffern im Block um zwei größer ist als die andere, oder "
+"äquivalent, dass eine Ziffer minus der anderen zwei beträgt. Die zwei "
+"Ziffern können in dem Block aber beliebig verteilt sein."
+
+#. type: Plain text
+#: puzzles.but:2550
+msgid ""
+"A division clue (e.g. \\q{3\\divide}), similarly, is always in a block of "
+"size two and means that one digit divided by the other is equal to the given "
+"amount."
+msgstr ""
+"Ein Divisionshinweis (z.B. \\q{3\\divide}) befindet sich entsprechend immer "
+"in einem Block der Größe zwei und bedeutet, dass eine Ziffer geteilt durch "
+"die andere identisch zu der angegebenen Zahl ist."
+
+#. type: Plain text
+#: puzzles.but:2550
+msgid ""
+"Note that a block may contain the same digit more than once (provided the "
+"identical ones are not in the same row and column).  This rule is precisely "
+"the opposite of the rule in Solo's \\q{Killer} mode (see \\k{solo})."
+msgstr ""
+"Beachten Sie, dass ein Block die gleiche Ziffer mehr als einmal beinhalten "
+"darf (vorausgesetzt, dass die identischen sich nicht in der gleichen Zeile "
+"und Spalte befinden). Diese Regel ist genau das Gegenteil der Regel im Modus "
+"\\q{Killer} von Solo (siehe \\k{solo})."
+
+#. type: Plain text
+#: puzzles.but:2552
+msgid "This puzzle appears in the Times under the name \\q{\\i{KenKen}}."
+msgstr "Dieses Puzzle erscheint in der Times unter dem Namen \\q{\\i{KenKen}}."
+
+#. type: Plain text
+#: puzzles.but:2555
+msgid "\\i{Keen controls}"
+msgstr "\\i{Keen-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:2556
+msgid "Keen controls"
+msgstr "Keen-Steuerung"
+
+#. type: IM
+#: puzzles.but:2556
+#, no-wrap
+msgid "controls, for Keen"
+msgstr "Steuerung, von Keen"
+
+#. type: Plain text
+#: puzzles.but:2559
+msgid "Keen shares much of its control system with Solo (and Unequal)."
+msgstr "Keen hat viel mit dem Steuersystem von Solo (und Unequal) gemeinsam."
+
+#. type: Plain text
+#: puzzles.but:2564
+msgid ""
+"To play Keen, simply click the mouse in any empty square and then type a "
+"digit on the keyboard to fill that square. If you make a mistake, click the "
+"mouse in the incorrect square and press Space to clear it again (or use the "
+"Undo feature)."
+msgstr ""
+"Um Keen zu spielen, klicken Sie einfach mit der Maus in ein leeres Quadrat "
+"und tippen Sie dann eine Ziffer auf der Tastatur, um dieses Quadrat zu "
+"füllen. Falls Sie einen Fehler gemacht haben, klicken Sie mit der Maus in "
+"das fehlerhafte Quadrat und drücken Sie die Leertaste, um es wieder zu "
+"leeren (oder verwenden Sie die Undo-Funktion)."
+
+#. type: Plain text
+#: puzzles.but:2588 puzzles.but:2682
+msgid ""
+"As for Solo, the cursor keys can be used in conjunction with the digit keys "
+"to set numbers or pencil marks. Use the cursor keys to move a highlight "
+"around the grid, and type a digit to enter it in the highlighted square. "
+"Pressing return toggles the highlight into a mode in which you can enter or "
+"remove pencil marks."
+msgstr ""
+"Wie bei Solo können die Pfeiltasten zusammen mit den Zifferntasten verwendet "
+"werden, um Nummern oder Bleistiftmarkierungen zu setzen. Verwenden Sie die "
+"Pfeiltasten, um eine Hervorhebung Ã¼ber das Gitter zu bewegen und geben Sie "
+"eine Ziffer in das hervorgehobene Quadrat ein. Durch Drücken der "
+"Eingabetaste schalten Sie in einen Modus um, in dem Sie statt der "
+"Hervorhebung Bleistiftmarkierungen eingeben oder entfernen können."
+
+#. type: Plain text
+#: puzzles.but:2591 puzzles.but:2685
+msgid ""
+"Pressing M will fill in a full set of pencil marks in every square that does "
+"not have a main digit in it."
+msgstr ""
+"Durch Drücken von Â»M« wird ein kompletter Satz an Bleistiftmarkierungen in "
+"jedes Quadrat, das noch keine Hauptziffer enthält, eingefügt."
+
+#. type: Plain text
+#: puzzles.but:2595
+msgid "\\I{parameters, for Keen}Keen parameters"
+msgstr "\\I{Parameter, für Keen}Keen-Parameter"
+
+#. type: e{#1}
+#: puzzles.but:2600 puzzles.but:2698
+msgid "Grid size"
+msgstr "Grid size"
+
+#. type: Plain text
+#: puzzles.but:2604 puzzles.but:2702
+msgid ""
+"Specifies the size of the grid. Lower limit is 3; upper limit is 9 (because "
+"the user interface would become more difficult with \\q{digits} bigger than "
+"9!)."
+msgstr ""
+"Legt die Größe des Gitters fest. Die untere Grenze ist 3; die obere Grenze "
+"ist 9 (da die Benutzerschnittstelle mit \\q{Ziffern} größer als 9 schwerer "
+"würde!)."
+
+#. type: Plain text
+#: puzzles.but:2611 puzzles.but:2709
+msgid ""
+"Controls the difficulty of the generated puzzle. At Unreasonable level, some "
+"backtracking will be required, but the solution should still be unique. The "
+"remaining levels require increasingly complex reasoning to avoid having to "
+"backtrack."
+msgstr ""
+"Steuert die Schwierigkeit des erstellten Puzzles. In der Stufe "
+"»Unreasonable« wird Rückverfolgung benötigt, die Lösung sollte aber immer "
+"noch eindeutig sein. Die Stufen dazwischen benötigen zunehmend komplexe "
+"Schlussfolgerungen, um Rückverfolgung zu vermeiden."
+
+#. type: e{#1}
+#: puzzles.but:2613
+msgid "Multiplication only"
+msgstr "Multiplication only"
+
+#. type: Plain text
+#: puzzles.but:2616
+msgid ""
+"If this is enabled, all boxes will be multiplication boxes.  With this rule, "
+"the puzzle is known as \\q{Inshi No Heya}."
+msgstr ""
+"Falls dies aktiviert ist, sind alle Kästen Multiplikationskästen. Mit dieser "
+"Regel ist das Puzzle als \\q{Inshi No Heya} bekannt."
+
+#. type: Plain text
+#: puzzles.but:2618
+msgid "\\i{Towers}"
+msgstr "\\i{Towers}"
+
+#. type: Plain text
+#: puzzles.but:2620
+msgid "\\cfg{winhelp-topic}{games.towers}"
+msgstr "\\cfg{winhelp-topic}{games.towers}"
+
+#. type: Plain text
+#: puzzles.but:2624
+msgid ""
+"You have a square grid. On each square of the grid you can build a tower, "
+"with its height ranging from 1 to the size of the grid.  Around the edge of "
+"the grid are some numeric clues."
+msgstr ""
+"Sie bekommen ein Quadratgitter. In jedem Quadrat des Gitters können Sie "
+"einen Turm bauen, wobei die Höhe von 1 bis zu der Gittergröße variiert. Um "
+"den Rand des Gitters herum befinden sich ein paar nummerische Hinweise."
+
+#. type: Plain text
+#: puzzles.but:2626
+msgid "Your task is to build a tower on every square, in such a way that:"
+msgstr ""
+"Ihre Aufgabe besteht darin, in jedem Quadrat einen Turm zu bauen, so dass"
+
+#. type: Plain text
+#: puzzles.but:2628
+msgid "Each row contains every possible height of tower once"
+msgstr "jede Zeile jede mögliche Höhe eines Turms einmal enthält"
+
+#. type: Plain text
+#: puzzles.but:2630
+msgid "Each column contains every possible height of tower once"
+msgstr "jede Spalte jede mögliche Höhe eines Turms einmal enthält"
+
+#. type: Plain text
+#: puzzles.but:2638
+msgid ""
+"Each numeric clue describes the number of towers that can be seen if you "
+"look into the square from that direction, assuming that shorter towers are "
+"hidden behind taller ones. For example, in a 5\\by\\.5 grid, a clue marked "
+"\\q{5} indicates that the five tower heights must appear in increasing order "
+"(otherwise you would not be able to see all five towers), whereas a clue "
+"marked \\q{1} indicates that the tallest tower (the one marked 5) must come "
+"first."
+msgstr ""
+"jeder numerische Hinweis die Anzahl der Türme beschreibt, die gesehen "
+"werden, wenn das Quadrat von dieser Seite aus betrachtet wird, wobei "
+"angenommen wird, dass niedriegere Türme hinter größeren Türmen versteckt "
+"sind. In einem 5\\by\\.5-Gitter bedeutet ein Hinweis \\q{5}, dass die fünf "
+"Türme in ansteigender Größe auftauchen müssen (andernfalls könnten nicht "
+"alle fünf Türme gesehen werden), während ein Hinweis \\q{1} anzeigt, dass "
+"der höchste Turm (der mit 5 markiert ist) als erstes kommen muss."
+
+#. type: Plain text
+#: puzzles.but:2642
+msgid ""
+"In harder or larger puzzles, some towers will be specified for you as well "
+"as the clues round the edge, and some edge clues may be missing."
+msgstr ""
+"In schwierigeren oder größeren Puzzlen werden neben den Hinweisen an den "
+"Seiten auch einige Türme spezifiziert und einige Hinweise an den Rändern "
+"könnten fehlen."
+
+#. type: Plain text
+#: puzzles.but:2645
+msgid ""
+"This puzzle appears on the web under various names, particularly "
+"\\q{\\i{Skyscrapers}}, but I don't know who first invented it."
+msgstr ""
+"Das Puzzle erscheint im Web unter verschiedenen Namen, insbesondere "
+"\\q{\\i{Skyscrapers}}, aber ich weiß nicht, wer es erfunden hat."
+
+#. type: Plain text
+#: puzzles.but:2648
+msgid "\\i{Towers controls}"
+msgstr "\\i{Towers-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:2649
+msgid "Towers controls"
+msgstr "Towers-Steuerung"
+
+#. type: IM
+#: puzzles.but:2649
+#, no-wrap
+msgid "controls, for Towers"
+msgstr "Steuerung, von Towers"
+
+#. type: Plain text
+#: puzzles.but:2652
+msgid "Towers shares much of its control system with Solo, Unequal and Keen."
+msgstr ""
+"Towers hat viel mit dem Steuersystem von Solo, Unequal und Keen gemeinsam."
+
+#. type: Plain text
+#: puzzles.but:2658
+msgid ""
+"To play Towers, simply click the mouse in any empty square and then type a "
+"digit on the keyboard to fill that square with a tower of the given height. "
+"If you make a mistake, click the mouse in the incorrect square and press "
+"Space to clear it again (or use the Undo feature)."
+msgstr ""
+"Um Towers zu spielen, klicken Sie einfach mit der Maus in ein leeres Quadrat "
+"und tippen Sie dann eine Ziffer auf der Tastatur, um dieses Quadrat mit "
+"einem Turm dieser Höhe zu füllen. Falls Sie einen Fehler gemacht haben, "
+"klicken Sie mit der Maus in das fehlerhafte Quadrat und drücken Sie die "
+"Leertaste, um es wieder zu leeren (oder verwenden Sie die Undo-Funktion)."
+
+#. type: Plain text
+#: puzzles.but:2663
+msgid ""
+"If you \\e{right}-click in a square and then type a number, that number will "
+"be entered in the square as a \\q{pencil mark}. You can have pencil marks "
+"for multiple numbers in the same square. A square containing a tower cannot "
+"also contain pencil marks."
+msgstr ""
+"Falls Sie in ein Quadrat \\e{rechts-}klicken und dann eine Zahl tippen, wird "
+"diese Zahl im Quadrat als \\q{Bleistiftmarkierung} eingetragen. Sie können "
+"Bleistiftmarkierungen für mehrere Zahlen im gleichen Quadrat vornehmen. "
+"Quadrate, in denen sich ein Turm befindet können nicht auch gleichzeitig "
+"über Bleistiftmarkierungen verfügen."
+
+#. type: Plain text
+#: puzzles.but:2689
+msgid ""
+"Left-clicking a clue will mark it as done (grey it out), or unmark it if it "
+"is already marked.  Holding Control or Shift and pressing an arrow key "
+"likewise marks any clue in the given direction."
+msgstr ""
+"Durch Linksklick auf einen Hinweis wird dieser als erledigt markiert "
+"(ausgegraut) oder die Markierung entfernt, falls er bereits markiert ist. "
+"Durch Drücken von Strg oder Umschalten und den Pfeiltasten wird entsprechend "
+"ein Hinweis in der angegebenen Richtung markiert."
+
+#. type: Plain text
+#: puzzles.but:2693
+msgid "\\I{parameters, for Towers}Towers parameters"
+msgstr "\\I{Parameter, für Towers}Towers-Parameter"
+
+#. type: Plain text
+#: puzzles.but:2712
+msgid "\\i{Singles}"
+msgstr "\\i{Singles}"
+
+#. type: Plain text
+#: puzzles.but:2714
+msgid "\\cfg{winhelp-topic}{games.singles}"
+msgstr "\\cfg{winhelp-topic}{games.singles}"
+
+#. type: Plain text
+#: puzzles.but:2718
+msgid ""
+"You have a grid of white squares, all of which contain numbers. Your task is "
+"to colour some of the squares black (removing the number) so as to satisfy "
+"all of the following conditions:"
+msgstr ""
+"Sie bekommen ein Gitter aus weißen Quadraten, das alle Zahlen enthält. Ihre "
+"Aufgabe besteht darin, einige davon schwarz zu färben (und damit die Zahl zu "
+"entfernen), so dass die folgenden Bedingungen alle erfüllt sind:"
+
+#. type: Plain text
+#: puzzles.but:2720
+msgid "No number occurs more than once in any row or column."
+msgstr "Keine Zahl erscheint mehr als einmal in einer Spalte oder Zeile."
+
+#. type: Plain text
+#: puzzles.but:2723
+msgid ""
+"No black square is horizontally or vertically adjacent to any other black "
+"square."
+msgstr ""
+"Kein schwarzes Quadrat ist horizontal oder vertikal zu einem anderen "
+"schwarzen Quadrat benachbart."
+
+#. type: Plain text
+#: puzzles.but:2726
+msgid ""
+"The remaining white squares must all form one contiguous region (connected "
+"by edges, not just touching at corners)."
+msgstr ""
+"Die verbleibenden weißen Quadrate müssen alle eine kontinuierliche Region "
+"bilden (verbunden Ã¼ber Kanten, nicht nur Berührungen an Ecken)."
+
+#. type: Plain text
+#: puzzles.but:2729
+msgid ""
+"Credit for this puzzle goes to \\i{Nikoli} \\k{nikoli-hitori} who call it "
+"\\i{Hitori}."
+msgstr ""
+"Dank für dieses Puzzle geht an \\i{Nikoli} \\k{nikoli-hitori}, die es "
+"\\i{Hitori} nannten."
+
+#. type: Plain text
+#: puzzles.but:2731
+msgid "Singles was contributed to this collection by James Harvey."
+msgstr "Singles ist ein Beitrag von James Harvey zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:2735
+msgid ""
+"\\W{http://www.nikoli.com/en/puzzles/hitori.html}\\cw{http://www.nikoli.com/"
+"en/puzzles/hitori.html} (beware of Flash)"
+msgstr "\\W{http://www.nikoli.com/en/puzzles/hitori.html}\\cw{http://www.nikoli.com/en/puzzles/hitori.html} (Achtung Flash)"
+
+#. type: Plain text
+#: puzzles.but:2737
+msgid "\\i{Singles controls}"
+msgstr "\\i{Singles-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:2738
+msgid "Singles controls"
+msgstr "Singles-Steuerung"
+
+#. type: IM
+#: puzzles.but:2738
+#, no-wrap
+msgid "controls, for Singles"
+msgstr "Steuerung, von Singles"
+
+#. type: Plain text
+#: puzzles.but:2743
+msgid ""
+"Left-clicking on an empty square will colour it black; left-clicking again "
+"will restore the number. Right-clicking will add a circle (useful for "
+"indicating that a cell is definitely not black)."
+msgstr ""
+"Durch Linksklick auf ein leeres Quadrat wird es schwarz gefärbt; durch "
+"erneuten Linksklick wird die Zahl wieder angezeigt. Rechtsklick ergänzt "
+"einen Kreis (nützlich um anzuzeigen, dass eine Zelle definitiv nicht schwarz "
+"ist)."
+
+#. type: Plain text
+#: puzzles.but:2747
+msgid ""
+"You can also use the cursor keys to move around the grid. Pressing the "
+"return or space keys will turn a square black or add a circle respectively, "
+"and pressing the key again will restore the number or remove the circle."
+msgstr ""
+"Sie können auch die Pfeiltasten verwenden, um sich auf dem Gitter zu "
+"bewegen. Durch Drücken der Eingabe- oder Leertaste wird ein Quadrat schwarz "
+"gefärbt oder respektive ein Kreis hinzugefügt und durch erneutes Drücken der "
+"Taste wird wieder die Zahl gezeigt oder der Kreis entfernt."
+
+#. type: Plain text
+#: puzzles.but:2751
+msgid "\\I{parameters, for Singles}Singles parameters"
+msgstr "\\I{Parameter, für Singles}Singles-Parameter"
+
+#. type: Plain text
+#: puzzles.but:2762 puzzles.but:3131 puzzles.but:3178
+msgid "Controls the difficulty of the generated puzzle."
+msgstr "Steuert die Schwierigkeit des erstellten Puzzles."
+
+#. type: Plain text
+#: puzzles.but:2765
+msgid "\\i{Magnets}"
+msgstr "\\i{Magnets}"
+
+#. type: Plain text
+#: puzzles.but:2767
+msgid "\\cfg{winhelp-topic}{games.magnets}"
+msgstr "\\cfg{winhelp-topic}{games.magnets}"
+
+#. type: Plain text
+#: puzzles.but:2774
+msgid ""
+"A rectangular grid has been filled with a mixture of magnets (that is, "
+"dominoes with one positive end and one negative end) and blank dominoes "
+"(that is, dominoes with two neutral poles).  These dominoes are initially "
+"only seen in silhouette. Around the grid are placed a number of clues "
+"indicating the number of positive and negative poles contained in certain "
+"columns and rows."
+msgstr ""
+"Ein rechteckiges Gitter wurde mit einer Mischung von Magneten (d.h. Dominos "
+"mit einem positiven und einem negativen Ende) und leeren Dominos (d.h. "
+"Dominos mit zwei neutralen Polen) gefüllt. Diese Dominos sind anfangs nur "
+"als Silhouette sichtbar. Um das Gitter herum werden eine Reihe von Hinweisen "
+"platziert, die die Anzahl an positiven und negativen Polen in bestimmten "
+"Zeilen und Spalten angeben."
+
+#. type: Plain text
+#: puzzles.but:2779
+msgid ""
+"Your aim is to correctly place the magnets and blank dominoes such that all "
+"the clues are satisfied, with the additional constraint that no two similar "
+"magnetic poles may be orthogonally adjacent (since they repel).  Neutral "
+"poles do not repel, and can be adjacent to any other pole."
+msgstr ""
+"Ihr Ziel besteht darin, unter Beachtung aller Hinweise die Magnete und "
+"leeren Dominos korrekt zu setzen. Weitere Randbedingung ist, dass zwei "
+"gleiche Magnetpole nicht gegenüberliegend benachbart sein dürfen (da sie "
+"sich abstoßen). Neutrale Pole stoßen sich nicht ab und können neben jedem "
+"anderen Pol liegen."
+
+#. type: Plain text
+#: puzzles.but:2781
+msgid "Credit for this puzzle goes to \\i{Janko} \\k{janko-magnets}."
+msgstr "Dank für dieses Puzzle geht an \\i{Janko} \\k{janko-magnets}."
+
+#. type: Plain text
+#: puzzles.but:2783
+msgid "Magnets was contributed to this collection by James Harvey."
+msgstr "Magnets ist ein Beitrag von James Harvey zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:2786
+msgid ""
+"\\W{http://www.janko.at/Raetsel/Magnete/index.htm}\\cw{http://www.janko.at/"
+"Raetsel/Magnete/index.htm}"
+msgstr ""
+"\\W{http://www.janko.at/Raetsel/Magnete/index.htm}\\cw{http://www.janko.at/"
+"Raetsel/Magnete/index.htm}"
+
+#. type: Plain text
+#: puzzles.but:2788
+msgid "\\i{Magnets controls}"
+msgstr "\\i{Magnets-Steuerung}"
+
+#. type: IM{#1}
+#: puzzles.but:2789
+msgid "Magnets controls"
+msgstr "Magnets-Steuerung"
+
+#. type: IM
+#: puzzles.but:2789
+#, no-wrap
+msgid "controls, for Magnets"
+msgstr "Steuerung, von Magnets"
+
+#. type: Plain text
+#: puzzles.but:2795
+msgid ""
+"Left-clicking on an empty square places a magnet at that position with the "
+"positive pole on the square and the negative pole on the other half of the "
+"magnet; left-clicking again reverses the polarity, and a third click removes "
+"the magnet."
+msgstr ""
+"Durch Linksklick auf ein leeres Quadrat wird ein Magnet auf dieser Position "
+"platziert, wobei der positive Pol auf dem Quadrat liegt und der negative auf "
+"der anderen Hälfte des Magneten; durch erneuten Linksklick wird die "
+"Polarität vertauscht. Ein dritter Linksklick entfernt den Magnet."
+
+#. type: Plain text
+#: puzzles.but:2800
+msgid ""
+"Right-clicking on an empty square places a blank domino there.  Right-"
+"clicking again places two question marks on the domino, signifying \\q{this "
+"cannot be blank} (which can be useful to note deductions while solving), and "
+"right-clicking again empties the domino."
+msgstr ""
+"Rechtsklick auf ein leeres Quadrat platziert dort einen Domino. Ein erneuter "
+"Rechtsklick platziert dort zwei Fragezeichen, die signalisieren, dass "
+"\\q{dies nicht leer sein kann} (das kann ein hilfreicher Hinweis während des "
+"Lösens sein) und ein weiterer Rechtsklick leert das Domino wieder."
+
+#. type: Plain text
+#: puzzles.but:2803 puzzles.but:3116
+msgid ""
+"Left-clicking a clue will mark it as done (grey it out), or unmark it if it "
+"is already marked."
+msgstr ""
+"Durch Linksklick auf einen Hinweis wird dieser als erledigt markiert "
+"(ausgegraut) oder die Markierung entfernt, falls er bereits markiert ist."
+
+#. type: Plain text
+#: puzzles.but:2809
+msgid ""
+"You can also use the cursor keys to move a cursor around the grid.  Pressing "
+"the return key will lay a domino with a positive pole at that position; "
+"pressing again reverses the polarity and then removes the domino, as with "
+"left-clicking. Using the space bar allows placement of blank dominoes and "
+"cannot-be-blank hints, as for right-clicking."
+msgstr ""
+"Sie können auch die Pfeiltasten verwenden, um den Cursor Ã¼ber das Gitter zu "
+"bewegen. Durch Drücken der Eingabetaste wird ein Domino mit einem positiven "
+"Pol an dieser Position abgelegt; durch erneutes Drücken wird die Polarität "
+"umgedreht und entfernt dann das Domino, wie beim Linksklick. Durch Drücken "
+"der Eingabetaste wird, wie beim Rechtklick, ein leeres Domino platziert und "
+"das Feld als nicht leer/sicher belegt markiert."
+
+#. type: Plain text
+#: puzzles.but:2813
+msgid "\\I{parameters, for Magnets}Magnets parameters"
+msgstr "\\I{Parameter, für Magnets}Magnets-Parameter"
+
+#. type: Plain text
+#: puzzles.but:2821
+msgid ""
+"Size of grid in squares. There will be half \\e{Width} \\by \\e{Height} "
+"dominoes in the grid: if this number is odd then one square will be blank."
+msgstr ""
+"Größe des Gitters in Quadraten. Es gibt 0.5 \\by \\e{Width} \\by \\e{Height} "
+"Dominos pro Gitter: Falls diese Zahl ungerade ist, bleibt ein Quadrat leer."
+
+#. type: Plain text
+#: puzzles.but:2827
+msgid "(Grids with at least one odd dimension tend to be easier to solve.)"
+msgstr ""
+"(Gitter mit mindestens einer ungeraden Dimension sind tendenziell leichter "
+"zu lösen.)"
+
+#. type: Plain text
+#: puzzles.but:2833
+msgid ""
+"Controls the difficulty of the generated puzzle. At Tricky level, you are "
+"required to make more deductions about empty dominoes and row/column counts."
+msgstr ""
+"Steuert die Schwierigkeit des erstellten Puzzles. Auf der Stufe Â»Tricky« "
+"müssen Sie schwierigere Schlussfolgerungen Ã¼ber leere Dominos und Anzahl von "
+"Spalten/Zeilen machen."
+
+#. type: e{#1}
+#: puzzles.but:2835
+msgid "Strip clues"
+msgstr "Strip clues"
+
+#. type: Plain text
+#: puzzles.but:2838
+msgid ""
+"If true, some of the clues around the grid are removed at generation time, "
+"making the puzzle more difficult."
+msgstr ""
+"Falls wahr, werden zum Erstellzeitpunkt einige der Hinweise im Gitter "
+"entfernt, wodurch das Puzzle schwieriger wird."
+
+#. type: Plain text
+#: puzzles.but:2841
+msgid "\\i{Signpost}"
+msgstr "\\i{Signpost}"
+
+#. type: Plain text
+#: puzzles.but:2843
+msgid "\\cfg{winhelp-topic}{games.signpost}"
+msgstr "\\cfg{winhelp-topic}{games.signpost}"
+
+#. type: Plain text
+#: puzzles.but:2853
+msgid ""
+"You have a grid of squares; each square (except the last one)  contains an "
+"arrow, and some squares also contain numbers. Your job is to connect the "
+"squares to form a continuous list of numbers starting at 1 and linked in the "
+"direction of the arrows \\dash so the arrow inside the square with the "
+"number 1 will point to the square containing the number 2, which will point "
+"to the square containing the number 3, etc. Each square can be any distance "
+"away from the previous one, as long as it is somewhere in the direction of "
+"the arrow."
+msgstr ""
+"Sie haben ein Gitter von Quadraten. Jedes Quadrat (außer dem letzten) "
+"enthält einen Pfeil und einige Quadrate enthalten Zahlen. Ihre Aufgabe "
+"besteht darin, die Quadrate zu verbinden, um eine fortlaufende Liste von "
+"Zahlen, beginnend mit 1 und verbunden in der Richtung der Pfeile, zu "
+"erstellen, so dass der Pfeil innerhalb des Quadrats mit der Zahl 1 auf das "
+"Quadrat mit der Nummer 2 zeigt, das wiederum auf das Quadrat mit der Zahl 3 "
+"zeigt usw. Jedes Quadrat kann eine beliebige Distanz vom vorherigen entfernt "
+"sein, solange es irgendwo in der Richtung des Pfeils liegt."
+
+#. type: Plain text
+#: puzzles.but:2856
+msgid ""
+"By convention the first and last numbers are shown; one or more interim "
+"numbers may also appear at the beginning."
+msgstr ""
+"Konventionsgemäß werden die erste und die letzte Zahl angezeigt. Anfangs mag "
+"auch eine oder mehrere Zahlen in der Mitte erscheinen."
+
+#. type: Plain text
+#: puzzles.but:2859
+msgid ""
+"Credit for this puzzle goes to \\i{Janko} \\k{janko-arrowpath}, who call it "
+"\\q{Pfeilpfad} (\\q{arrow path})."
+msgstr ""
+"Dank für dieses Puzzle geht an \\i{Janko} \\k{janko-arrowpath}, der es "
+"\\i{Pfeilpfad} nannte."
+
+#. type: Plain text
+#: puzzles.but:2861
+msgid "Signpost was contributed to this collection by James Harvey."
+msgstr "Signpost ist ein Beitrag von James Harvey zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:2864
+msgid ""
+"\\W{http://janko.at/Raetsel/Pfeilpfad/index.htm}\\cw{http://janko.at/Raetsel/"
+"Pfeilpfad/index.htm}"
+msgstr ""
+"\\W{http://janko.at/Raetsel/Pfeilpfad/index.htm}\\cw{http://janko.at/Raetsel/"
+"Pfeilpfad/index.htm}"
+
+#. type: Plain text
+#: puzzles.but:2866
+msgid "\\I{controls, for Signpost}Signpost controls"
+msgstr "\\I{Steuerung, von Signpost}Signpost-Steuerung"
+
+#. type: Plain text
+#: puzzles.but:2871
+msgid ""
+"To play Signpost, you connect squares together by dragging from one square "
+"to another, indicating that they are adjacent in the sequence. Drag with the "
+"left button from a square to its successor, or with the right button from a "
+"square to its predecessor."
+msgstr ""
+"Um Signpost zu spielen, verbinden Sie Quadrate, indem Sie von einem Quadrat "
+"zu einem anderen ziehen und damit anzeigen, dass sie aufeinander folgen. "
+"Ziehen Sie mit dem linken Knopf von einem Quadrat zu seinem Nachfolger oder "
+"mit dem rechten Knopf von einem Quadrat zu seinem Vorgänger."
+
+#. type: Plain text
+#: puzzles.but:2879
+msgid ""
+"If you connect together two squares in this way and one of them has a number "
+"in it, the appropriate number will appear in the other square. If you "
+"connect two non-numbered squares, they will be assigned temporary algebraic "
+"labels: on the first occasion, they will be labelled \\cq{a} and \\cq{a+1}, "
+"and then \\cq{b} and \\cq{b+1}, and so on. Connecting more squares on to the "
+"ends of such a chain will cause them all to be labelled with the same letter."
+msgstr ""
+"Falls Sie zwei Quadrate auf diese Art verbinden und eines eine Zahl enthält, "
+"wird die entsprechende Zahl im anderen Quadrat auftauchen. Falls Sie zwei "
+"Quadrate ohne Zahl verbinden, erhalten Sie temporäre algebraische "
+"Bezeichnungen: Beim ersten Auftreten werden sie mit \\cq{a} und \\cq{a+1} "
+"und dann mit \\cq{b} und \\cq{b+1} und so weiter benannt. Werden weitere "
+"Quadrate am Ende solch einer Kette verbunden, so werden sie alle mit dem "
+"gleichen Buchstaben bezeichnet."
+
+#. type: Plain text
+#: puzzles.but:2882
+msgid ""
+"When you left-click or right-click in a square, the legal squares to connect "
+"it to will be shown."
+msgstr ""
+"Wenn Sie auf ein Quadrat links oder rechts klicken, werden die Quadrate, zu "
+"denen eine gültige Verbindung möglich ist, angezeigt."
+
+#. type: Plain text
+#: puzzles.but:2888
+msgid ""
+"The arrow in each square starts off black, and goes grey once you connect "
+"the square to its successor. Also, each square which needs a predecessor has "
+"a small dot in the bottom left corner, which vanishes once you link a square "
+"to it. So your aim is always to connect a square with a black arrow to a "
+"square with a dot."
+msgstr ""
+"Der Pfeil in jedem Quadrat ist anfänglich schwarz und färbt sich in grau um, "
+"wenn Sie das Quadrat mit seinem Nachfolger verbinden. Auch hat jedes "
+"Quadrat, das einen Vorgänger benötigt, einen kleinen Punkt in der linken "
+"unteren Ecke, der beim Verbinden eines Quadrats damit verschwindet. Daher "
+"besteht Ihr Ziel darin, immer ein Quadrat mit einem schwarzen Pfeil mit "
+"einem Quadrat mit einem Punkt zu verbinden."
+
+#. type: Plain text
+#: puzzles.but:2892
+msgid ""
+"To remove any links for a particular square (both incoming and outgoing), "
+"left-drag it off the grid. To remove a whole chain, right-drag any square in "
+"the chain off the grid."
+msgstr ""
+"Um irgend eine Verbindung für ein bestimmtes Quadrat zu entfernen (sowohl "
+"eingehende als auch ausgehende), ziehen Sie es mit der linken Maustaste vom "
+"Gitter. Um eine ganze Kette zu entfernen, ziehen Sie ein beliebiges Quadrat "
+"aus der Kette mit der rechten Maustaste vom Gitter."
+
+#. type: Plain text
+#: puzzles.but:2899
+msgid ""
+"You can also use the cursor keys to move around the grid squares and lines. "
+"Pressing the return key when over a square starts a link operation, and "
+"pressing the return key again over a square will finish the link, if "
+"allowable. Pressing the space bar over a square will show the other squares "
+"pointing to it, and allow you to form a backward link, and pressing the "
+"space bar again cancels this."
+msgstr ""
+"Sie können auch die Pfeiltasten verwenden, um sich auf den Gitterquadraten "
+"und -linen zu bewegen. Durch Drücken der Eingabetaste Ã¼ber einem Quadrat "
+"wird eine Verbindungsoperation begonnen und durch Drücken der Eingabe Ã¼ber "
+"einem Quadrat wird die Verbindung beendet, falls erlaubt. Durch Drücken der "
+"Leertaste Ã¼ber einem Quadrat werden die anderen Quadrate, die darauf zeigen, "
+"anzeigen und es Ihnen erlauben, eine Rückwärtsverbindung auszulösen. "
+"Erneutes Drücken der Leertaste bricht dies ab."
+
+#. type: Plain text
+#: puzzles.but:2903
+msgid "\\I{parameters, for Signpost}Signpost parameters"
+msgstr "\\I{Parameter, für Signpost}Signpost-Parameter"
+
+#. type: e{#1}
+#: puzzles.but:2912
+msgid "Force start/end to corners"
+msgstr "Force start/end to corners"
+
+#. type: Plain text
+#: puzzles.but:2916
+msgid ""
+"If true, the start and end squares are always placed in opposite corners "
+"(the start at the top left, and the end at the bottom right). If false the "
+"start and end squares are placed randomly (although always both shown)."
+msgstr ""
+"Falls wahr, wird das Anfangs- und das Endquadrat immer in gegenüberliegenden "
+"Ecken platziert (der Anfang links oben und das Ende rechts unten). Falls "
+"falsch, werden das Anfangs- und Endquadrat zufällig platziert (allerdings "
+"werden beide immer angezeigt)."
+
+#. type: Plain text
+#: puzzles.but:2918
+msgid "\\i{Range}"
+msgstr "\\i{Range}"
+
+#. type: Plain text
+#: puzzles.but:2920
+msgid "\\cfg{winhelp-topic}{games.range}"
+msgstr "\\cfg{winhelp-topic}{games.range}"
+
+#. type: Plain text
+#: puzzles.but:2924
+msgid ""
+"You have a grid of squares; some squares contain numbers.  Your job is to "
+"colour some of the squares black, such that several criteria are satisfied:"
+msgstr ""
+"Sie bekommen ein Gitter aus Quadraten, davon enthalten einige Zahlen. Ihre "
+"Aufgabe besteht darin, einige davon schwarz zu färben, so dass mehrere "
+"Bedingungen erfüllt sind:"
+
+#. type: Plain text
+#: puzzles.but:2926
+msgid "no square with a number is coloured black."
+msgstr "Kein Quadrat mit einer Zahl ist schwarz gefärbt."
+
+#. type: Plain text
+#: puzzles.but:2928
+msgid "no two black squares are adjacent (horizontally or vertically)."
+msgstr ""
+"Keine zwei schwarzen Quadrate befinden sich (horizontal oder vertikal) "
+"nebeneinander."
+
+#. type: Plain text
+#: puzzles.but:2931
+msgid ""
+"for any two white squares, there is a path between them using only white "
+"squares."
+msgstr ""
+"Für jeweils zwei weiße Quadrate befindet sich ein Pfad zwischen ihnen, der "
+"nur weiße Quadrate verwendet."
+
+#. type: Plain text
+#: puzzles.but:2937
+msgid ""
+"for each square with a number, that number denotes the total number of white "
+"squares reachable from that square going in a straight line in any "
+"horizontal or vertical direction until hitting a wall or a black square; the "
+"square with the number is included in the total (once)."
+msgstr ""
+"In jedem Quadrat mit einer Zahl gibt diese die Anzahl an weißen Quadraten, "
+"die von diesem Quadrat in jeder geraden (horizontalen oder vertikalen) "
+"Richtung erreicht werden können, an, nach der entweder eine Mauer oder ein "
+"schwarzes Quadrat erreicht wird. Das Quadrat mit der Nummer ist in der Summe "
+"(einmal) enthalten."
+
+#. type: Plain text
+#: puzzles.but:2943
+msgid ""
+"For instance, a square containing the number one must have four black "
+"squares as its neighbours by the last criterion; but then it's impossible "
+"for it to be connected to any outside white square, which violates the "
+"second to last criterion.  So no square will contain the number one."
+msgstr ""
+"Beispielsweise muss ein Quadrat mit der Zahl eins gemäß dem letzten "
+"Kriterium vier schwarze Blöcke als Nachbar haben, allerdings ist es dann "
+"unmöglich, dieses Quadrat mit einem außenstehenden weißen Quadrat zu "
+"verbinden, womit das zweitletzte Kriterium verletzt wird. Daher wird in "
+"keinem Quadrat die Zahl eins auftauchen."
+
+#. type: Plain text
+#: puzzles.but:2947
+msgid ""
+"Credit for this puzzle goes to \\i{Nikoli}, who have variously called it "
+"\\q{Kurodoko}, \\q{Kuromasu} or \\q{Where is Black Cells}.  \\k{nikoli-"
+"range}."
+msgstr ""
+"Dank für dieses Puzzle geht an \\i{Nikoli}, die es verschieden benannt "
+"haben: \\q{Kurodoko}, \\q{Kuromasu} oder \\q{Where is Black Cells}.  "
+"\\k{nikoli-range}."
+
+#. type: Plain text
+#: puzzles.but:2949
+msgid "Range was contributed to this collection by Jonas K\\u00F6{oe}lker."
+msgstr "Range ist ein Beitrag von Jonas K\\u00F6{oe}lker zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:2952
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/where_is_black_cells.html}\\cw{http://"
+"www.nikoli.co.jp/en/puzzles/where_is_black_cells.html}"
+msgstr "\\W{http://www.nikoli.co.jp/en/puzzles/where_is_black_cells.html}\\cw{http://www.nikoli.co.jp/en/puzzles/where_is_black_cells.html}"
+
+#. type: Plain text
+#: puzzles.but:2954
+msgid "\\I{controls, for Range}Range controls"
+msgstr "\\I{Steuerung, von Range}Range-Steuerung"
+
+#. type: Plain text
+#: puzzles.but:2960
+msgid ""
+"Click with the left button to paint a square black, or with the right button "
+"to mark a square with a dot to indicate that you are sure it should \\e{not} "
+"be painted black. Repeated clicking with either button will cycle the square "
+"through the three possible states (filled, dotted or empty) in opposite "
+"directions."
+msgstr ""
+"Durch einen Klick mit der linken Taste färben Sie ein Quadrat schwarz, oder "
+"mit der rechten Taste markieren Sie das Quadrat mit einem Punkt, um "
+"anzuzeigen, dass Sie sich sicher sind, dass es \\e{nicht} schwarz gefärbt "
+"werden soll. Erneutes Klicken mit einem der beiden Tasten wird das Quadrat "
+"zyklisch durch die drei möglichen Zustände (gefüllt, mit Punkt oder leer) in "
+"gegenläufigen Richtungen bringen."
+
+#. type: Plain text
+#: puzzles.but:2966
+msgid ""
+"You can also use the cursor keys to move around the grid squares.  Pressing "
+"Return does the same as clicking with the left button, while pressing Space "
+"does the same as a right button click.  Moving with the cursor keys while "
+"holding Shift will place dots in all squares that are moved through."
+msgstr ""
+"Sie können auch die Pfeiltasten verwenden, um sich auf dem Gitter zu "
+"bewegen. Drücken der Eingabetaste bewirkt das Gleiche wie die linke Taste, "
+"während die Leertaste das Gleiche wie die rechte Taste durchführt. Bewegen "
+"mit den Pfeiltasten während Umschalten gehalten ist wird Punkte in alle "
+"überstriffenen Quadrate setzen."
+
+#. type: Plain text
+#: puzzles.but:2971
+msgid "\\I{parameters, for Range}Range parameters"
+msgstr "\\I{Parameter, für Range}Range-Parameter"
+
+#. type: Plain text
+#: puzzles.but:2980
+msgid "\\i{Pearl}"
+msgstr "\\i{Pearl}"
+
+#. type: Plain text
+#: puzzles.but:2982
+msgid "\\cfg{winhelp-topic}{games.pearl}"
+msgstr "\\cfg{winhelp-topic}{games.pearl}"
+
+#. type: Plain text
+#: puzzles.but:2990
+msgid ""
+"You have a grid of squares. Your job is to draw lines between the centres of "
+"horizontally or vertically adjacent squares, so that the lines form a single "
+"closed loop. In the resulting grid, some of the squares that the loop passes "
+"through will contain corners, and some will be straight horizontal or "
+"vertical lines. (And some squares can be completely empty \\dash the loop "
+"doesn't have to pass through every square.)"
+msgstr ""
+"Sie haben ein Gitter von Quadraten. Ihre Aufgabe besteht darin, Linien "
+"zwischen den Zentren von horizontal oder vertkal benachbarten Quadraten zu "
+"zeichnen, so dass die Linien eine einzige, geschlossene Schleife bilden. In "
+"dem entstehenden Gitter werden einige Quadrate, durch die die Schleife "
+"läuft, Ecken enthalten und andere werden durchgehende horizontale oder "
+"vertikale Linien enthalten. (Und einige Quadrate werden komplett leer sein "
+"\\dash die Schleife muss nicht durch jedes Quadrat laufen.)"
+
+#. type: Plain text
+#: puzzles.but:2993
+msgid ""
+"Some of the squares contain black and white circles, which are clues that "
+"the loop must satisfy."
+msgstr ""
+"Einige der Quadrate enthalten schwarze oder weiße Kreise. Dies sind "
+"Hinweise, die die Schleife berücksichtigen muss."
+
+#. type: Plain text
+#: puzzles.but:2996
+msgid ""
+"A black circle in a square indicates that that square is a corner, but "
+"neither of the squares adjacent to it in the loop is also a corner."
+msgstr ""
+"Ein schwarzer Kreis in einem Quadrat zeigt an, dass dieses Quadrat eine Ecke "
+"darstellt, dass aber keiner der benachbarten Quadrate in der Schleife auch "
+"eine Ecke ist."
+
+#. type: Plain text
+#: puzzles.but:2999
+msgid ""
+"A white circle indicates that the square is a straight edge, but \\e{at "
+"least one} of the squares adjacent to it in the loop is a corner."
+msgstr ""
+"Ein weißer Kreis zeigt an, dass das Quadrat eine gerade Kante darstellt, "
+"aber \\e{mindestens eins} der benachbarten Quadrate in der Schleife eine "
+"Ecke ist."
+
+#. type: Plain text
+#: puzzles.but:3004
+msgid ""
+"(In both cases, the clue only constrains the two squares adjacent \\e{in the "
+"loop}, that is, the squares that the loop passes into after leaving the clue "
+"square. The squares that are only adjacent \\e{in the grid} are not "
+"constrained.)"
+msgstr ""
+"(In beiden Fällen beschränkt der Hinweis nur die zwei Quadrate, die \\e{in "
+"der Schleife} benachbart sind, d.h. die Quadrate, durch die die Schleife "
+"läuft, nachdem sie das Hinweisquadrat verlässt. Die Quadrate, die nur \\e{im "
+"Gitter} benachbart sind, sind nicht eingeschränkt.)"
+
+#. type: Plain text
+#: puzzles.but:3007
+msgid ""
+"Credit for this puzzle goes to \\i{Nikoli}, who call it \\q{Masyu}.  "
+"\\k{nikoli-pearl}"
+msgstr ""
+"Dank für dieses Puzzle geht an \\i{Nikoli}, die es \\q{Masyu} nennen. "
+"\\k{nikoli-pearl}"
+
+#. type: Plain text
+#: puzzles.but:3009
+msgid "Thanks to James Harvey for assistance with the implementation."
+msgstr "Dank an James Harvey für Hilfe bei der Implementierung."
+
+#. type: Plain text
+#: puzzles.but:3013
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/masyu.html}\\cw{http://www.nikoli.co."
+"jp/en/puzzles/masyu.html} (beware of Flash)"
+msgstr ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/masyu.html}\\cw{http://www.nikoli.co."
+"jp/en/puzzles/masyu.html} (Achtung Flash)"
+
+#. type: Plain text
+#: puzzles.but:3015
+msgid "\\I{controls, for Pearl}Pearl controls"
+msgstr "\\I{Steuerung, von Pearl}Pearl-Steuerung"
+
+#. type: Plain text
+#: puzzles.but:3018
+msgid ""
+"Click with the left button on a grid edge to draw a segment of the loop "
+"through that edge, or to remove a segment once it is drawn."
+msgstr ""
+"Klicken Sie mit der linke Maustaste auf eine Gitterkante, um einen Abschnitt "
+"der Schleife durch diese Kante zu zeichnen oder ein Segment zu entfernen, "
+"sobald es gezeichnet wurde."
+
+#. type: Plain text
+#: puzzles.but:3023
+msgid ""
+"Drag with the left button through a series of squares to draw more than one "
+"segment of the loop in one go. Alternatively, drag over an existing part of "
+"the loop to undraw it, or to undraw part of it and then go in a different "
+"direction."
+msgstr ""
+"Ziehen Sie mit der linken Maustaste durch eine Reihe von Quadraten, um mehr "
+"als einen Abschnitt der Schleife auf einmal zu zeichnen. Alternativ ziehen "
+"Sie Ã¼ber einen bestehenden Teil der Schleife, um die Zeichnung zu entfernen "
+"oder einen Teil zu entfernen und in eine neue Richtung zu zeichnen."
+
+#. type: Plain text
+#: puzzles.but:3029
+msgid ""
+"Click with the right button on a grid edge to mark it with a cross, "
+"indicating that you are sure the loop does not go through that edge.  (For "
+"instance, if you have decided which of the squares adjacent to a white clue "
+"has to be a corner, but don't yet know which way the corner turns, you might "
+"mark the one way it \\e{can't} go with a cross.)"
+msgstr ""
+"Klicken Sie mit der rechten Maustaste auf eine Gitterkante, um sie mit einem "
+"Kreuz zu markieren, womit Sie anzeigen, dass Sie sich sicher sind, dass die "
+"Schleife nicht durch diese Kante geht. (Falls Sie sich beispielsweise "
+"entschieden haben, welches der benachbarten Quadrate von einem weißen "
+"Hinweis eine Ecke sein muss, Sie aber noch nicht wissen, in welche Richtung "
+"die Ecke orientiert ist, können Sie die Richtung, in die sie \\e{nicht} "
+"gehen kann, mit einem Kreuz markieren.)"
+
+#. type: Plain text
+#: puzzles.but:3035
+msgid ""
+"Alternatively, use the cursor keys to move the cursor.  Use the Enter key to "
+"begin and end keyboard \\q{drag} operations.  Use the Space, Escape or "
+"Backspace keys to cancel the drag.  Or, hold Control while dragging with the "
+"cursor keys to toggle segments as you move between squares."
+msgstr ""
+"Sie können alternativ die Pfeiltasten zur Bewegung des Cursors benutzen. Um "
+"»Ziehen«-Aktionen per Tastatur zu beginnen oder zu beenden, drücken Sie auf "
+"die Eingabetaste. Mit der Leertaste, Escape oder Rückschritt brechen Sie das "
+"Ziehen ab. Oder halten Sie Strg, während Sie mit den Pfeiltasten ziehen, um "
+"Segmente umzuschalten, während Sie sich zwischen Quadraten bewegen."
+
+#. type: Plain text
+#: puzzles.but:3038
+msgid ""
+"Pressing Control-Shift-arrowkey or Shift-arrowkey simulates a left or right "
+"click, respectively, on the edge in the direction of the key."
+msgstr ""
+"Durch Drücken von Strg-Umschalt-Pfeiltaste oder Umschalt-Pfeiltaste wird ein "
+"Rechts- bzw. ein Linksklick an der Kante in der Richtung der Pfeiltaste "
+"simuliert."
+
+#. type: Plain text
+#: puzzles.but:3042
+msgid "\\I{parameters, for Pearl}Pearl parameters"
+msgstr "\\I{Parameter, für Pearl}Pearl-Parameter"
+
+#. type: Plain text
+#: puzzles.but:3047
+msgid "\\i{Undead}"
+msgstr "\\i{Undead}"
+
+#. type: Plain text
+#: puzzles.but:3049
+msgid "\\cfg{winhelp-topic}{games.undead}"
+msgstr "\\cfg{winhelp-topic}{games.undead}"
+
+#. type: Plain text
+#: puzzles.but:3053
+msgid ""
+"You are given a grid of squares, some of which contain diagonal mirrors. "
+"Every square which is not a mirror must be filled with one of three types of "
+"undead monster: a ghost, a vampire, or a zombie."
+msgstr ""
+"Sie bekommen ein Gitter von Quadraten, von denen einige diagonale Spiegel "
+"enthalten. Jedes Quadrat, das kein Spiegel ist, muss mit einer von drei "
+"Arten von untoten Monstern gefüllt werden: einem Geist, einem Vampir oder "
+"einem Zombie."
+
+#. type: Plain text
+#: puzzles.but:3058
+msgid ""
+"Vampires can be seen directly, but are invisible when reflected in mirrors. "
+"Ghosts are the opposite way round: they can be seen in mirrors, but are "
+"invisible when looked at directly. Zombies are visible by any means."
+msgstr ""
+"Vampire können direkt gesehen werden, sind aber beim Spiegeln im Spiegel "
+"unsichtbar. Bei Geistern ist es genau andersherum: sie können in Spiegeln "
+"gesehen werden, aber sind beim direkten Anschauen unsichtbar. Zombies sind "
+"auf beide Arten sichtbar."
+
+#. type: Plain text
+#: puzzles.but:3066
+msgid ""
+"You are also told the total number of each type of monster in the grid. Also "
+"around the edge of the grid are written numbers, which indicate how many "
+"monsters can be seen if you look into the grid along a row or column "
+"starting from that position. (The diagonal mirrors are reflective on both "
+"sides. If your reflected line of sight crosses the same monster more than "
+"once, the number will count it each time it is visible, not just once.)"
+msgstr ""
+"Ihnen wird auch die Gesamtanzahl von jeder Art von Monster im Gitter "
+"mitgeteilt. Auch entlang der Ecken des Gitters sind Zahlen geschrieben, die "
+"angeben, wie viele Monster gesehen werden können, falls Sie in das Gitter "
+"entlang einer Spalte oder Zeile, beginnend von dieser Position, schauen. "
+"(Die diagonalen Spiegel reflektieren nach beiden Seiten. Falls Ihre "
+"reflektierte Sichtlinie das selbe Monster mehr als einmal kreuzt, wird es in "
+"der Zahl jedes Mal gezählt, wenn es sichtbar ist, nicht nur einmal.)"
+
+#. type: Plain text
+#: puzzles.but:3069
+msgid ""
+"This puzzle type was invented by David Millar, under the name \\q{Haunted "
+"Mirror Maze}. See \\k{janko-undead} for more details."
+msgstr ""
+"Dieses Puzzle wurde von David Millar unter dem Namen \\q{Haunted Mirror "
+"Maze} erfunden. Siehe \\k{janko-undead} für weitere Details."
+
+#. type: Plain text
+#: puzzles.but:3071
+msgid "Undead was contributed to this collection by Steffen Bauer."
+msgstr "Unruly ist ein Beitrag von Steffen Bauer zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:3074
+msgid ""
+"\\W{http://www.janko.at/Raetsel/Spukschloss/index.htm}\\cw{http://www.janko."
+"at/Raetsel/Spukschloss/index.htm}"
+msgstr ""
+"\\W{http://www.janko.at/Raetsel/Spukschloss/index.htm}\\cw{http://www.janko."
+"at/Raetsel/Spukschloss/index.htm}"
+
+#. type: Plain text
+#: puzzles.but:3076
+msgid "\\I{controls, for Undead}Undead controls"
+msgstr "\\I{Steuerung, von Undead}Undead-Steuerung"
+
+#. type: Plain text
+#: puzzles.but:3078
+msgid "Undead has a similar control system to Solo, Unequal and Keen."
+msgstr "Undead hat ein Ã¤hnliches Steuersystem wie Solo, Unequal und Keen."
+
+#. type: Plain text
+#: puzzles.but:3084
+msgid ""
+"To play Undead, click the mouse in any empty square and then type a letter "
+"on the keyboard indicating the type of monster: \\q{G} for a ghost, \\q{V} "
+"for a vampire, or \\q{Z} for a zombie. If you make a mistake, click the "
+"mouse in the incorrect square and press Space to clear it again (or use the "
+"Undo feature)."
+msgstr ""
+"Um Undead zu spielen, klicken Sie mit der Maus in ein leeres Quadrat und "
+"geben dann auf der Tastatur einen Buchstaben ein, der die Art des Monsters "
+"anzeigt: \\q{G} für einen Geist, \\q{V} für einen Vampir oder \\q{Z} für "
+"einen Zombie. Falls Sie einen Fehler machen, klicken Sie mit der Maus in das "
+"fehlerhafte Quadrat und drücken die Leertaste, um das Quadrat wieder zu "
+"bereinigen (oder verwenden Sie die Funktion Â»Undo«)."
+
+#. type: Plain text
+#: puzzles.but:3090
+msgid ""
+"If you \\e{right}-click in a square and then type a letter, the "
+"corresponding monster will be shown in reduced size in that square, as a "
+"\\q{pencil mark}. You can have pencil marks for multiple monsters in the "
+"same square. A square containing a full-size monster cannot also contain "
+"pencil marks."
+msgstr ""
+"Falls Sie \\e{rechts} in ein Quadrat klicken und dann einen Buchstaben "
+"eingeben, wird das entsprechende Monster als \\q{Bleistiftmarkierung} in "
+"einer reduzierten Größe in diesem Quadrat angezeigt. Sie können "
+"Bleistiftmarkierungen für mehrere Monster im gleichen Quadrat vornehmen. Ein "
+"Quadrat, das ein komplettes Monster enthält, kann nicht gleichzeitig auch "
+"Bleistiftmarkierungen enthalten."
+
+#. type: Plain text
+#: puzzles.but:3096
+msgid ""
+"The game pays no attention to pencil marks, so exactly what you use them for "
+"is up to you: you can use them as reminders that a particular square needs "
+"to be re-examined once you know more about a particular monster, or you can "
+"use them as lists of the possible monster in a given square, or anything "
+"else you feel like."
+msgstr ""
+"Das Spiel berücksichtigt Bleistiftmarkierungen Ã¼berhaupt nicht. Daher steht "
+"Ihnen frei, sie beliebig zu verwenden: Sie können Sie als Erinnerungsstütze "
+"verwenden, dass ein Quadrat noch einmal genau untersucht werden muss, wenn "
+"Sie mehr Ã¼ber ein bestimmtes Monster wissen, oder Sie können Sie als Liste "
+"möglicher Monster in einem bestimmten Quadrat verwenden, oder für etwas "
+"anderes nach Ihrer Wahl."
+
+#. type: Plain text
+#: puzzles.but:3099
+msgid ""
+"To erase a single pencil mark, right-click in the square and type the same "
+"letter again."
+msgstr ""
+"Um eine Bleistiftmarkierung zu löschen, klicken Sie rechts in ein Quadrat "
+"und geben den gleichen Buchstaben erneut ein."
+
+#. type: Plain text
+#: puzzles.but:3103
+msgid ""
+"All pencil marks in a square are erased when you left-click and type a "
+"monster letter, or when you left-click and press Space. Right-clicking and "
+"pressing space will also erase pencil marks."
+msgstr ""
+"Alle Bleistiftmarkierungen in einem Quadrat werden gelöscht, wenn Sie "
+"linksklicken und einen Monsterbuchstaben eingeben oder wenn Sie linksklicken "
+"und die Leertaste drücken. Auch Rechtsklicken und Drücken der Leertaste wird "
+"die Bleistiftmarkierungen löschen."
+
+#. type: Plain text
+#: puzzles.but:3109
+msgid ""
+"As for Solo, the cursor keys can be used in conjunction with the letter keys "
+"to place monsters or pencil marks. Use the cursor keys to move a highlight "
+"around the grid, and type a monster letter to enter it in the highlighted "
+"square. Pressing return toggles the highlight into a mode in which you can "
+"enter or remove pencil marks."
+msgstr ""
+"Wie bei Solo können die Pfeiltasten zusammen mit den Buchstabentasten "
+"verwendet werden, um Monster oder Bleistiftmarkierungen zu setzen. Verwenden "
+"Sie die Pfeiltasten, um eine Hervorhebung Ã¼ber das Gitter zu bewegen und "
+"geben Sie einen Monsterbuchstaben in das hervorgehobene Quadrat ein. Durch "
+"Drücken der Eingabetaste schalten Sie in einen Modus um, in dem Sie statt "
+"der Hervorhebung Bleistiftmarkierungen eingeben oder entfernen können."
+
+#. type: Plain text
+#: puzzles.but:3113
+msgid ""
+"If you prefer plain letters of the alphabet to cute monster pictures, you "
+"can press \\q{A} to toggle between showing the monsters as monsters or "
+"showing them as letters."
+msgstr ""
+"Falls Sie einfache Buchstaben des Alphabets gegenüber netten Monsterbildern "
+"bevorzugen, können Sie \\q{A} eingeben, um zwischen der Anzeige der Monster "
+"als Monster und der Anzeige als Buchstaben umzuschalten."
+
+#. type: Plain text
+#: puzzles.but:3120
+msgid "\\I{parameters, for Undead}Undead parameters"
+msgstr "\\I{Parameter, für Undead}Undead-Parameter"
+
+#. type: Plain text
+#: puzzles.but:3133
+msgid "\\i{Unruly}"
+msgstr "\\i{Unruly}"
+
+#. type: Plain text
+#: puzzles.but:3135
+msgid "\\cfg{winhelp-topic}{games.unruly}"
+msgstr "\\cfg{winhelp-topic}{games.unruly}"
+
+#. type: Plain text
+#: puzzles.but:3141
+msgid ""
+"You are given a grid of squares, which you must colour either black or "
+"white. Some squares are provided as clues; the rest are left for you to fill "
+"in. Each row and column must contain the same number of black and white "
+"squares, and no row or column may contain three consecutive squares of the "
+"same colour."
+msgstr ""
+"Sie bekommen ein Gitter von Quadraten, die Sie entweder schwarz oder weiß "
+"färben müssen. Einige Quadrate werden als Tipps bereitgestellt, der Rest "
+"bleibt Ihnen zum Ausfüllen Ã¼brig. Jede Zeile und Spalte muss die gleiche "
+"Anzahl an schwarzen und weißen Quadraten enthalten und in keiner Spalte oder "
+"Zeile darf die gleiche Farbe in drei hintereinanderfolgenden Quadraten "
+"vorkommen."
+
+#. type: Plain text
+#: puzzles.but:3144
+msgid ""
+"This puzzle type was invented by Adolfo Zanellati, under the name \\q{Tohu "
+"wa Vohu}. See \\k{janko-unruly} for more details."
+msgstr ""
+"Dieser Puzzletyp wurde von Adolfo Zanellati unter dem Namen  \\q{Tohu wa "
+"Vohu} erfunden. Siehe \\k{janko-unruly} für weitere Details."
+
+#. type: Plain text
+#: puzzles.but:3146
+msgid "Unruly was contributed to this collection by Lennard Sprong."
+msgstr "Unruly ist ein Beitrag von Lennard Sprong zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:3149
+msgid ""
+"\\W{http://www.janko.at/Raetsel/Tohu-Wa-Vohu/index.htm}\\cw{http://www.janko."
+"at/Raetsel/Tohu-Wa-Vohu/index.htm}"
+msgstr ""
+"\\W{http://www.janko.at/Raetsel/Tohu-Wa-Vohu/index.htm}\\cw{http://www.janko."
+"at/Raetsel/Tohu-Wa-Vohu/index.htm}"
+
+#. type: Plain text
+#: puzzles.but:3151
+msgid "\\I{controls, for Unruly}Unruly controls"
+msgstr "\\I{Steuerung, von Unruly}Unruly-Steuerung"
+
+#. type: Plain text
+#: puzzles.but:3157
+msgid ""
+"To play Unruly, click the mouse in a square to change its colour.  Left-"
+"clicking an empty square will turn it black, and right-clicking will turn it "
+"white. Keep clicking the same button to cycle through the three possible "
+"states for the square. If you middle-click in a square it will be reset to "
+"empty."
+msgstr ""
+"Um Unruly zu spielen, klicken Sie mit der Maus in ein Quadrat, um seine "
+"Farbe zu Ã¤ndern. Linksklicken in ein leeres Quadrat wird dieses schwarz "
+"färben und Rechtsklicken wird es weiß färben. Durch erneutes Drücken des "
+"gleichen Knopfes werden der Reihe nach die drei möglichen Stati für das "
+"Quadrat erreicht. Falls Sie ein Quadrat Mittelklicken, wird es auf den "
+"leeren Zustand zurückgesetzt."
+
+#. type: Plain text
+#: puzzles.but:3162
+msgid ""
+"You can also use the cursor keys to move around the grid. Pressing the "
+"return or space keys will turn an empty square black or white respectively "
+"(and then cycle the colours in the same way as the mouse buttons), and "
+"pressing Backspace will reset a square to empty."
+msgstr ""
+"Sie können auch die Pfeiltasten verwenden, um sich auf dem Gitter zu "
+"bewegen. Durch Drücken der Eingabe- oder Leertaste wird ein leeres Quadrat "
+"schwarz oder respektive weiß gefärbt (und dann zyklisch die Farben wie bei "
+"den Maustasten Ã¤ndern) und durch Drücken der Rücktaste wird ein Quadrat auf "
+"leer zurückgesetzt."
+
+#. type: Plain text
+#: puzzles.but:3166
+msgid "\\I{parameters, for Unruly}Unruly parameters"
+msgstr "\\I{Parameter, für Unruly}Unruly-Parameter"
+
+#. type: Plain text
+#: puzzles.but:3174
+msgid ""
+"Size of grid in squares. (Note that the rules of the game require both the "
+"width and height to be even numbers.)"
+msgstr ""
+"Größe des Gitters in Quadraten (Beachten Sie, dass die Regeln des Spiels "
+"verlangen, dass sowohl die Breite als auch die Höhe gerade Zahlen sind.)"
+
+#. type: e{#1}
+#: puzzles.but:3180
+msgid "Unique rows and columns"
+msgstr "Eindeutige Zeilen und Spalten"
+
+#. type: Plain text
+#: puzzles.but:3183
+msgid ""
+"If enabled, no two rows are permitted to have exactly the same pattern, and "
+"likewise columns. (A row and a column can match, though.)"
+msgstr ""
+"Falls aktiviert, dürfen keine zwei Zeilen Ã¼ber das gleiche Muster verfügen "
+"und entsprechendes bei den Spalten. (Eine Spalte und eine Zeile können "
+"allerdings Ã¼bereinstimmen.)"
+
+#. type: Plain text
+#: puzzles.but:3185
+msgid "\\i{Flood}"
+msgstr "\\i{Flood}"
+
+#. type: Plain text
+#: puzzles.but:3187
+msgid "\\cfg{winhelp-topic}{games.flood}"
+msgstr "\\cfg{winhelp-topic}{games.flood}"
+
+#. type: Plain text
+#: puzzles.but:3194
+msgid ""
+"You are given a grid of squares, coloured at random in multiple colours. In "
+"each move, you can flood-fill the top left square in a colour of your choice "
+"(i.e. every square reachable from the starting square by an orthogonally "
+"connected path of squares all the same colour will be filled in the new "
+"colour). As you do this, more and more of the grid becomes connected to the "
+"starting square."
+msgstr ""
+"Sie erhalten ein Gitter von Quadraten, die zufällig in mehreren Farben "
+"eingefärbt sind. Bei jedem Zug können Sie durch Fluten das Quadrat in der "
+"oberen linken Ecke mit einer Farbe Ihrer Wahl füllen (d.h. jedes Quadrat, das "
+"vom Startquadrat durch einen orthogonal verbundenen Pfad von Quadraten der "
+"gleichen Farbe verbunden ist, wird mit der neuen Farbe gefüllt). Dadurch wird "
+"schrittweise mehr und mehr des Gitters mit dem Startquadrat verbunden."
+
+#. type: Plain text
+#: puzzles.but:3199
+msgid ""
+"Your aim is to make the whole grid the same colour, in as few moves as "
+"possible. The game will set a limit on the number of moves, based on running "
+"its own internal solver. You win if you can make the whole grid the same "
+"colour in that many moves or fewer."
+msgstr ""
+"Ihr Ziel besteht darin, das gesamte Gitter mit so wenig Zügen wie möglich in "
+"eine Farbe zu verwandeln. Das Spiel setzt eine Grenze an Zügen, basierend auf "
+"seinem internen Lösungsalgorithmus. Sie gewinnen, falls Sie das Gitter mit "
+"dieser Anzahl (oder weniger) an Zügen in die gleiche Farbe umwandeln."
+
+#. type: Plain text
+#: puzzles.but:3202
+msgid ""
+"I saw this game (with a fixed grid size, fixed number of colours, and fixed "
+"move limit) at http://floodit.appspot.com (no longer accessible)."
+msgstr ""
+"Ich habe dieses Spiel (mit einer festen Gittergröße, festen Anzahl an Farben "
+"und festen Anzahl an Zügen) unter http://floodit.appspot.com (nicht mehr "
+"erreichbar) gesehen."
+
+#. type: Plain text
+#: puzzles.but:3204
+msgid "\\I{controls, for Flood}Flood controls"
+msgstr "\\I{Steuerung, für Flood}Flood-Steuerung"
+
+#. type: Plain text
+#: puzzles.but:3209
+msgid ""
+"To play Flood, click the mouse in a square. The top left corner and "
+"everything connected to it will be flood-filled with the colour of the "
+"square you clicked. Clicking a square the same colour as the top left corner "
+"has no effect, and therefore does not count as a move."
+msgstr ""
+"Um Flood zu spielen, klicken Sie mit der Maus in ein Quadrat. Die obere linke "
+"Ecke und alles damit verbundene wird mit der gleichen Farbe wie das von Ihnen "
+"angeklickte Quadrat geflutet. Das Klicken auf ein Quadrat mit der gleichen "
+"Farbe wie die obere linke Ecke hat keinen Effekt und zählt daher nicht als "
+"Spielzug."
+
+#. type: Plain text
+#: puzzles.but:3213
+msgid ""
+"You can also use the cursor keys to move a cursor (outline black square) "
+"around the grid. Pressing the return key will fill the top left corner in "
+"the colour of the square under the cursor."
+msgstr ""
+"Sie können auch die Pfeiltasten verwenden, um den Cursor (ein leeres "
+"schwarzes Quadrat) Ã¼ber das Gitter zu bewegen. Drücken der Eingabetaste "
+"füllt die obere linke Ecke mit der gleichen Farbe wie das Quadrat unter dem "
+"Cursor."
+
+#. type: Plain text
+#: puzzles.but:3217
+msgid "\\I{parameters, for Flood}Flood parameters"
+msgstr "\\I{Parameter, für Flood}Flood-Parameter"
+
+#. type: Plain text
+#: puzzles.but:3224 puzzles.but:3288
+msgid "Size of the grid, in squares."
+msgstr "Größe des Gitters, in Quadraten."
+
+#. type: Plain text
+#: puzzles.but:3230
+msgid ""
+"Number of colours used to fill the grid. Must be at least 3 (with two "
+"colours there would only be one legal move at any stage, hence no choice to "
+"make at all), and at most 10."
+msgstr ""
+"Anzahl an Farben, die zum Füllen des Gitters verwandt werden. Muss mindestens "
+"3 sein (bei zwei Farben gäbe es bei jeder Stufe nur einen gültigen Zug und "
+"somit keine zu treffende Auswahl) und höchstens 10."
+
+#. type: e{#1}
+#: puzzles.but:3232
+msgid "Extra moves permitted"
+msgstr "Extra moves permitted"
+
+#. type: Plain text
+#: puzzles.but:3239
+msgid ""
+"Controls the difficulty of the puzzle, by increasing the move limit. In each "
+"new grid, Flood will run an internal solver to generate its own solution, "
+"and then the value in this field will be added to the length of Flood's "
+"solution to generate the game's move limit. So a value of 0 requires you to "
+"be just as efficient as Flood's automated solver, and a larger value makes "
+"it easier."
+msgstr ""
+"Steuert die Schwierigkeit des Puzzles durch Erhöhung der Zugbegrenzung. In "
+"jedem neuen Gitter lässt Flood ein internes Lösungsprogramm laufen, um seine "
+"eigene Lösung zu erstellen und dann wird der Wert in diesem Feld zu der Länge "
+"der Lösung von Flood hinzuaddiert, um die Spielzugbegrenzung zu erstellen. "
+"Ein Wert von 0 verlangt daher von Ihnen, so effizient wie der automatische "
+"Lösungsfinder von Flood zu sein und ein größerer Wert erleichtert es."
+
+#. type: Plain text
+#: puzzles.but:3248
+msgid ""
+"(Note that Flood's internal solver will not necessarily find the shortest "
+"possible solution, though I believe it's pretty close. For a real challenge, "
+"set this value to 0 and then try to solve a grid in \\e{strictly fewer} "
+"moves than the limit you're given!)"
+msgstr ""
+"(Beachten Sie, dass das interne Lösungsprogramm von Flood nicht "
+"notwendigerweise die kürzeste mögliche Lösung findet, obwohl ich annehme, "
+"dass es ziemlich nahe dran ist. Für eine echte Herausforderung setzen Sie "
+"diesen Wert auf 0 und versuchen dann, ein Gitter in \\e{echt weniger} Zügen "
+"zu lösen, als Ihnen vorgegeben werden!)"
+
+#. type: Plain text
+#: puzzles.but:3250
+msgid "\\i{Tracks}"
+msgstr "\\i{Tracks}"
+
+#. type: Plain text
+#: puzzles.but:3252
+msgid "\\cfg{winhelp-topic}{games.tracks}"
+msgstr "\\cfg{winhelp-topic}{games.tracks}"
+
+#. type: Plain text
+#: puzzles.but:3257
+msgid ""
+"You are given a grid of squares, some of which are filled with train tracks. "
+"You need to complete the track from A to B so that the rows and columns "
+"contain the same number of track segments as are indicated in the clues to "
+"the top and right of the grid."
+msgstr ""
+"Sie erhalten ein Gitter von Quadraten von denen einige mit Gleisen von Zügen "
+"gefüllt sind. Sie müssen die Gleise von A nach B so vervollständigen, dass "
+"die Zeilen und Spalten die gleiche Anzahl von Gleissegmenten enthalten, wie "
+"dies in den Hilfestellungen oben und rechts vom Gitter angegeben ist."
+
+#. type: Plain text
+#: puzzles.but:3260
+msgid ""
+"There are only straight and 90 degree curved rails, and the track may not "
+"cross itself."
+msgstr ""
+"Es gibt nur gerade und 90° gebogene Schienen und die Gleise dürfen sich nicht "
+"selbst kreuzen."
+
+#. type: Plain text
+#: puzzles.but:3262
+msgid "Tracks was contributed to this collection by James Harvey."
+msgstr "Tracks ist ein Beitrag von James Harvey zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:3264
+msgid "\\I{controls, for Tracks}Tracks controls"
+msgstr "\\I{Steuerungen, für Tracks}Tracks-Steuerungen"
+
+#. type: Plain text
+#: puzzles.but:3268
+msgid ""
+"Left-clicking on an edge between two squares adds a track segment between "
+"the two squares. Right-clicking on an edge adds a cross on the edge, "
+"indicating no track is possible there."
+msgstr ""
+"Durch Linksklick auf eine Kante zwischen zwei Quadraten wird ein "
+"Gleissgement zwischen den zwei Quadraten hinzugefügt. Durch Rechtsklick wird "
+"ein Kreuz auf der Kante hinzugefügt, das anzeigt, dass hier kein Gleis "
+"möglich ist."
+
+#. type: Plain text
+#: puzzles.but:3273
+msgid ""
+"Left-clicking in a square adds a colour indicator showing that you know the "
+"square must contain a track, even if you don't know which edges it crosses "
+"yet. Right-clicking in a square adds a cross indicating it contains no track "
+"segment."
+msgstr ""
+"Durch Linksklick auf ein Quadrat wird eine Farbanzeige hinzugefügt, die "
+"zeigt, dass Sie wissen, dass das Quadrat ein Gleis enthalten muss, selbst "
+"wenn Sie noch nicht wissen, Ã¼ber welche Kante es läuft. Durch Rechtsklick in "
+"ein Quadrat wird ein Kreuz hinzugefügt, das angibt, dass es kein Gleissgement "
+"enthält."
+
+#. type: Plain text
+#: puzzles.but:3277
+msgid ""
+"Left- or right-dragging between squares allows you to lay a straight line of "
+"is-track or is-not-track indicators, useful for filling in rows or columns "
+"to match the clue."
+msgstr ""
+"Links- oder Rechts-Ziehen zwischen Quadraten erlaubt es Ihnen, eine gerade "
+"Linie von Schienen-existieren- oder Schienen-existieren-nicht-Anzeigen zu "
+"legen. Dies ist nützlich, um Zeilen oder Spalten auf den Hinweis anzupassen."
+
+#. type: Plain text
+#: puzzles.but:3281
+msgid "\\I{parameters, for Tracks}Tracks parameters"
+msgstr "\\I{Parameter, für Tracks}Tracks-Parameter"
+
+#. type: Plain text
+#: puzzles.but:3294
+msgid ""
+"Controls the difficulty of the generated puzzle: at Tricky level, you are "
+"required to make more deductions regarding disregarding moves that would "
+"lead to impossible crossings later."
+msgstr ""
+"Steuert die Schwierigkeit des erstellten Puzzles: bei der Stufe Â»Tricky« "
+"müssen Sie schwierigere Schlussfolgerungen in Bezug auf Züge machen, die "
+"später zu unmöglichen Kreuzungen führen könnten."
+
+#. type: e{#1}
+#: puzzles.but:3296
+msgid "Disallow consecutive 1 clues"
+msgstr "Disallow consecutive 1 clues"
+
+#. type: Plain text
+#: puzzles.but:3303
+msgid ""
+"Controls whether the Tracks game generation permits two adjacent rows or "
+"columns to have a 1 clue, or permits the row or column of the track's "
+"endpoint to have a 1 clue. By default this is not permitted, to avoid long "
+"straight boring segments of track and make the games more twiddly and "
+"interesting. If you want to restore the possibility, turn this option off."
+msgstr ""
+"Steuert, ob es die Spielerzeugung von Tracks zwei benachbarten Zeilen oder "
+"Spalten erlaubt, genau einen Hinweis zu haben oder es der Zeile oder Spalte "
+"der Endpunkte der Gleise erlaubt, genau einen Hinweis zu tragen. "
+"Standardmäßig ist dies nicht erlaubt, um lange gerade und langweilige "
+"Gleissegmente zu vermeiden und das Spiel fummeliger und interessanter zu "
+"gestalten. Falls Sie diese Möglichkeit wieder erlauben wollen, schalten Sie "
+"diese Option aus."
+
+#. type: Plain text
+#: puzzles.but:3306
+msgid "\\i{Palisade}"
+msgstr "\\i{Palisade}"
+
+#. type: Plain text
+#: puzzles.but:3308
+msgid "\\cfg{winhelp-topic}{games.palisade}"
+msgstr "\\cfg{winhelp-topic}{games.palisade}"
+
+#. type: Plain text
+#: puzzles.but:3314
+msgid ""
+"You're given a grid of squares, some of which contain numbers.  Your goal is "
+"to subdivide the grid into contiguous regions, all of the same (given) size, "
+"such that each square containing a number is adjacent to exactly that many "
+"edges (including those between the inside and the outside of the grid)."
+msgstr ""
+"Sie erhalten ein Gitter von Quadraten, von denen einige Zahlen enthalten. Ihr "
+"Ziel besteht darin, das Gitter in zusammenhängende Regionen zu zerteilen, die "
+"alle die gleiche (vorgegebene) Größe haben, so dass jedes Quadrat, das eine "
+"Nummer trägt, zu genau dieser Anzahl an Kanten benachbart ist (dazu gehören "
+"auch solche zwischen der Innenseite und der Außenseite des Gitters)."
+
+#. type: Plain text
+#: puzzles.but:3317
+msgid ""
+"Credit for this puzzle goes to \\i{Nikoli}, who call it \\q{Five Cells}.  "
+"\\k{nikoli-palisade}."
+msgstr ""
+"Der Dank für dieses Puzzle geht an \\i{Nikoli}, die es \\q{Five Cells} "
+"nennen. \\k{nikoli-palisade}."
+
+#. type: Plain text
+#: puzzles.but:3319
+msgid "Palisade was contributed to this collection by Jonas K\\u00F6{oe}lker."
+msgstr "Palisade ist ein Beitrag von Jonas K\\u00F6{oe}lker zu dieser Sammlung."
+
+#. type: Plain text
+#: puzzles.but:3322
+msgid ""
+"\\W{http://nikoli.co.jp/en/puzzles/five_cells.html}\\cw{http://nikoli.co.jp/"
+"en/puzzles/five_cells.html}"
+msgstr "\\W{http://www.nikoli.co.jp/en/puzzles/five_cells.html}\\cw{http://www.nikoli.co.jp/en/puzzles/five_cells.html}"
+
+#. type: Plain text
+#: puzzles.but:3324
+msgid "\\I{controls, for Palisade}Palisade controls"
+msgstr "\\I{Steuerungen, für Palisade}Palisade-Steuerungen"
+
+#. type: Plain text
+#: puzzles.but:3330
+msgid ""
+"Left-click to place an edge.  Right-click to indicate \\q{no edge}.  "
+"Alternatively, the arrow keys will move a keyboard cursor.  Holding Control "
+"while pressing an arrow key will place an edge.  Press Shift-arrowkey to "
+"switch off an edge.  Repeat an action to perform its inverse."
+msgstr ""
+"Durch Linksklick setzen Sie eine Kante. Rechtsklick zeigt \\q{keine Kante} "
+"an. Alternativ können die Pfeiltasten einen Tastatur-Cursor bewegen. Wird "
+"Strg während der Pfeiltasten gedrückt, wird eine Kante gesetzt. Umschalt-"
+"Pfeiltaste schaltet eine Kante aus. Wiederholen Sie eine Aktion, um ihr "
+"Gegenteil auszulösen."
+
+#. type: Plain text
+#: puzzles.but:3334
+msgid "\\I{parameters, for Palisade}Palisade parameters"
+msgstr "\\I{Parameter, für Palisade}Palisade-Parameter"
+
+#. type: e{#1}
+#: puzzles.but:3343
+msgid "Region size"
+msgstr "Region size"
+
+#. type: Plain text
+#: puzzles.but:3345
+msgid "The size of the regions into which the grid must be subdivided."
+msgstr "Die Größe der Regionen, in die das Gitter zerteilt werden muss."
+
+#. type: Plain text
+#: puzzles.but:3347
+msgid "\\I{MIT licence}\\ii{Licence}"
+msgstr "\\I{MIT-Lizenz}\\ii{Lizenz}"
+
+#. type: Plain text
+#: puzzles.but:3349
+msgid "This software is \\i{copyright} 2004-2014 Simon Tatham."
+msgstr ""
+"Diese Software ist \\i{copyright} 2004-2014 Simon Tatham. Im Zweifelsfall "
+"gilt das englische Original dieser Lizenzbedingungen, obwohl die Ãœbersetzung "
+"nach bestem Wissen und Gewissen erstellt wurde."
+
+#. type: Plain text
+#: puzzles.but:3353
+msgid ""
+"Portions copyright Richard Boulton, James Harvey, Mike Pinna, Jonas K"
+"\\u00F6{oe}lker, Dariusz Olszewski, Michael Schierl, Lambros Lambrou, Bernd "
+"Schmidt, Steffen Bauer, Lennard Sprong and Rogier Goossens."
+msgstr ""
+"Urheberrechte in Teilen bei Richard Boulton, James Harvey, Mike Pinna, Jonas "
+"K\\u00F6{oe}lker, Dariusz Olszewski, Michael Schierl, Lambros Lambrou und "
+"Bernd Schmidt, Steffen Bauer, Lennard Sprong and Rogier Goossens."
+
+#. type: Plain text
+#: puzzles.but:3361
+msgid ""
+"Permission is hereby granted, free of charge, to any person obtaining a copy "
+"of this software and associated documentation files (the \\q{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:"
+msgstr ""
+"Hiermit wird jeder Person, die eine Kopie dieser Software und den "
+"zugehörigen Dokumentationsdateien (die \\q{Software}) erhält, ohne Gebühr "
+"die Erlaubnis erteilt, mit der Software ohne Einschränkungen umzugehen, dazu "
+"gehört ohne Anspruch auf Vollständigkeit das Recht, Kopien der Software zu "
+"verwenden, zu kopieren, zu bearbeiten, zusammenzuführen, zu veröffentlichen, "
+"zu vertreiben, unterzulizensieren und/oder zu verkaufen, sowie dies Personen "
+"zu erlauben, denen die Software bereitgestellt wird, solange folgende "
+"Bedingungen erfüllt werden:"
+
+#. type: Plain text
+#: puzzles.but:3364
+msgid ""
+"The above copyright notice and this permission notice shall be included in "
+"all copies or substantial portions of the Software."
+msgstr ""
+"Der obige Urheberhinweis und diese Erlaubniserteilung sollen in allen Kopien "
+"oder wesentlichen Teilen dieser Software enthalten sein."
+
+#. type: Plain text
+#: puzzles.but:3373
+msgid ""
+"THE SOFTWARE IS PROVIDED \\q{AS IS}, WITHOUT WARRANTY OF ANY KIND, EXPRESS "
+"OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, "
+"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE "
+"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER "
+"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING "
+"FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS "
+"IN THE SOFTWARE."
+msgstr ""
+"DIE SOFTWARE WIRD \\q{WIE VORLIEGEND} GELIEFERT, OHNE JEGLICHE "
+"GEWÄHRLEISTUNG, WEDER AUSDRÃœCKLICH NOCH STILLSCHWEIGEND, EINSCHLIESSLICH, "
+"ABER NICHT BESCHRÄNKT AUF, MÄNGELGEWÄHRLEISTUNGEN, EIGNUNG FÃœR EINEN "
+"BESTIMMTEN ZWECK UND NICHTVERLETZUNG RECHTE DRITTER. IN KEINEM FALL KANN DER "
+"AUTOR ODER URHERBERRECHTSINHABER FÃœR IRGENDEINEN ANSPRUCH, SCHÄDEN ODER "
+"ANDERE HAFTUNG HAFTBAR GEMACHT WERDEN, EGAL OB ALS TEIL EINES VERTRAGES, "
+"AUFGRUND UNERLAUBTER HANDLUNGEN, DIE VON, AUS ODER IN ZUSAMMENHANG MIT DER "
+"SOFTWARE ODER DEREN VERWENDUNG ODER ANDEREN UMGANG IN DER SOFTWARE HERRÃœHREN."
+
+#. type: IM{#1}
+#: puzzles.but:3374
+msgid "command-line"
+msgstr "Befehlszeile"
+
+#. type: IM
+#: puzzles.but:3374
+#, no-wrap
+msgid "{command line} command line"
+msgstr "{Befehlszeile} Befehlszeile"
+
+#. type: IM{#1}
+#: puzzles.but:3376 puzzles.but:3377
+#, no-wrap
+msgid "default parameters, specifying"
+msgstr "Standardparameter, angeben"
+
+#. type: IM
+#: puzzles.but:3377
+#, no-wrap
+msgid "preferences, specifying default"
+msgstr "Voreinstellungen, Standard angeben"
+
+#. type: IM{#1}
+#: puzzles.but:3379 puzzles.but:3380
+#, no-wrap
+msgid "Unix"
+msgstr "Unix"
+
+#. type: IM
+#: puzzles.but:3380
+#, no-wrap
+msgid "Linux"
+msgstr "Linux"
+
+#. type: IM{#1}
+#: puzzles.but:3382 puzzles.but:3383
+#, no-wrap
+msgid "generating game IDs"
+msgstr "Erzeugen von Spiele-IDs"
+
+#. type: IM
+#: puzzles.but:3383
+#, no-wrap
+msgid "game ID, generating"
+msgstr "Spiele-ID, erzeugen"
+
+#. type: IM{#1}
+#: puzzles.but:3385
+msgid "specific"
+msgstr "specific"
+
+#. type: IM
+#: puzzles.but:3385
+#, no-wrap
+msgid "\\q{Specific}, menu option"
+msgstr "\\q{Specific}, Menüoption"
+
+#. type: IM{#1}
+#: puzzles.but:3386
+msgid "custom"
+msgstr "custom"
+
+#. type: IM
+#: puzzles.but:3386
+#, no-wrap
+msgid "\\q{Custom}, menu option"
+msgstr "\\q{Custom}, Menüoption"
+
+#. type: IM{#1}
+#: puzzles.but:3388 puzzles.but:3389
+#, no-wrap
+msgid "game ID"
+msgstr "Spiele-ID"
+
+#. type: IM
+#: puzzles.but:3389
+#, no-wrap
+msgid "ID, game"
+msgstr "ID, Spiel"
+
+#. type: IM{#1}
+#: puzzles.but:3390 puzzles.but:3391 puzzles.but:3392
+#, no-wrap
+msgid "ID format"
+msgstr "ID-Format"
+
+#. type: IM
+#: puzzles.but:3391
+#, no-wrap
+msgid "format, ID"
+msgstr "Format, ID"
+
+#. type: IM
+#: puzzles.but:3392
+#, no-wrap
+msgid "game ID, format"
+msgstr "Spiele-ID, Format"
+
+#. type: IM{#1}
+#: puzzles.but:3394 puzzles.but:3395
+#, no-wrap
+msgid "keys"
+msgstr "Tasten"
+
+#. type: IM
+#: puzzles.but:3395
+#, no-wrap
+msgid "shortcuts (keyboard)"
+msgstr "Tastaturkürzel"
+
+#. type: IM{#1}
+#: puzzles.but:3397 puzzles.but:3398
+#, no-wrap
+msgid "initial state"
+msgstr "Anfangszustand"
+
+#. type: IM
+#: puzzles.but:3398
+#, no-wrap
+msgid "state, initial"
+msgstr "Zustand, anfänglicher"
+
+#. type: IM{#1}
+#: puzzles.but:3400 puzzles.but:3401
+#, no-wrap
+msgid "MIT licence"
+msgstr "MIT-Lizenz"
+
+#. type: IM
+#: puzzles.but:3401
+#, no-wrap
+msgid "licence, MIT"
+msgstr "Lizenz, MIT"
+
+#. type: Plain text
+#: puzzles.but:3403
+msgid "Simon Tatham's Portable Puzzle Collection, version 20160429.b31155b"
+msgstr "Simon Tathams portable Puzzle-Sammlung, Version 20160429.b31155b"
+
+#: blackbox.R
+msgid "Ball-finding puzzle"
+msgstr "Ball-Finde-Puzzle"
+
+#: bridges.R
+msgid "Bridge-placing puzzle"
+msgstr "Brücken-Setze-Puzzle"
+
+#: cube.R
+msgid "Rolling cube puzzle"
+msgstr "Würfel-Rollen-Puzzle"
+
+#: dominosa.R
+msgid "Domino tiling puzzle"
+msgstr "Domino-Stapel-Puzzle"
+
+#: fifteen.R
+msgid "Sliding block puzzle"
+msgstr "Blöcke-Schiebe-Puzzle"
+
+#: filling.R
+msgid "Polyomino puzzle"
+msgstr "Polyomino-Puzzle"
+
+#: flip.R
+msgid "Tile inversion puzzle"
+msgstr "Kachel-Inversions-Puzzle"
+
+#: flood.R
+msgid "Flood-filling puzzle"
+msgstr "Flutungs-Puzzle"
+
+#: galaxies.R
+msgid "Symmetric polyomino puzzle"
+msgstr "Symmetrisches Polyomino-Puzzle"
+
+#: guess.R
+msgid "Combination-guessing puzzle"
+msgstr "Kombinations-Rate-Puzzle"
+
+#: inertia.R
+msgid "Gem-collecting puzzle"
+msgstr "Edelstein-Sammel-Puzzle"
+
+#: keen.R
+msgid "Arithmetic Latin square puzzle"
+msgstr "Arithmetisches Lateinisches-Quadrat-Puzzle"
+
+#: lightup.R
+msgid "Light-bulb placing puzzle"
+msgstr "Glühlampen-Setze-Puzzle"
+
+#: loopy.R pearl.R
+msgid "Loop-drawing puzzle"
+msgstr "Schleifen-Male-Puzzle"
+
+#: magnets.R
+msgid "Magnet-placing puzzle"
+msgstr "Magnet-Setze-Puzzle"
+
+#: map.R
+msgid "Map-colouring puzzle"
+msgstr "Karten-Einfärbe-Puzzle"
+
+#: mines.R
+msgid "Mine-finding puzzle"
+msgstr "Minen-Finde-Puzzle"
+
+#: net.R
+msgid "Network jigsaw puzzle"
+msgstr "Netz-Jigsaw-Puzzle"
+
+#: netslide.R
+msgid "Toroidal sliding network puzzle"
+msgstr "Toroidal-verschiebbares Netzpuzzle"
+
+#: palisade.R
+msgid "Grid-division puzzle"
+msgstr "Gitter-Unterteilungs-Puzzle"
+
+#: pattern.R
+msgid "Pattern puzzle"
+msgstr "Muster-Puzzle"
+
+#: pegs.R
+msgid "Peg solitaire puzzle"
+msgstr "Stifte-Solitaire-Puzzle"
+
+#: range.R
+msgid "Visible-distance puzzle"
+msgstr "Sichtbarer-Abstand-Puzzle"
+
+#: rect.R
+msgid "Rectangles puzzle"
+msgstr "Rechteck-Puzzle"
+
+#: samegame.R
+msgid "Block-clearing puzzle"
+msgstr "Block-Bereinigungs-Puzzle"
+
+#: signpost.R
+msgid "Square-connecting puzzle"
+msgstr "Quadrate-Verbinde-Puzzle"
+
+#: singles.R
+msgid "Number-removing puzzle"
+msgstr "Zahlen-Entferne-Puzzle"
+
+#: sixteen.R
+msgid "Toroidal sliding block puzzle"
+msgstr "Toroidal-verschiebbares Blockpuzzle"
+
+#: slant.R
+msgid "Maze-drawing puzzle"
+msgstr "Irrgarten-Male-Puzzle"
+
+#: solo.R
+msgid "Number placement puzzle"
+msgstr "Zahlen-Setz-Spiel"
+
+#: tents.R
+msgid "Tent-placing puzzle"
+msgstr "Zelte-Setz-Spiel"
+
+#: towers.R
+msgid "Tower-placing Latin square puzzle"
+msgstr "Lateinisches-Quadrat-Turm-Setze-Puzzle"
+
+#: tracks.R
+msgid "Path-finding railway track puzzle"
+msgstr "Pfadfinde-Eisenbahngleise-Puzzle"
+
+#: twiddle.R
+msgid "Rotational sliding block puzzle"
+msgstr "Rotierendes Verschiebe-Block-Puzzle"
+
+#: undead.R
+msgid "Monster-placing puzzle"
+msgstr "Monster-Setz-Spiel"
+
+#: unequal.R
+msgid "Latin square puzzle"
+msgstr "Lateinisches Quadrat-Puzzle"
+
+#: unruly.R
+msgid "Black and white grid puzzle"
+msgstr "Schwarz-und-Weiss-Gitter-Puzzle"
+
+#: untangle.R
+msgid "Planar graph layout puzzle"
+msgstr "Planares Kurven-Layout-Puzzle"
+
+#. Translator: conventional name for manual section 6
+#: mkmanpages.pl:28
+msgid "Games"
+msgstr "Spiele"
+
+#: mkmanpages.pl:44
+msgid "January"
+msgstr "Januar"
+
+#: mkmanpages.pl:44
+msgid "February"
+msgstr "Februar"
+
+#: mkmanpages.pl:44
+msgid "March"
+msgstr "März"
+
+#: mkmanpages.pl:45
+msgid "April"
+msgstr "April"
+
+#: mkmanpages.pl:45
+msgid "May"
+msgstr "Mai"
+
+#: mkmanpages.pl:45
+msgid "June"
+msgstr "Juni"
+
+#: mkmanpages.pl:46
+msgid "July"
+msgstr "Juli"
+
+#: mkmanpages.pl:46
+msgid "August"
+msgstr "August"
+
+#: mkmanpages.pl:46
+msgid "September"
+msgstr "September"
+
+#: mkmanpages.pl:47
+msgid "October"
+msgstr "Oktober"
+
+#: mkmanpages.pl:47
+msgid "November"
+msgstr "November"
+
+#: mkmanpages.pl:47
+msgid "December"
+msgstr "Dezember"
+
+#: mkmanpages.pl:93
+msgid "NAME"
+msgstr "NAME"
+
+#: mkmanpages.pl:95
+msgid "SYNOPSIS"
+msgstr "ÃœBERSICHT"
+
+#. Translator: abbreviation for 'number'
+#: mkmanpages.pl:97 mkmanpages.pl:102
+msgid "n"
+msgstr "n"
+
+#. Translator: abbreviation for 'width'
+#: mkmanpages.pl:99
+msgid "w"
+msgstr "b"
+
+#. Translator: abbreviation for 'height'
+#: mkmanpages.pl:101
+msgid "h"
+msgstr "h"
+
+#: mkmanpages.pl:103
+msgid "game-parameters"
+msgstr "Spiele-Parameter"
+
+#: mkmanpages.pl:103
+msgid "game-ID"
+msgstr "Spiele-ID"
+
+#: mkmanpages.pl:104
+msgid "random-seed"
+msgstr "Zufallsstartwert"
+
+#: mkmanpages.pl:106
+msgid "DESCRIPTION"
+msgstr "BESCHREIBUNG"
+
+#: mkmanpages.pl:109
+msgid "SEE ALSO"
+msgstr "SIEHE AUCH"
+
+#. Translator: "Full documentation in <filename>."
+#: mkmanpages.pl:111
+#, perl-format
+msgid "Full documentation in %s."
+msgstr "Komplette Dokumentation in %s."
+
+#. Translator: earlier in the manual page
+#: mkmanpages.pl:122
+msgid "above"
+msgstr "oben"
+
+#. Translator: later in the manual page
+#: mkmanpages.pl:125
+msgid "below"
+msgstr "unten"
+
+#~ msgid ""
+#~ "\\W{http://www.nikoli.co.jp/puzzles/7/index_text-e.htm}\\cw{http://www."
+#~ "nikoli.co.jp/puzzles/7/index_text-e.htm}"
+#~ msgstr ""
+#~ "\\W{http://www.nikoli.co.jp/puzzles/7/index_text-e.htm}\\cw{http://www."
+#~ "nikoli.co.jp/puzzles/7/index_text-e.htm}"
+
+#~ msgid ""
+#~ "\\W{http://www.nikoli.co.jp/puzzles/1/index_text-e.htm}\\cw{http://www."
+#~ "nikoli.co.jp/puzzles/1/index_text-e.htm}"
+#~ msgstr ""
+#~ "\\W{http://www.nikoli.co.jp/puzzles/1/index_text-e.htm}\\cw{http://www."
+#~ "nikoli.co.jp/puzzles/1/index_text-e.htm}"
+
+#~ msgid ""
+#~ "\\W{http://www.nikoli.co.jp/puzzles/32/index-e.htm}\\cw{http://www.nikoli."
+#~ "co.jp/puzzles/32/index-e.htm} (beware of Flash)"
+#~ msgstr ""
+#~ "\\W{http://www.nikoli.co.jp/puzzles/32/index-e.htm}\\cw{http://www.nikoli."
+#~ "co.jp/puzzles/32/index-e.htm} (Achtung Flash)"
+
+#~ msgid ""
+#~ "\\W{http://www.nikoli.co.jp/puzzles/14/index-e.htm}\\cw{http://www.nikoli."
+#~ "co.jp/puzzles/14/index-e.htm}"
+#~ msgstr ""
+#~ "\\W{http://www.nikoli.co.jp/puzzles/14/index-e.htm}\\cw{http://www.nikoli."
+#~ "co.jp/puzzles/14/index-e.htm}"
+
+#~ msgid "guessing game"
+#~ msgstr "Ratespiel"
+
+#~ msgid "topological deduction game"
+#~ msgstr "Topologisches Puzzlespiel"
+
+#~ msgid "puzzle game"
+#~ msgstr "Puzzlespiel"
+
+#~ msgid "guessing game based on Mastermind"
+#~ msgstr "Ratespiel basierend auf Mastermind"
+
+#~ msgid "game based on KenKen"
+#~ msgstr "Spiel basierend auf KenKen"
+
+#~ msgid "game based on Minesweeper"
+#~ msgstr "Spiel basierend auf Minesweeper"
+
+#~ msgid "tile manipulation puzzle game based on FreeNet"
+#~ msgstr "Kachelmanipulations-Puzzlespiel basierend auf FreeNet"
+
+#~ msgid "nonogram puzzle game"
+#~ msgstr "Nonogram-Puzzlespiel"
+
+#~ msgid "puzzle game based on Masyu"
+#~ msgstr "Puzzlespiel basierend auf Masyu"
+
+#~ msgid "puzzle game based on Kurodoko"
+#~ msgstr "Puzzlespiel basierend auf Kurodoko"
+
+#~ msgid "puzzle game based on Divide by Squares"
+#~ msgstr "Puzzlespiel basierend auf Â»Divide by Squares«"
+
+#~ msgid "puzzle game based on Pfeilpfad"
+#~ msgstr "Puzzlespiel basierend auf Pfeilpfad"
+
+#~ msgid "puzzle game based on Hitori"
+#~ msgstr "Puzzlespiel basierend auf Hitori"
+
+#~ msgid "puzzle game based on Sudoku"
+#~ msgstr "Puzzlespiel basierend auf Sudoku"
+
+#~ msgid "puzzle game based on Skyscrapers"
+#~ msgstr "Puzzlespiel basierend auf Skyscrapers"
+
+#~ msgid "puzzle game based on Futoshiki"
+#~ msgstr "Puzzlespiel basierend auf Futoshiki"
+
+#~ msgid "puzzle game based on Planarity"
+#~ msgstr "Puzzlespiel basierend auf Planarity"
diff --git a/debian/po/puzzles-doc.pot b/debian/po/puzzles-doc.pot
new file mode 100644 (file)
index 0000000..07ceace
--- /dev/null
@@ -0,0 +1,6339 @@
+# Documentation for Simon Tatham's Portable Puzzle Collection:
+# translation into LANGUAGE.
+# Copyright YEAR TRANSLATION COPYRIGHT HOLDER
+# This file is distributed under the same license as the English
+# documentation.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: puzzles\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2016-06-30 16:17+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: Plain text
+#: puzzles.but:2
+msgid "Simon Tatham's Portable Puzzle Collection"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:5
+msgid "\\cfg{winhelp-filename}{puzzles.hlp}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:5
+msgid "\\cfg{winhelp-contents-titlepage}{Contents}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:7
+msgid "\\cfg{text-filename}{puzzles.txt}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:15
+msgid "\\cfg{html-contents-filename}{index.html}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:15
+msgid "\\cfg{html-template-filename}{%k.html}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:15
+msgid "\\cfg{html-index-filename}{docindex.html}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:15
+msgid "\\cfg{html-leaf-level}{1}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:15
+msgid "\\cfg{html-contents-depth-0}{1}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:15
+msgid "\\cfg{html-contents-depth-1}{2}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:15
+msgid "\\cfg{html-leaf-contains-contents}{true}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:17
+msgid "\\cfg{info-filename}{puzzles.info}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:20
+msgid "\\cfg{ps-filename}{puzzles.ps}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:20
+msgid "\\cfg{pdf-filename}{puzzles.pdf}"
+msgstr ""
+
+#. type: define
+#: puzzles.but:21
+#, no-wrap
+msgid "\\u00D7{x}"
+msgstr ""
+
+#. type: define
+#: puzzles.but:23
+#, no-wrap
+msgid "\\u2013{-}"
+msgstr ""
+
+#. type: define
+#: puzzles.but:25
+#, no-wrap
+msgid "\\u00D7{*}"
+msgstr ""
+
+#. type: define
+#: puzzles.but:27
+#, no-wrap
+msgid "\\u00F7{/}"
+msgstr ""
+
+#. type: define
+#: puzzles.but:29
+#, no-wrap
+msgid "\\u2212{-}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:32
+msgid "This is a collection of small one-player puzzle games."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:36
+msgid ""
+"This manual is copyright 2004-2014 Simon Tatham. All rights reserved. You "
+"may distribute this documentation under the MIT licence.  See \\k{licence} "
+"for the licence text in full."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:38
+msgid ""
+"\\cfg{html-local-head}{<meta name=\"AppleTitle\" content=\"Puzzles Help\">}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:40
+msgid "Introduction"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:55
+msgid ""
+"I wrote this collection because I thought there should be more small desktop "
+"toys available: little games you can pop up in a window and play for two or "
+"three minutes while you take a break from whatever else you were doing. And "
+"I was also annoyed that every time I found a good game on (say) \\i{Unix}, "
+"it wasn't available the next time I was sitting at a \\i{Windows} machine, "
+"or vice versa; so I arranged that everything in my personal puzzle "
+"collection will happily run on both, and have more recently done a port to "
+"\\i{Mac OS X} as well. When I find (or perhaps invent) further puzzle games "
+"that I like, they'll be added to this collection and will immediately be "
+"available on both platforms. And if anyone feels like writing any other "
+"front ends \\dash PocketPC, Mac OS pre-10, or whatever it might be \\dash "
+"then all the games in this framework will immediately become available on "
+"another platform as well."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:61
+msgid ""
+"The actual games in this collection were mostly not my invention; they are "
+"re-implementations of existing game concepts within my portable puzzle "
+"framework. I do not claim credit, in general, for inventing the rules of any "
+"of these puzzles. (I don't even claim authorship of all the code; some of "
+"the puzzles have been submitted by other authors.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:66
+msgid ""
+"This collection is distributed under the \\i{MIT licence} (see "
+"\\k{licence}). This means that you can do pretty much anything you like with "
+"the game binaries or the code, except pretending you wrote them yourself, or "
+"suing me if anything goes wrong."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:69
+msgid ""
+"The most recent versions, and \\i{source code}, can be found at "
+"\\I{website}\\W{http://www.chiark.greenend.org.uk/~sgtatham/"
+"puzzles/}\\cw{http://www.chiark.greenend.org.uk/~sgtatham/puzzles/}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:73
+msgid ""
+"Please report \\I{feedback}\\i{bugs} to \\W{mailto:anakin@pobox."
+"com}\\cw{anakin@pobox.com}.  You might find it helpful to read this article "
+"before reporting a bug:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:75
+msgid ""
+"\\W{http://www.chiark.greenend.org.uk/~sgtatham/bugs.html}\\cw{http://www."
+"chiark.greenend.org.uk/~sgtatham/bugs.html}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:78
+msgid ""
+"\\ii{Patches} are welcome. Especially if they provide a new front end (to "
+"make all these games run on another platform), or a new game."
+msgstr ""
+
+#. type: ii{#1}
+#: puzzles.but:81
+msgid "Common features"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:83
+msgid "This chapter describes features that are common to all the games."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:85
+msgid "\\I{controls}Common actions"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:89
+msgid ""
+"These actions are all available from the \\I{Game menu}\\q{Game} menu and "
+"via \\I{keys}keyboard shortcuts, in addition to any game-specific actions."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:93
+msgid ""
+"(On \\i{Mac OS X}, to conform with local user interface standards, these "
+"actions are situated on the \\I{File menu}\\q{File} and \\I{Edit "
+"menu}\\q{Edit} menus instead.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:95
+msgid "\\ii\\e{New game} (\\q{N}, Ctrl+\\q{N})"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:97
+msgid "Starts a new game, with a random initial state."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:99
+msgid "\\ii\\e{Restart game}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:101
+msgid "Resets the current game to its initial state. (This can be undone.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:103
+msgid "\\ii\\e{Load}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:105
+msgid "Loads a saved game from a file on disk."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:107
+msgid "\\ii\\e{Save}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:109
+msgid "Saves the current state of your game to a file on disk."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:117
+msgid ""
+"The Load and Save operations preserve your entire game history (so you can "
+"save, reload, and still Undo and Redo things you had done before saving)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:119
+msgid "\\I{printing, on Windows}\\e{Print}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:126
+msgid ""
+"Where supported (currently only on Windows), brings up a dialog allowing you "
+"to print an arbitrary number of puzzles randomly generated from the current "
+"parameters, optionally including the current puzzle. (Only for puzzles which "
+"make sense to print, of course \\dash it's hard to think of a sensible "
+"printable representation of Fifteen!)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:128
+msgid "\\ii\\e{Undo} (\\q{U}, Ctrl+\\q{Z}, Ctrl+\\q{_})"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:131
+msgid ""
+"Undoes a single move. (You can undo moves back to the start of the session.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:133
+msgid "\\ii\\e{Redo} (\\q{R}, Ctrl+\\q{R})"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:135
+msgid "Redoes a previously undone move."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:137
+msgid "\\ii\\e{Copy}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:142
+msgid ""
+"Copies the current state of your game to the clipboard in text format, so "
+"that you can paste it into (say) an e-mail client or a web message board if "
+"you're discussing the game with someone else.  (Not all games support this "
+"feature.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:144
+msgid "\\ii\\e{Solve}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:154
+msgid ""
+"Transforms the puzzle instantly into its solved state. For some games (Cube) "
+"this feature is not supported at all because it is of no particular use. For "
+"other games (such as Pattern), the solved state can be used to give you "
+"information, if you can't see how a solution can exist at all or you want to "
+"know where you made a mistake. For still other games (such as Sixteen), "
+"automatic solution tells you nothing about how to \\e{get} to the solution, "
+"but it does provide a useful way to get there quickly so that you can "
+"experiment with set-piece moves and transformations."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:169
+msgid ""
+"Some games (such as Solo) are capable of solving a game ID you have typed in "
+"from elsewhere. Other games (such as Rectangles) cannot solve a game ID they "
+"didn't invent themself, but when they did invent the game ID they know what "
+"the solution is already. Still other games (Pattern) can solve \\e{some} "
+"external game IDs, but only if they aren't too difficult."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:169
+msgid ""
+"The \\q{Solve} command adds the solved state to the end of the undo chain "
+"for the puzzle. In other words, if you want to go back to solving it "
+"yourself after seeing the answer, you can just press Undo."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:171
+msgid "\\I{exit}\\ii\\e{Quit} (\\q{Q}, Ctrl+\\q{Q})"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:173
+msgid "Closes the application entirely."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:175
+msgid "Specifying games with the \\ii{game ID}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:179
+msgid ""
+"There are two ways to save a game specification out of a puzzle and recreate "
+"it later, or recreate it in somebody else's copy of the same puzzle."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:184
+msgid ""
+"The \\q{\\i{Specific}} and \\q{\\i{Random Seed}} options from the \\I{Game "
+"menu}\\q{Game} menu (or the \\q{File} menu, on \\i{Mac OS X}) each show a "
+"piece of text (a \\q{game ID}) which is sufficient to reconstruct precisely "
+"the same game at a later date."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:190
+msgid ""
+"You can enter either of these pieces of text back into the program (via the "
+"same \\q{Specific} or \\q{Random Seed} menu options) at a later point, and "
+"it will recreate the same game. You can also use either one as a \\i{command "
+"line} argument (on Windows or Unix); see \\k{common-cmdline} for more detail."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:196
+msgid ""
+"The difference between the two forms is that a descriptive game ID is a "
+"literal \\e{description} of the \\i{initial state} of the game, whereas a "
+"random seed is just a piece of arbitrary text which was provided as input to "
+"the random number generator used to create the puzzle. This means that:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:202
+msgid ""
+"Descriptive game IDs tend to be longer in many puzzles (although some, such "
+"as Cube (\\k{cube}), only need very short descriptions).  So a random seed "
+"is often a \\e{quicker} way to note down the puzzle you're currently "
+"playing, or to tell it to somebody else so they can play the same one as you."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:211
+msgid ""
+"Any text at all is a valid random seed. The automatically generated ones are "
+"fifteen-digit numbers, but anything will do; you can type in your full name, "
+"or a word you just made up, and a valid puzzle will be generated from it. "
+"This provides a way for two or more people to race to complete the same "
+"puzzle: you think of a random seed, then everybody types it in at the same "
+"time, and nobody has an advantage due to having seen the generated puzzle "
+"before anybody else."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:215
+msgid ""
+"It is often possible to convert puzzles from other sources (such as "
+"\\q{nonograms} or \\q{sudoku} from newspapers) into descriptive game IDs "
+"suitable for use with these programs."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:223
+msgid ""
+"Random seeds are not guaranteed to produce the same result if you use them "
+"with a different \\i\\e{version} of the puzzle program. This is because the "
+"generation algorithm might have been improved or modified in later versions "
+"of the code, and will therefore produce a different result when given the "
+"same sequence of random numbers. Use a descriptive game ID if you aren't "
+"sure that it will be used on the same version of the program as yours."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:227
+msgid ""
+"(Use the \\q{About} menu option to find out the version number of the "
+"program. Programs with the same version number running on different "
+"platforms should still be random-seed compatible.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:234
+msgid ""
+"\\I{ID format}A descriptive game ID starts with a piece of text which "
+"encodes the \\i\\e{parameters} of the current game (such as grid size). Then "
+"there is a colon, and after that is the description of the game's initial "
+"state. A random seed starts with a similar string of parameters, but then it "
+"contains a hash sign followed by arbitrary data."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:240
+msgid ""
+"If you enter a descriptive game ID, the program will not be able to show you "
+"the random seed which generated it, since it wasn't generated \\e{from} a "
+"random seed. If you \\e{enter} a random seed, however, the program will be "
+"able to show you the descriptive game ID derived from that random seed."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:248
+msgid ""
+"Note that the game parameter strings are not always identical between the "
+"two forms. For some games, there will be parameter data provided with the "
+"random seed which is not included in the descriptive game ID. This is "
+"because that parameter information is only relevant when \\e{generating} "
+"puzzle grids, and is not important when playing them. Thus, for example, the "
+"difficulty level in Solo (\\k{solo}) is not mentioned in the descriptive "
+"game ID."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:258
+msgid ""
+"These additional parameters are also not set permanently if you type in a "
+"game ID. For example, suppose you have Solo set to \\q{Advanced} difficulty "
+"level, and then a friend wants your help with a \\q{Trivial} puzzle; so the "
+"friend reads out a random seed specifying \\q{Trivial} difficulty, and you "
+"type it in. The program will generate you the same \\q{Trivial} grid which "
+"your friend was having trouble with, but once you have finished playing it, "
+"when you ask for a new game it will automatically go back to the "
+"\\q{Advanced} difficulty which it was previously set on."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:260
+msgid "The \\q{Type} menu"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:264
+msgid ""
+"The \\I{Type menu}\\q{Type} menu, if present, may contain a list of "
+"\\i{preset} game settings. Selecting one of these will start a new random "
+"game with the parameters specified."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:269
+msgid ""
+"The \\q{Type} menu may also contain a \\q{\\i{Custom}} option which allows "
+"you to fine-tune game \\i{parameters}. The parameters available are specific "
+"to each game and are described in the following sections."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:271
+msgid "Specifying game parameters on the \\i{command line}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:273
+msgid "(This section does not apply to the \\i{Mac OS X} version.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:279
+msgid ""
+"The games in this collection deliberately do not ever save information on to "
+"the computer they run on: they have no high score tables and no saved "
+"preferences. (This is because I expect at least some people to play them at "
+"work, and those people will probably appreciate leaving as little evidence "
+"as possible!)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:283
+msgid ""
+"However, if you do want to arrange for one of these games to \\I{default "
+"parameters, specifying}default to a particular set of parameters, you can "
+"specify them on the command line."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:291
+msgid ""
+"The easiest way to do this is to set up the parameters you want using the "
+"\\q{Type} menu (see \\k{common-type}), and then to select \\q{Random Seed} "
+"from the \\q{Game} or \\q{File} menu (see \\k{common-id}). The text in the "
+"\\q{Game ID} box will be composed of two parts, separated by a hash. The "
+"first of these parts represents the game parameters (the size of the playing "
+"area, for example, and anything else you set using the \\q{Type} menu)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:294
+msgid ""
+"If you run the game with just that parameter text on the command line, it "
+"will start up with the settings you specified."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:300
+msgid ""
+"For example: if you run Cube (see \\k{cube}), select \\q{Octahedron} from "
+"the \\q{Type} menu, and then go to the game ID selection, you will see a "
+"string of the form \\cq{o2x2#338686542711620}. Take only the part before the "
+"hash (\\cq{o2x2}), and start Cube with that text on the command line: "
+"\\cq{PREFIX-cube o2x2}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:305
+msgid ""
+"If you copy the \\e{entire} game ID on to the command line, the game will "
+"start up in the specific game that was described. This is occasionally a "
+"more convenient way to start a particular game ID than by pasting it into "
+"the game ID selection box."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:310
+msgid ""
+"(You could also retrieve the encoded game parameters using the \\q{Specific} "
+"menu option instead of \\q{Random Seed}, but if you do then some options, "
+"such as the difficulty level in Solo, will be missing. See \\k{common-id} "
+"for more details on this.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:312
+msgid "\\i{Unix} \\i{command-line} options"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:314
+msgid "(This section only applies to the Unix port.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:317
+msgid ""
+"In addition to being able to specify game parameters on the command line "
+"(see \\k{common-cmdline}), there are various other options:"
+msgstr ""
+
+#. type: cw{#1}
+#: puzzles.but:319
+msgid "--game"
+msgstr ""
+
+#. type: cw{#1}
+#: puzzles.but:321
+msgid "--load"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:326
+msgid ""
+"These options respectively determine whether the command-line argument is "
+"treated as specifying game parameters or a \\i{save} file to \\i{load}. Only "
+"one should be specified. If neither of these options is specified, a guess "
+"is made based on the format of the argument."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:328
+msgid "\\cw{--generate }\\e{n}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:333
+msgid ""
+"If this option is specified, instead of a puzzle being displayed, a number "
+"of descriptive game IDs will be \\I{generating game IDs}invented and printed "
+"on standard output. This is useful for gaining access to the game generation "
+"algorithms without necessarily using the frontend."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:344
+msgid ""
+"If game parameters are specified on the command-line, they will be used to "
+"generate the game IDs; otherwise a default set of parameters will be used."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:344
+msgid ""
+"The most common use of this option is in conjunction with \\c{--print}, in "
+"which case its behaviour is slightly different; see below."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:346
+msgid "\\I{printing, on Unix}\\cw{--print }\\e{w}\\cw{x}\\e{h}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:350
+msgid ""
+"If this option is specified, instead of a puzzle being displayed, a printed "
+"representation of one or more unsolved puzzles is sent to standard output, "
+"in \\i{PostScript} format."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:374
+msgid ""
+"On each page of puzzles, there will be \\e{w} across and \\e{h} down. If "
+"there are more puzzles than \\e{w}\\by\\e{h}, more than one page will be "
+"printed."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:374 puzzles.but:397
+msgid ""
+"If \\c{--generate} has also been specified, the invented game IDs will be "
+"used to generate the printed output. Otherwise, a list of game IDs is "
+"expected on standard input (which can be descriptive or random seeds; see "
+"\\k{common-id}), in the same format produced by \\c{--generate}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:374 puzzles.but:397
+msgid "For example:"
+msgstr ""
+
+#. type: c
+#: puzzles.but:374
+#, no-wrap
+msgid "PREFIX-net --generate 12 --print 2x3 7x7w | lpr"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:374
+msgid ""
+"will generate two pages of printed Net puzzles (each of which will have a "
+"7\\by\\.7 wrapping grid), and pipe the output to the \\c{lpr} command, which "
+"on many systems will send them to an actual printer."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:374
+msgid "There are various other options which affect printing; see below."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:376
+msgid "\\cw{--save }\\e{file-prefix} [ \\cw{--save-suffix }\\e{file-suffix} ]"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:380
+msgid ""
+"If this option is specified, instead of a puzzle being displayed, saved-game "
+"files for one or more unsolved puzzles are written to files constructed from "
+"the supplied prefix and/or suffix."
+msgstr ""
+
+#. type: c
+#: puzzles.but:397
+#, no-wrap
+msgid "PREFIX-net --generate 12 --save game --save-suffix .sav"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:397
+msgid ""
+"will generate twelve Net saved-game files with the names \\cw{game0.sav} to "
+"\\cw{game11.sav}."
+msgstr ""
+
+#. type: cw{#1}
+#: puzzles.but:399
+msgid "--version"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:401
+msgid "Prints version information about the game, and then quits."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:404
+msgid ""
+"The following options are only meaningful if \\c{--print} is also specified:"
+msgstr ""
+
+#. type: cw{#1}
+#: puzzles.but:406
+msgid "--with-solutions"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:409
+msgid ""
+"The set of pages filled with unsolved puzzles will be followed by the "
+"solutions to those puzzles."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:411
+msgid "\\cw{--scale }\\e{n}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:414
+msgid ""
+"Adjusts how big each puzzle is when printed. Larger numbers make puzzles "
+"bigger; the default is 1.0."
+msgstr ""
+
+#. type: cw{#1}
+#: puzzles.but:416
+msgid "--colour"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:419
+msgid ""
+"Puzzles will be printed in colour, rather than in black and white (if "
+"supported by the puzzle)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:422
+msgid "\\i{Net}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:424
+msgid "\\cfg{winhelp-topic}{games.net}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:427
+msgid ""
+"(\\e{Note:} the \\i{Windows} version of this game is called \\i\\cw{NETGAME."
+"EXE} to avoid clashing with Windows's own \\cw{NET.EXE}.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:439
+msgid ""
+"I originally saw this in the form of a Flash game called \\i{FreeNet} "
+"\\k{FreeNet}, written by Pavils Jurjans; there are several other "
+"implementations under the name \\i{NetWalk}. The computer prepares a network "
+"by connecting up the centres of squares in a grid, and then shuffles the "
+"network by rotating every tile randomly. Your job is to rotate it all back "
+"into place. The successful solution will be an entirely connected network, "
+"with no closed loops. \\#{The latter clause means that there are no closed "
+"paths within the network.  Could this be clearer? \"No closed paths\"?} As a "
+"visual aid, all tiles which are connected to the one in the middle are "
+"highlighted."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:441
+msgid ""
+"\\W{http://www.jurjans.lv/stuff/net/FreeNet.htm}\\cw{http://www.jurjans.lv/"
+"stuff/net/FreeNet.htm}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:443
+msgid "\\i{Net controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:444 puzzles.but:445 puzzles.but:446
+msgid "Net controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:444
+#, no-wrap
+msgid "controls, for Net"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:445
+#, no-wrap
+msgid "keys, for Net"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:446
+#, no-wrap
+msgid "shortcuts (keyboard), for Net"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:450
+msgid ""
+"This game can be played with either the keyboard or the mouse. The controls "
+"are:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:452
+msgid "\\e{Select tile}: mouse pointer, arrow keys"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:454
+msgid "\\e{Rotate tile anticlockwise}: left mouse button, \\q{A} key"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:456
+msgid "\\e{Rotate tile clockwise}: right mouse button, \\q{D} key"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:458
+msgid "\\e{Rotate tile by 180 degrees}: \\q{F} key"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:460
+msgid ""
+"\\e{Lock (or unlock) tile}: middle mouse button, shift-click, \\q{S} key"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:464
+msgid ""
+"You can lock a tile once you're sure of its orientation. You can also unlock "
+"it again, but while it's locked you can't accidentally turn it."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:467
+msgid ""
+"The following controls are not necessary to complete the game, but may be "
+"useful:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:469
+msgid "\\e{Shift grid}: Shift + arrow keys"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:472
+msgid ""
+"On grids that wrap, you can move the origin of the grid, so that tiles that "
+"were on opposite sides of the grid can be seen together."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:474
+msgid "\\e{Move centre}: Ctrl + arrow keys"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:479
+msgid ""
+"You can change which tile is used as the source of highlighting.  (It "
+"doesn't ultimately matter which tile this is, as every tile will be "
+"connected to every other tile in a correct solution, but it may be helpful "
+"in the intermediate stages of solving the puzzle.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:481
+msgid "\\e{Jumble tiles}: \\q{J} key"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:484
+msgid "This key turns all tiles that are not locked to random orientations."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:486 puzzles.but:575 puzzles.but:625 puzzles.but:673
+#: puzzles.but:731 puzzles.but:807 puzzles.but:918 puzzles.but:1011
+#: puzzles.but:1203 puzzles.but:1276 puzzles.but:1353 puzzles.but:1425
+#: puzzles.but:1484 puzzles.but:1528 puzzles.but:1671 puzzles.but:1739
+#: puzzles.but:1810 puzzles.but:1906 puzzles.but:1981 puzzles.but:2120
+#: puzzles.but:2236 puzzles.but:2367 puzzles.but:2441 puzzles.but:2500
+#: puzzles.but:2593 puzzles.but:2691 puzzles.but:2749 puzzles.but:2811
+#: puzzles.but:2901 puzzles.but:2969 puzzles.but:3040 puzzles.but:3118
+#: puzzles.but:3164 puzzles.but:3215 puzzles.but:3279 puzzles.but:3332
+msgid "(All the actions described in \\k{common-actions} are also available.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:488
+msgid "\\I{parameters, for Net}Net parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:491 puzzles.but:580 puzzles.but:812 puzzles.but:1208
+#: puzzles.but:1281 puzzles.but:1430 puzzles.but:1489 puzzles.but:1676
+#: puzzles.but:1744 puzzles.but:1815 puzzles.but:1911 puzzles.but:1986
+#: puzzles.but:2067 puzzles.but:2125 puzzles.but:2241 puzzles.but:2372
+#: puzzles.but:2446 puzzles.but:2598 puzzles.but:2696 puzzles.but:2754
+#: puzzles.but:2816 puzzles.but:2906 puzzles.but:2974 puzzles.but:3045
+#: puzzles.but:3123 puzzles.but:3169 puzzles.but:3220 puzzles.but:3284
+#: puzzles.but:3337
+msgid ""
+"These parameters are available from the \\q{Custom...} option on the "
+"\\q{Type} menu."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:493 puzzles.but:814 puzzles.but:1138 puzzles.but:1210
+#: puzzles.but:1283 puzzles.but:1432 puzzles.but:1678 puzzles.but:1746
+#: puzzles.but:1817 puzzles.but:1913 puzzles.but:1988 puzzles.but:2069
+#: puzzles.but:2127 puzzles.but:2243 puzzles.but:2448 puzzles.but:2756
+#: puzzles.but:2818 puzzles.but:2908 puzzles.but:2976 puzzles.but:3125
+#: puzzles.but:3171 puzzles.but:3222 puzzles.but:3286 puzzles.but:3339
+msgid "\\e{Width}, \\e{Height}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:495
+msgid "Size of grid in tiles."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:497
+msgid "Walls wrap around"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:500
+msgid ""
+"If checked, flow can pass from the left edge to the right edge, and from top "
+"to bottom, and vice versa."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:502
+msgid "Barrier probability"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:507
+msgid ""
+"A number between 0.0 and 1.0 controlling whether an immovable barrier is "
+"placed between two tiles to prevent flow between them (a higher number gives "
+"more barriers). Since barriers are immovable, they act as constraints on the "
+"solution (i.e., hints)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:522
+msgid ""
+"The grid generation in Net has been carefully arranged so that the barriers "
+"are independent of the rest of the grid. This means that if you note down "
+"the random seed used to generate the current puzzle (see \\k{common-id}), "
+"change the \\e{Barrier probability} parameter, and then re-enter the same "
+"random seed, you should see exactly the same starting grid, with the only "
+"change being the number of barriers. So if you're stuck on a particular grid "
+"and need a hint, you could start up another instance of Net, set up the same "
+"parameters but a higher barrier probability, and enter the game seed from "
+"the original Net window."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:524 puzzles.but:844 puzzles.but:1498
+msgid "Ensure unique solution"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:531
+msgid ""
+"Normally, Net will make sure that the puzzles it presents have only one "
+"solution. Puzzles with ambiguous sections can be more difficult and more "
+"subtle, so if you like you can turn off this feature and risk having "
+"ambiguous puzzles. (Also, finding \\e{all} the possible solutions can be an "
+"additional challenge for an advanced player.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:534
+msgid "\\i{Cube}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:536
+msgid "\\cfg{winhelp-topic}{games.cube}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:548
+msgid ""
+"This is another one I originally saw as a web game. This one was a Java game "
+"\\k{cube-java-game}, by Paul Scott. You have a grid of 16 squares, six of "
+"which are blue; on one square rests a cube. Your move is to use the arrow "
+"keys to roll the cube through 90 degrees so that it moves to an adjacent "
+"square. If you roll the cube on to a blue square, the blue square is picked "
+"up on one face of the cube; if you roll a blue face of the cube on to a non-"
+"blue square, the blueness is put down again. (In general, whenever you roll "
+"the cube, the two faces that come into contact swap colours.) Your job is to "
+"get all six blue squares on to the six faces of the cube at the same time. "
+"Count your moves and try to do it in as few as possible."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:553
+msgid ""
+"Unlike the original Java game, my version has an additional feature: once "
+"you've mastered the game with a cube rolling on a square grid, you can "
+"change to a triangular grid and roll any of a tetrahedron, an octahedron or "
+"an icosahedron."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:555
+msgid ""
+"\\W{http://www3.sympatico.ca/paulscott/cube/cube.htm}\\cw{http://www3."
+"sympatico.ca/paulscott/cube/cube.htm}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:557
+msgid "\\i{Cube controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:558 puzzles.but:559 puzzles.but:560
+msgid "Cube controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:558
+#, no-wrap
+msgid "controls, for Cube"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:559
+#, no-wrap
+msgid "keys, for Cube"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:560
+#, no-wrap
+msgid "shortcuts (keyboard), for Cube"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:563 puzzles.but:1189 puzzles.but:1264 puzzles.but:1322
+msgid "This game can be played with either the keyboard or the mouse."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:566
+msgid ""
+"Left-clicking anywhere on the window will move the cube (or other solid) "
+"towards the mouse pointer."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:573
+msgid ""
+"The arrow keys can also used to roll the cube on its square grid in the four "
+"cardinal directions.  On the triangular grids, the mapping of arrow keys to "
+"directions is more approximate. Vertical movement is disallowed where it "
+"doesn't make sense. The four keys surrounding the arrow keys on the numeric "
+"keypad (\\q{7}, \\q{9}, \\q{1}, \\q{3}) can be used for diagonal movement."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:577
+msgid "\\I{parameters, for Cube}Cube parameters"
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:582
+msgid "Type of solid"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:585
+msgid ""
+"Selects the solid to roll (and hence the shape of the grid): tetrahedron, "
+"cube, octahedron, or icosahedron."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:587
+msgid "\\e{Width / top}, \\e{Height / bottom}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:591
+msgid ""
+"On a square grid, horizontal and vertical dimensions. On a triangular grid, "
+"the number of triangles on the top and bottom rows respectively."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:594
+msgid "\\i{Fifteen}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:596
+msgid "\\cfg{winhelp-topic}{games.fifteen}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:604
+msgid ""
+"The old ones are the best: this is the good old \\q{\\i{15-puzzle}} with "
+"sliding tiles. You have a 4\\by\\.4 square grid; 15 squares contain numbered "
+"tiles, and the sixteenth is empty. Your move is to choose a tile next to the "
+"empty space, and slide it into the space.  The aim is to end up with the "
+"tiles in numerical order, with the space in the bottom right (so that the "
+"top row reads 1,2,3,4 and the bottom row reads 13,14,15,\\e{space})."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:606
+msgid "\\i{Fifteen controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:607 puzzles.but:608 puzzles.but:609
+msgid "Fifteen controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:607
+#, no-wrap
+msgid "controls, for Fifteen"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:608
+#, no-wrap
+msgid "keys, for Fifteen"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:609
+#, no-wrap
+msgid "shortcuts (keyboard), for Fifteen"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:612
+msgid "This game can be controlled with the mouse or the keyboard."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:616
+msgid ""
+"A left-click with the mouse in the row or column containing the empty space "
+"will move as many tiles as necessary to move the space to the mouse pointer."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:619
+msgid ""
+"The arrow keys will move a tile adjacent to the space in the direction "
+"indicated (moving the space in the \\e{opposite} direction)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:623
+msgid ""
+"Pressing \\q{h} will make a suggested move.  Pressing \\q{h} enough times "
+"will solve the game, but it may scramble your progress while doing so."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:627
+msgid "\\I{parameters, for Fifteen}Fifteen parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:631
+msgid ""
+"The only options available from the \\q{Custom...} option on the \\q{Type} "
+"menu are \\e{Width} and \\e{Height}, which are self-explanatory. (Once "
+"you've changed these, it's not a \\q{15-puzzle} any more, of course!)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:634
+msgid "\\i{Sixteen}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:636
+msgid "\\cfg{winhelp-topic}{games.sixteen}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:646
+msgid ""
+"Another sliding tile puzzle, visually similar to Fifteen (see \\k{fifteen}) "
+"but with a different type of move. This time, there is no hole: all 16 "
+"squares on the grid contain numbered squares. Your move is to shift an "
+"entire row left or right, or shift an entire column up or down; every time "
+"you do that, the tile you shift off the grid re-appears at the other end of "
+"the same row, in the space you just vacated. To win, arrange the tiles into "
+"numerical order (1,2,3,4 on the top row, 13,14,15,16 on the bottom). When "
+"you've done that, try playing on different sizes of grid."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:654
+msgid ""
+"I \\e{might} have invented this game myself, though only by accident if so "
+"(and I'm sure other people have independently invented it). I thought I was "
+"imitating a screensaver I'd seen, but I have a feeling that the screensaver "
+"might actually have been a Fifteen-type puzzle rather than this slightly "
+"different kind. So this might be the one thing in my puzzle collection which "
+"represents creativity on my part rather than just engineering."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:656
+msgid "\\I{controls, for Sixteen}Sixteen controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:660
+msgid ""
+"Left-clicking on an arrow will move the appropriate row or column in the "
+"direction indicated.  Right-clicking will move it in the opposite direction."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:664
+msgid ""
+"Alternatively, use the cursor keys to move the position indicator around the "
+"edge of the grid, and use the return key to move the row/column in the "
+"direction indicated."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:671
+msgid ""
+"You can also move the tiles directly.  Move the cursor onto a tile, hold "
+"Control and press an arrow key to move the tile under the cursor and move "
+"the cursor along with the tile.  Or, hold Shift to move only the tile.  "
+"Pressing Enter simulates holding down Control (press Enter again to "
+"release), while pressing Space simulates holding down shift."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:675
+msgid "\\I{parameters, for Sixteen}Sixteen parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:678
+msgid ""
+"The parameters available from the \\q{Custom...} option on the \\q{Type} "
+"menu are:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:680
+msgid "\\e{Width} and \\e{Height}, which are self-explanatory."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:690
+msgid ""
+"You can ask for a limited shuffling operation to be performed on the grid. "
+"By default, Sixteen will shuffle the grid in such a way that any arrangement "
+"is about as probable as any other. You can override this by requesting a "
+"precise number of shuffling moves to be performed. Typically your aim is "
+"then to determine the precise set of shuffling moves and invert them "
+"exactly, so that you answer (say) a four-move shuffle with a four-move "
+"solution. Note that the more moves you ask for, the more likely it is that "
+"solutions shorter than the target length will turn out to be possible."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:693
+msgid "\\i{Twiddle}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:695
+msgid "\\cfg{winhelp-topic}{games.twiddle}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:700
+msgid ""
+"Twiddle is a tile-rearrangement puzzle, visually similar to Sixteen (see "
+"\\k{sixteen}): you are given a grid of square tiles, each containing a "
+"number, and your aim is to arrange the numbers into ascending order."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:705
+msgid ""
+"In basic Twiddle, your move is to rotate a square group of four tiles about "
+"their common centre. (Orientation is not significant in the basic puzzle, "
+"although you can select it.) On more advanced settings, you can rotate a "
+"larger square group of tiles."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:710
+msgid ""
+"I first saw this type of puzzle in the GameCube game \\q{Metroid Prime 2}. "
+"In the Main Gyro Chamber in that game, there is a puzzle you solve to unlock "
+"a door, which is a special case of Twiddle. I developed this game as a "
+"generalisation of that puzzle."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:712
+msgid "\\I{controls, for Twiddle}Twiddle controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:717
+msgid ""
+"To play Twiddle, click the mouse in the centre of the square group you wish "
+"to rotate. In the basic mode, you rotate a 2\\by\\.2 square, which means you "
+"have to click at a corner point where four tiles meet."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:721
+msgid ""
+"In more advanced modes you might be rotating 3\\by\\.3 or even more at a "
+"time; if the size of the square is odd then you simply click in the centre "
+"tile of the square you want to rotate."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:724
+msgid ""
+"Clicking with the left mouse button rotates the group anticlockwise.  "
+"Clicking with the right button rotates it clockwise."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:729
+msgid ""
+"You can also move an outline square around the grid with the cursor keys; "
+"the square is the size above (2\\by\\.2 by default, or larger).  Pressing "
+"the return key or space bar will rotate the current square anticlockwise or "
+"clockwise respectively."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:733
+msgid "\\I{parameters, for Twiddle}Twiddle parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:736
+msgid ""
+"Twiddle provides several configuration options via the \\q{Custom} option on "
+"the \\q{Type} menu:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:738
+msgid "You can configure the width and height of the puzzle grid."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:740
+msgid "You can configure the size of square block that rotates at a time."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:746
+msgid ""
+"You can ask for every square in the grid to be distinguishable (the "
+"default), or you can ask for a simplified puzzle in which there are groups "
+"of identical numbers. In the simplified puzzle your aim is just to arrange "
+"all the 1s into the first row, all the 2s into the second row, and so on."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:751
+msgid ""
+"You can configure whether the orientation of tiles matters. If you ask for "
+"an orientable puzzle, each tile will have a triangle drawn in it. All the "
+"triangles must be pointing upwards to complete the puzzle."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:761
+msgid ""
+"You can ask for a limited shuffling operation to be performed on the grid. "
+"By default, Twiddle will shuffle the grid so much that any arrangement is "
+"about as probable as any other. You can override this by requesting a "
+"precise number of shuffling moves to be performed.  Typically your aim is "
+"then to determine the precise set of shuffling moves and invert them "
+"exactly, so that you answer (say) a four-move shuffle with a four-move "
+"solution. Note that the more moves you ask for, the more likely it is that "
+"solutions shorter than the target length will turn out to be possible."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:764
+msgid "\\i{Rectangles}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:766
+msgid "\\cfg{winhelp-topic}{games.rectangles}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:772
+msgid ""
+"You have a grid of squares, with numbers written in some (but not all)  of "
+"the squares. Your task is to subdivide the grid into rectangles of various "
+"sizes, such that (a) every rectangle contains exactly one numbered square, "
+"and (b) the area of each rectangle is equal to the number written in its "
+"numbered square."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:781
+msgid ""
+"Credit for this game goes to the Japanese puzzle magazine \\i{Nikoli} "
+"\\k{nikoli-rect}; I've also seen a Palm implementation at \\i{Puzzle Palace} "
+"\\k{puzzle-palace-rect}. Unlike Puzzle Palace's implementation, my version "
+"automatically generates random grids of any size you like. The quality of "
+"puzzle design is therefore not quite as good as hand-crafted puzzles would "
+"be, but on the plus side you get an inexhaustible supply of puzzles tailored "
+"to your own specification."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:784
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/shikaku.html}\\cw{http://www.nikoli."
+"co.jp/en/puzzles/shikaku.html} (beware of Flash)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:786
+msgid ""
+"\\W{https://web.archive.org/web/20041024001459/http://www.puzzle.gr.jp/"
+"puzzle/sikaku/palm/index.html.en}\\cw{https://web.archive.org/"
+"web/20041024001459/http://www.puzzle.gr.jp/puzzle/sikaku/palm/index.html.en}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:788
+msgid "\\I{controls, for Rectangles}Rectangles controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:790
+msgid "This game is played with the mouse or cursor keys."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:795
+msgid ""
+"Left-click any edge to toggle it on or off, or left-click and drag to draw "
+"an entire rectangle (or line) on the grid in one go (removing any existing "
+"edges within that rectangle). Right-clicking and dragging will allow you to "
+"erase the contents of a rectangle without affecting its edges."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:803
+msgid ""
+"Alternatively, use the cursor keys to move the position indicator around the "
+"board. Pressing the return key then allows you to use the cursor keys to "
+"drag a rectangle out from that position, and pressing the return key again "
+"completes the rectangle. Using the space bar instead of the return key "
+"allows you to erase the contents of a rectangle without affecting its edges, "
+"as above. Pressing escape cancels a drag."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:805
+msgid "When a rectangle of the correct size is completed, it will be shaded."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:809
+msgid "\\I{parameters, for Rectangles}Rectangles parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:816
+msgid "Size of grid, in squares."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:818
+msgid "Expansion factor"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:824
+msgid ""
+"This is a mechanism for changing the type of grids generated by the program. "
+"Some people prefer a grid containing a few large rectangles to one "
+"containing many small ones. So you can ask Rectangles to essentially "
+"generate a \\e{smaller} grid than the size you specified, and then to expand "
+"it by adding rows and columns."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:842
+msgid ""
+"The default expansion factor of zero means that Rectangles will simply "
+"generate a grid of the size you ask for, and do nothing further. If you set "
+"an expansion factor of (say) 0.5, it means that each dimension of the grid "
+"will be expanded to half again as big after generation. In other words, the "
+"initial grid will be 2/3 the size in each dimension, and will be expanded to "
+"its full size without adding any more rectangles."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:842
+msgid ""
+"Setting an expansion factor of around 0.5 tends to make the game more "
+"difficult, and also (in my experience) rewards a less deductive and more "
+"intuitive playing style. If you set it \\e{too} high, though, the game "
+"simply cannot generate more than a few rectangles to cover the entire grid, "
+"and the game becomes trivial."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:851
+msgid ""
+"Normally, Rectangles will make sure that the puzzles it presents have only "
+"one solution. Puzzles with ambiguous sections can be more difficult and more "
+"subtle, so if you like you can turn off this feature and risk having "
+"ambiguous puzzles. Also, finding \\e{all} the possible solutions can be an "
+"additional challenge for an advanced player. Turning off this option can "
+"also speed up puzzle generation."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:854
+msgid "\\i{Netslide}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:856
+msgid "\\cfg{winhelp-topic}{games.netslide}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:861
+msgid ""
+"This game combines the grid generation of Net (see \\k{net}) with the "
+"movement of Sixteen (see \\k{sixteen}): you have a Net grid, but instead of "
+"rotating tiles back into place you have to slide them into place by moving a "
+"whole row at a time."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:864
+msgid ""
+"As in Sixteen, \\I{controls, for Netslide}control is with the mouse or "
+"cursor keys. See \\k{sixteen-controls}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:868
+msgid ""
+"\\I{parameters, for Netslide}The available game parameters have similar "
+"meanings to those in Net (see \\k{net-params}) and Sixteen (see \\k{sixteen-"
+"params})."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:870
+msgid "Netslide was contributed to this collection by Richard Boulton."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:873
+msgid "\\i{Pattern}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:875
+msgid "\\cfg{winhelp-topic}{games.pattern}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:881
+msgid ""
+"You have a grid of squares, which must all be filled in either black or "
+"white. Beside each row of the grid are listed the lengths of the runs of "
+"black squares on that row; above each column are listed the lengths of the "
+"runs of black squares in that column. Your aim is to fill in the entire grid "
+"black or white."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:885
+msgid ""
+"I first saw this puzzle form around 1995, under the name "
+"\\q{\\i{nonograms}}. I've seen it in various places since then, under "
+"different names."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:893
+msgid ""
+"Normally, puzzles of this type turn out to be a meaningful picture of "
+"something once you've solved them. However, since this version generates the "
+"puzzles automatically, they will just look like random groupings of squares. "
+"(One user has suggested that this is actually a \\e{good} thing, since it "
+"prevents you from guessing the colour of squares based on the picture, and "
+"forces you to use logic instead.)  The advantage, though, is that you never "
+"run out of them."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:895
+msgid "\\I{controls, for Pattern}Pattern controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:897 puzzles.but:1090
+msgid "This game is played with the mouse."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:902
+msgid ""
+"Left-click in a square to colour it black. Right-click to colour it white. "
+"If you make a mistake, you can middle-click, or hold down Shift while "
+"clicking with any button, to colour the square in the default grey (meaning "
+"\\q{undecided}) again."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:908
+msgid ""
+"You can click and drag with the left or right mouse button to colour a "
+"vertical or horizontal line of squares black or white at a time "
+"(respectively). If you click and drag with the middle button, or with Shift "
+"held down, you can colour a whole rectangle of squares grey."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:912
+msgid ""
+"You can also move around the grid with the cursor keys. Pressing the return "
+"key will cycle the current cell through empty, then black, then white, then "
+"empty, and the space bar does the same cycle in reverse."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:916
+msgid ""
+"Moving the cursor while holding Control will colour the moved-over squares "
+"black.  Holding Shift will colour the moved-over squares white, and holding "
+"both will colour them grey."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:920
+msgid "\\I{parameters, for Pattern}Pattern parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:923
+msgid ""
+"The only options available from the \\q{Custom...} option on the \\q{Type} "
+"menu are \\e{Width} and \\e{Height}, which are self-explanatory."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:926
+msgid "\\i{Solo}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:928
+msgid "\\cfg{winhelp-topic}{games.solo}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:932
+msgid ""
+"You have a square grid, which is divided into as many equally sized sub-"
+"blocks as the grid has rows. Each square must be filled in with a digit from "
+"1 to the size of the grid, in such a way that"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:934
+msgid "every row contains only one occurrence of each digit"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:936
+msgid "every column contains only one occurrence of each digit"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:938
+msgid "every block contains only one occurrence of each digit."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:941
+msgid ""
+"(optionally, by default off) each of the square's two main diagonals "
+"contains only one occurrence of each digit."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:944
+msgid ""
+"You are given some of the numbers as clues; your aim is to place the rest of "
+"the numbers correctly."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:952
+msgid ""
+"Under the default settings, the sub-blocks are square or rectangular. The "
+"default puzzle size is 3\\by\\.3 (a 9\\by\\.9 actual grid, divided into nine "
+"3\\by\\.3 blocks). You can also select sizes with rectangular blocks instead "
+"of square ones, such as 2\\by\\.3 (a 6\\by\\.6 grid divided into six 3\\by"
+"\\.2 blocks). Alternatively, you can select \\q{jigsaw} mode, in which the "
+"sub-blocks are arbitrary shapes which differ between individual puzzles."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:959
+msgid ""
+"Another available mode is \\q{killer}. In this mode, clues are not given in "
+"the form of filled-in squares; instead, the grid is divided into \\q{cages} "
+"by coloured lines, and for each cage the game tells you what the sum of all "
+"the digits in that cage should be. Also, no digit may appear more than once "
+"within a cage, even if the cage crosses the boundaries of existing regions."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:965
+msgid ""
+"If you select a puzzle size which requires more than 9 digits, the "
+"additional digits will be letters of the alphabet. For example, if you "
+"select 3\\by\\.4 then the digits which go in your grid will be 1 to 9, plus "
+"\\cq{a}, \\cq{b} and \\cq{c}. This cannot be selected for killer puzzles."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:973
+msgid ""
+"I first saw this puzzle in \\i{Nikoli} \\k{nikoli-solo}, although it's also "
+"been popularised by various newspapers under the name \\q{Sudoku} or \\q{Su "
+"Doku}.  Howard Garns is considered the inventor of the modern form of the "
+"puzzle, and it was first published in \\e{Dell Pencil Puzzles and Word "
+"Games}.  A more elaborate treatment of the history of the puzzle can be "
+"found on Wikipedia \\k{wikipedia-solo}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:976
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/sudoku.html}\\cw{http://www.nikoli.co."
+"jp/en/puzzles/sudoku.html} (beware of Flash)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:978
+msgid ""
+"\\W{http://en.wikipedia.org/wiki/Sudoku}\\cw{http://en.wikipedia.org/wiki/"
+"Sudoku}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:980
+msgid "\\I{controls, for Solo}Solo controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:985
+msgid ""
+"To play Solo, simply click the mouse in any empty square and then type a "
+"digit or letter on the keyboard to fill that square. If you make a mistake, "
+"click the mouse in the incorrect square and press Space to clear it again "
+"(or use the Undo feature)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:990 puzzles.but:2336 puzzles.but:2569
+msgid ""
+"If you \\e{right}-click in a square and then type a number, that number will "
+"be entered in the square as a \\q{pencil mark}. You can have pencil marks "
+"for multiple numbers in the same square. Squares containing filled-in "
+"numbers cannot also contain pencil marks."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:996 puzzles.but:2342 puzzles.but:2575 puzzles.but:2669
+msgid ""
+"The game pays no attention to pencil marks, so exactly what you use them for "
+"is up to you: you can use them as reminders that a particular square needs "
+"to be re-examined once you know more about a particular number, or you can "
+"use them as lists of the possible numbers in a given square, or anything "
+"else you feel like."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:999 puzzles.but:2345 puzzles.but:2578 puzzles.but:2672
+msgid ""
+"To erase a single pencil mark, right-click in the square and type the same "
+"number again."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1003 puzzles.but:2349 puzzles.but:2582 puzzles.but:2676
+msgid ""
+"All pencil marks in a square are erased when you left-click and type a "
+"number, or when you left-click and press space. Right-clicking and pressing "
+"space will also erase pencil marks."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1009 puzzles.but:2360
+msgid ""
+"Alternatively, use the cursor keys to move the mark around the grid.  "
+"Pressing the return key toggles the mark (from a normal mark to a pencil "
+"mark), and typing a number in is entered in the square in the appropriate "
+"way; typing in a 0 or using the space bar will clear a filled square."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1013
+msgid "\\I{parameters, for Solo}Solo parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1019
+msgid ""
+"Solo allows you to configure two separate dimensions of the puzzle grid on "
+"the \\q{Type} menu: the number of columns, and the number of rows, into "
+"which the main grid is divided. (The size of a block is the inverse of this: "
+"for example, if you select 2 columns and 3 rows, each actual block will have "
+"3 columns and 2 rows.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1025
+msgid ""
+"If you tick the \\q{X} checkbox, Solo will apply the optional extra "
+"constraint that the two main diagonals of the grid also contain one of every "
+"digit. (This is sometimes known as \\q{Sudoku-X} in newspapers.) In this "
+"mode, the squares on the two main diagonals will be shaded slightly so that "
+"you know it's enabled."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1032
+msgid ""
+"If you tick the \\q{Jigsaw} checkbox, Solo will generate randomly shaped sub-"
+"blocks. In this mode, the actual grid size will be taken to be the product "
+"of the numbers entered in the \\q{Columns} and \\q{Rows} boxes. There is no "
+"reason why you have to enter a number greater than 1 in both boxes; Jigsaw "
+"mode has no constraint on the grid size, and it can even be a prime number "
+"if you feel like it."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1037
+msgid ""
+"If you tick the \\q{Killer} checkbox, Solo will generate a set of of cages, "
+"which are randomly shaped and drawn in an outline of a different colour.  "
+"Each of these regions contains a smaller clue which shows the digit sum of "
+"all the squares in this region."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1043
+msgid ""
+"You can also configure the type of symmetry shown in the generated puzzles. "
+"More symmetry makes the puzzles look prettier but may also make them easier, "
+"since the symmetry constraints can force more clues than necessary to be "
+"present. Completely asymmetric puzzles have the freedom to contain as few "
+"clues as possible."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1057
+msgid ""
+"Finally, you can configure the difficulty of the generated puzzles.  "
+"Difficulty levels are judged by the complexity of the techniques of "
+"deduction required to solve the puzzle: each level requires a mode of "
+"reasoning which was not necessary in the previous one. In particular, on "
+"difficulty levels \\q{Trivial} and \\q{Basic} there will be a square you can "
+"fill in with a single number at all times, whereas at \\q{Intermediate} "
+"level and beyond you will have to make partial deductions about the \\e{set} "
+"of squares a number could be in (or the set of numbers that could be in a "
+"square).  \\#{Advanced, Extreme?} At \\q{Unreasonable} level, even this is "
+"not enough, and you will eventually have to make a guess, and then backtrack "
+"if it turns out to be wrong."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1063
+msgid ""
+"Generating difficult puzzles is itself difficult: if you select one of the "
+"higher difficulty levels, Solo may have to make many attempts at generating "
+"a puzzle before it finds one hard enough for you. Be prepared to wait, "
+"especially if you have also configured a large puzzle size."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1066
+msgid "\\i{Mines}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1068
+msgid "\\cfg{winhelp-topic}{games.mines}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1075
+msgid ""
+"You have a grid of covered squares, some of which contain mines, but you "
+"don't know which. Your job is to uncover every square which does \\e{not} "
+"contain a mine. If you uncover a square containing a mine, you lose. If you "
+"uncover a square which does not contain a mine, you are told how many mines "
+"are contained within the eight surrounding squares."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1078
+msgid ""
+"This game needs no introduction; popularised by Windows, it is perhaps the "
+"single best known desktop puzzle game in existence."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1086
+msgid ""
+"This version of it has an unusual property. By default, it will generate its "
+"mine positions in such a way as to ensure that you never need to \\e{guess} "
+"where a mine is: you will always be able to deduce it somehow. So you will "
+"never, as can happen in other versions, get to the last four squares and "
+"discover that there are two mines left but you have no way of knowing for "
+"sure where they are."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1088
+msgid "\\I{controls, for Mines}Mines controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1092
+msgid "If you left-click in a covered square, it will be uncovered."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1097
+msgid ""
+"If you right-click in a covered square, it will place a flag which indicates "
+"that the square is believed to be a mine. Left-clicking in a marked square "
+"will not uncover it, for safety. You can right-click again to remove a mark "
+"placed in error."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1105
+msgid ""
+"If you left-click in an \\e{uncovered} square, it will \\q{clear around} the "
+"square. This means: if the square has exactly as many flags surrounding it "
+"as it should have mines, then all the covered squares next to it which are "
+"\\e{not} flagged will be uncovered. So once you think you know the location "
+"of all the mines around a square, you can use this function as a shortcut to "
+"avoid having to click on each of the remaining squares one by one."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1111
+msgid ""
+"If you uncover a square which has \\e{no} mines in the surrounding eight "
+"squares, then it is obviously safe to uncover those squares in turn, and so "
+"on if any of them also has no surrounding mines. This will be done for you "
+"automatically; so sometimes when you uncover a square, a whole new area will "
+"open up to be explored."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1117
+msgid ""
+"You can also use the cursor keys to move around the minefield.  Pressing the "
+"return key in a covered square uncovers it, and in an uncovered square will "
+"clear around it (so it acts as the left button), pressing the space bar in a "
+"covered square will place a flag (similarly, it acts as the right button)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1119
+msgid "All the actions described in \\k{common-actions} are also available."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1127
+msgid ""
+"Even Undo is available, although you might consider it cheating to use it. "
+"If you step on a mine, the program will only reveal the mine in question "
+"(unlike most other implementations, which reveal all of them). You can then "
+"Undo your fatal move and continue playing if you like. The program will "
+"track the number of times you died (and Undo will not reduce that counter), "
+"so when you get to the end of the game you know whether or not you did it "
+"without making any errors."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1131
+msgid ""
+"(If you really want to know the full layout of the grid, which other "
+"implementations will show you after you die, you can always use the Solve "
+"menu option.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1133
+msgid "\\I{parameters, for Mines}Mines parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1136
+msgid ""
+"The options available from the \\q{Custom...} option on the \\q{Type} menu "
+"are:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1140 puzzles.but:1212 puzzles.but:1285 puzzles.but:1748
+#: puzzles.but:1819 puzzles.but:1915 puzzles.but:2071 puzzles.but:2129
+#: puzzles.but:2245 puzzles.but:2450 puzzles.but:2758 puzzles.but:2910
+#: puzzles.but:2978 puzzles.but:3127 puzzles.but:3341
+msgid "Size of grid in squares."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1142
+msgid "Mines"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1147
+msgid ""
+"Number of mines in the grid. You can enter this as an absolute mine count, "
+"or alternatively you can put a \\cw{%} sign on the end in which case the "
+"game will arrange for that proportion of the squares in the grid to be mines."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1154
+msgid ""
+"Beware of setting the mine count too high. At very high densities, the "
+"program may spend forever searching for a solvable grid."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1156 puzzles.but:1228
+msgid "Ensure solubility"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1161
+msgid ""
+"When this option is enabled (as it is by default), Mines will ensure that "
+"the entire grid can be fully deduced starting from the initial open space. "
+"If you prefer the riskier grids generated by other implementations, you can "
+"switch off this option."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1164
+msgid "\\i{Same Game}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1166
+msgid "\\cfg{winhelp-topic}{games.samegame}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1171
+msgid ""
+"You have a grid of coloured squares, which you have to clear by highlighting "
+"contiguous regions of more than one coloured square; the larger the region "
+"you highlight, the more points you get (and the faster you clear the arena)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1175
+msgid ""
+"If you clear the grid you win. If you end up with nothing but single squares "
+"(i.e., there are no more clickable regions left) you lose."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1179
+msgid ""
+"Removing a region causes the rest of the grid to shuffle up: blocks that are "
+"suspended will fall down (first), and then empty columns are filled from the "
+"right."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1181
+msgid "Same Game was contributed to this collection by James Harvey."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1183
+msgid "\\i{Same Game controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:1184 puzzles.but:1185 puzzles.but:1186
+msgid "Same Game controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1184
+#, no-wrap
+msgid "controls, for Same Game"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1185
+#, no-wrap
+msgid "keys, for Same Game"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1186
+#, no-wrap
+msgid "shortcuts (keyboard), for Same Game"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1192
+msgid ""
+"If you left-click an unselected region, it becomes selected (possibly "
+"clearing the current selection)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1195
+msgid ""
+"If you left-click the selected region, it will be removed (and the rest of "
+"the grid shuffled immediately)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1197
+msgid "If you right-click the selected region, it will be unselected."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1201
+msgid ""
+"The cursor keys move a cursor around the grid. Pressing the Space or Enter "
+"keys while the cursor is in an unselected region selects it; pressing Space "
+"or Enter again removes it as above."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1205
+msgid "\\I{parameters, for Same Game}Same Game parameters"
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1214
+msgid "No. of colours"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1218
+msgid ""
+"Number of different colours used to fill the grid; the more colours, the "
+"fewer large regions of colour and thus the more difficult it is to "
+"successfully clear the grid."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1220
+msgid "Scoring system"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1226
+msgid ""
+"Controls the precise mechanism used for scoring. With the default system, "
+"\\q{(n-2)^2}, only regions of three squares or more will score any points at "
+"all. With the alternative \\q{(n-1)^2} system, regions of two squares score "
+"a point each, and larger regions score relatively more points."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1231
+msgid ""
+"If this option is ticked (the default state), generated grids will be "
+"guaranteed to have at least one solution."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1243
+msgid ""
+"If you turn it off, the game generator will not try to guarantee soluble "
+"grids; it will, however, still ensure that there are at least 2 squares of "
+"each colour on the grid at the start (since a grid with exactly one square "
+"of a given colour is \\e{definitely} insoluble). Grids generated with this "
+"option disabled may contain more large areas of contiguous colour, leading "
+"to opportunities for higher scores; they can also take less time to generate."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1246
+msgid "\\i{Flip}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1248
+msgid "\\cfg{winhelp-topic}{games.flip}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1253
+msgid ""
+"You have a grid of squares, some light and some dark. Your aim is to light "
+"all the squares up at the same time. You can choose any square and flip its "
+"state from light to dark or dark to light, but when you do so, other squares "
+"around it change state as well."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1256
+msgid ""
+"Each square contains a small diagram showing which other squares change when "
+"you flip it."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1258
+msgid "\\i{Flip controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:1259 puzzles.but:1260 puzzles.but:1261
+msgid "Flip controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1259
+#, no-wrap
+msgid "controls, for Flip"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1260
+#, no-wrap
+msgid "keys, for Flip"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1261
+#, no-wrap
+msgid "shortcuts (keyboard), for Flip"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1268
+msgid ""
+"Left-click in a square to flip it and its associated squares, or use the "
+"cursor keys to choose a square and the space bar or Enter key to flip."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1274
+msgid ""
+"If you use the \\q{Solve} function on this game, it will mark some of the "
+"squares in red. If you click once in every square with a red mark, the game "
+"should be solved. (If you click in a square \\e{without} a red mark, a red "
+"mark will appear in it to indicate that you will need to reverse that "
+"operation to reach the solution.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1278
+msgid "\\I{parameters, for flip}Flip parameters"
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1287
+msgid "Shape type"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1294
+msgid ""
+"This control determines the shape of the region which is flipped by clicking "
+"in any given square. The default setting, \\q{Crosses}, causes every square "
+"to flip itself and its four immediate neighbours (or three or two if it's at "
+"an edge or corner). The other setting, \\q{Random}, causes a random shape to "
+"be chosen for every square, so the game is different every time."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1297
+msgid "\\i{Guess}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1299
+msgid "\\cfg{winhelp-topic}{games.guess}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1303
+msgid ""
+"You have a set of coloured pegs, and have to reproduce a predetermined "
+"sequence of them (chosen by the computer) within a certain number of guesses."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1307
+msgid ""
+"Each guess gets marked with the number of correctly-coloured pegs in the "
+"correct places (in black), and also the number of correctly-coloured pegs in "
+"the wrong places (in white)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1312
+msgid ""
+"This game is also known (and marketed, by Hasbro, mainly) as a board game "
+"\\q{\\i{Mastermind}}, with 6 colours, 4 pegs per row, and 10 guesses. "
+"However, this version allows custom settings of number of colours (up to "
+"10), number of pegs per row, and number of guesses."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1314
+msgid "Guess was contributed to this collection by James Harvey."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1316
+msgid "\\i{Guess controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:1317 puzzles.but:1318 puzzles.but:1319
+msgid "Guess controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1317
+#, no-wrap
+msgid "controls, for Guess"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1318
+#, no-wrap
+msgid "keys, for Guess"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1319
+#, no-wrap
+msgid "shortcuts (keyboard), for Guess"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1327
+msgid ""
+"With the mouse, drag a coloured peg from the tray on the left-hand side to "
+"its required position in the current guess; pegs may also be dragged from "
+"current and past guesses to copy them elsewhere. To remove a peg, drag it "
+"off its current position to somewhere invalid."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1331
+msgid ""
+"Right-clicking in the current guess adds a \\q{hold} marker; pegs that have "
+"hold markers will be automatically added to the next guess after marking."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1337
+msgid ""
+"Alternatively, with the keyboard, the up and down cursor keys can be used to "
+"select a peg colour, the left and right keys to select a peg position, and "
+"the space bar or Enter key to place a peg of the selected colour in the "
+"chosen position. \\q{D} or Backspace removes a peg, and Space adds a hold "
+"marker."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1341
+msgid ""
+"Pressing \\q{h} or \\q{?} will fill the current guess with a suggested "
+"guess.  Using this is not recommended for 10 or more pegs as it is slow."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1347
+msgid ""
+"When the guess is complete, the smaller feedback pegs will be highlighted; "
+"clicking on these (or moving the peg cursor to them with the arrow keys and "
+"pressing the space bar or Enter key) will mark the current guess, copy any "
+"held pegs to the next guess, and move the \\q{current guess} marker."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1351
+msgid ""
+"If you correctly position all the pegs the solution will be displayed below; "
+"if you run out of guesses (or select \\q{Solve...}) the solution will also "
+"be revealed."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1355
+msgid "\\I{parameters, for Guess}Guess parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1359
+msgid ""
+"These parameters are available from the \\q{Custom...} option on the "
+"\\q{Type} menu. The default game matches the parameters for the board game "
+"\\q{Mastermind}."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1361 puzzles.but:3226
+msgid "Colours"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1364
+msgid ""
+"Number of colours the solution is chosen from; from 2 to 10 (more is harder)."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1366
+msgid "Pegs per guess"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1368
+msgid "Number of pegs per guess (more is harder)."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1370
+msgid "Guesses"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1372
+msgid "Number of guesses you have to find the solution in (fewer is harder)."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1374
+msgid "Allow blanks"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1378
+msgid ""
+"Allows blank pegs to be given as part of a guess (makes it easier, because "
+"you know that those will never be counted as part of the solution). This is "
+"turned off by default."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1385
+msgid ""
+"Note that this doesn't allow blank pegs in the solution; if you really "
+"wanted that, use one extra colour."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1387
+msgid "Allow duplicates"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1391
+msgid ""
+"Allows the solution (and the guesses) to contain colours more than once; "
+"this increases the search space (making things harder), and is turned on by "
+"default."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1394
+msgid "\\i{Pegs}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1396
+msgid "\\cfg{winhelp-topic}{games.pegs}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1401
+msgid ""
+"A number of pegs are placed in holes on a board. You can remove a peg by "
+"jumping an adjacent peg over it (horizontally or vertically)  to a vacant "
+"hole on the other side. Your aim is to remove all but one of the pegs "
+"initially present."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1404
+msgid ""
+"This game, best known as \\I{Solitaire, Peg}\\q{Peg Solitaire}, is possibly "
+"one of the oldest puzzle games still commonly known."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1406
+msgid "\\i{Pegs controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:1407
+msgid "Pegs controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1407
+#, no-wrap
+msgid "controls, for Pegs"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1414
+msgid ""
+"To move a peg, drag it with the mouse from its current position to its final "
+"position. If the final position is exactly two holes away from the initial "
+"position, is currently unoccupied by a peg, and there is a peg in the "
+"intervening square, the move will be permitted and the intervening peg will "
+"be removed."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1418
+msgid ""
+"Vacant spaces which you can move a peg into are marked with holes. A space "
+"with no peg and no hole is not available for moving at all: it is an "
+"obstacle which you must work around."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1423
+msgid ""
+"You can also use the cursor keys to move a position indicator around the "
+"board. Pressing the return key while over a peg, followed by a cursor key, "
+"will jump the peg in that direction (if that is a legal move)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1427
+msgid "\\I{parameters, for Pegs}Pegs parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1434
+msgid "Size of grid in holes."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1436
+msgid "Board type"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1443
+msgid ""
+"Controls whether you are given a board of a standard shape or a randomly "
+"generated shape. The two standard shapes currently supported are \\q{Cross} "
+"and \\q{Octagon} (also commonly known as the English and European "
+"traditional board layouts respectively).  Selecting \\q{Random} will give "
+"you a different board shape every time (but always one that is known to have "
+"a solution)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1446
+msgid "\\i{Dominosa}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1448
+msgid "\\cfg{winhelp-topic}{games.dominosa}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1455
+msgid ""
+"A normal set of dominoes \\dash that is, one instance of every (unordered) "
+"pair of numbers from 0 to 6 \\dash has been arranged irregularly into a "
+"rectangle; then the number in each square has been written down and the "
+"dominoes themselves removed. Your task is to reconstruct the pattern by "
+"arranging the set of dominoes to match the provided array of numbers."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1458
+msgid ""
+"This puzzle is widely credited to O. S. Adler, and takes part of its name "
+"from those initials."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1460
+msgid "\\i{Dominosa controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:1461
+msgid "Dominosa controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1461
+#, no-wrap
+msgid "controls, for Dominosa"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1467
+msgid ""
+"Left-clicking between any two adjacent numbers places a domino covering "
+"them, or removes one if it is already present. Trying to place a domino "
+"which overlaps existing dominoes will remove the ones it overlaps."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1472
+msgid ""
+"Right-clicking between two adjacent numbers draws a line between them, which "
+"you can use to remind yourself that you know those two numbers are \\e{not} "
+"covered by a single domino. Right-clicking again removes the line."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1478
+msgid ""
+"You can also use the cursor keys to move a cursor around the grid.  When the "
+"cursor is half way between two adjacent numbers, pressing the return key "
+"will place a domino covering those numbers, or pressing the space bar will "
+"lay a line between the two squares.  Repeating either action removes the "
+"domino or line."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1482
+msgid ""
+"Pressing a number key will highlight all occurrences of that number. "
+"Pressing that number again will clear the highlighting. Up to two different "
+"numbers can be highlighted at any given time."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1486
+msgid "\\I{parameters, for Dominosa}Dominosa parameters"
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1491
+msgid "Maximum number on dominoes"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1496
+msgid ""
+"Controls the size of the puzzle, by controlling the size of the set of "
+"dominoes used to make it. Dominoes with numbers going up to N will give rise "
+"to an (N+2) \\by (N+1) rectangle; so, in particular, the default value of 6 "
+"gives an 8\\by\\.7 grid."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1505
+msgid ""
+"Normally, Dominosa will make sure that the puzzles it presents have only one "
+"solution. Puzzles with ambiguous sections can be more difficult and "
+"sometimes more subtle, so if you like you can turn off this feature. Also, "
+"finding \\e{all} the possible solutions can be an additional challenge for "
+"an advanced player. Turning off this option can also speed up puzzle "
+"generation."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1508
+msgid "\\i{Untangle}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1510
+msgid "\\cfg{winhelp-topic}{games.untangle}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1514
+msgid ""
+"You are given a number of points, some of which have lines drawn between "
+"them. You can move the points about arbitrarily; your aim is to position the "
+"points so that no line crosses another."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1517
+msgid ""
+"I originally saw this in the form of a Flash game called \\i{Planarity} "
+"\\k{Planarity}, written by John Tantalo."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1519
+msgid "\\W{http://planarity.net}\\cw{http://planarity.net}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1521
+msgid "\\i{Untangle controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:1522
+msgid "Untangle controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1522
+#, no-wrap
+msgid "controls, for Untangle"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1526
+msgid ""
+"To move a point, click on it with the left mouse button and drag it into a "
+"new position."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1530
+msgid "\\I{parameters, for Untangle}Untangle parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1533
+msgid ""
+"There is only one parameter available from the \\q{Custom...} option on the "
+"\\q{Type} menu:"
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1535
+msgid "Number of points"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1538
+msgid ""
+"Controls the size of the puzzle, by specifying the number of points in the "
+"generated graph."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1541
+msgid "\\i{Black Box}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1543
+msgid "\\cfg{winhelp-topic}{games.blackbox}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1547
+msgid ""
+"A number of balls are hidden in a rectangular arena. You have to deduce the "
+"positions of the balls by firing lasers positioned at the edges of the arena "
+"and observing how their beams are deflected."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1551
+msgid ""
+"Beams will travel straight from their origin until they hit the opposite "
+"side of the arena (at which point they emerge), unless affected by balls in "
+"one of the following ways:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1555
+msgid ""
+"A beam that hits a ball head-on is absorbed and will never re-emerge. This "
+"includes beams that meet a ball on the first rank of the arena."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1558
+msgid ""
+"A beam with a ball to its front-left square gets deflected 90 degrees to the "
+"right."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1561
+msgid ""
+"A beam with a ball to its front-right square gets similarly deflected to the "
+"left."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1564
+msgid ""
+"A beam that would re-emerge from its entry location is considered to be "
+"\\q{reflected}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1568
+msgid ""
+"A beam which would get deflected before entering the arena by a ball to the "
+"front-left or front-right of its entry point is also considered to be "
+"\\q{reflected}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1573
+msgid ""
+"Beams that are reflected appear as a \\q{R}; beams that hit balls head-on "
+"appear as \\q{H}. Otherwise, a number appears at the firing point and the "
+"location where the beam emerges (this number is unique to that shot)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1577
+msgid ""
+"You can place guesses as to the location of the balls, based on the entry "
+"and exit patterns of the beams; once you have placed enough balls a button "
+"appears enabling you to have your guesses checked."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1580
+msgid ""
+"Here is a diagram showing how the positions of balls can create each of the "
+"beam behaviours shown above:"
+msgstr ""
+
+#. type: c
+#: puzzles.but:1581
+#, no-wrap
+msgid "1RHR----"
+msgstr ""
+
+#. type: c
+#: puzzles.but:1582
+#, no-wrap
+msgid "|..O.O...|"
+msgstr ""
+
+#. type: c
+#: puzzles.but:1583
+#, no-wrap
+msgid "2........3"
+msgstr ""
+
+#. type: c
+#: puzzles.but:1584 puzzles.but:1585 puzzles.but:1603 puzzles.but:1604
+#: puzzles.but:1609 puzzles.but:1610
+#, no-wrap
+msgid "|........|"
+msgstr ""
+
+#. type: c
+#: puzzles.but:1586
+#, no-wrap
+msgid "3........|"
+msgstr ""
+
+#. type: c
+#: puzzles.but:1587
+#, no-wrap
+msgid "|......O.|"
+msgstr ""
+
+#. type: c
+#: puzzles.but:1588
+#, no-wrap
+msgid "H........|"
+msgstr ""
+
+#. type: c
+#: puzzles.but:1589
+#, no-wrap
+msgid "|.....O..|"
+msgstr ""
+
+#. type: c
+#: puzzles.but:1590
+#, no-wrap
+msgid "12-RR---"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1596
+msgid ""
+"As shown, it is possible for a beam to receive multiple reflections before "
+"re-emerging (see turn 3). Similarly, a beam may be reflected (possibly more "
+"than once) before receiving a hit (the \\q{H} on the left side of the "
+"example)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1601
+msgid ""
+"Note that any layout with more than 4 balls may have a non-unique solution.  "
+"The following diagram illustrates this; if you know the board contains 5 "
+"balls, it is impossible to determine where the fifth ball is (possible "
+"positions marked with an \\cw{x}):"
+msgstr ""
+
+#. type: c
+#: puzzles.but:1602 puzzles.but:1611
+#, no-wrap
+msgid "--------"
+msgstr ""
+
+#. type: c
+#: puzzles.but:1605 puzzles.but:1608
+#, no-wrap
+msgid "|..O..O..|"
+msgstr ""
+
+#. type: c
+#: puzzles.but:1606 puzzles.but:1607
+#, no-wrap
+msgid "|...xx...|"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1619
+msgid ""
+"For this reason, when you have your guesses checked, the game will check "
+"that your solution \\e{produces the same results} as the computer's, rather "
+"than that your solution is identical to the computer's. So in the above "
+"example, you could put the fifth ball at \\e{any} of the locations marked "
+"with an \\cw{x}, and you would still win."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1621
+msgid "Black Box was contributed to this collection by James Harvey."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1623
+msgid "\\i{Black Box controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:1624 puzzles.but:1625 puzzles.but:1626
+msgid "Black Box controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1624
+#, no-wrap
+msgid "controls, for Black Box"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1625
+#, no-wrap
+msgid "keys, for Black Box"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1626
+#, no-wrap
+msgid "shortcuts (keyboard), for Black Box"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1633
+msgid ""
+"To fire a laser beam, left-click in a square around the edge of the arena. "
+"The results will be displayed immediately. Clicking or holding the left "
+"button on one of these squares will highlight the current go (or a previous "
+"go) to confirm the exit point for that laser, if applicable."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1637
+msgid ""
+"To guess the location of a ball, left-click within the arena and a black "
+"circle will appear marking the guess; click again to remove the guessed ball."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1642
+msgid ""
+"Locations in the arena may be locked against modification by right-clicking; "
+"whole rows and columns may be similarly locked by right-clicking in the "
+"laser square above/below that column, or to the left/right of that row."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1646
+msgid ""
+"The cursor keys may also be used to move around the grid. Pressing the Enter "
+"key will fire a laser or add a new ball-location guess, and pressing Space "
+"will lock a cell, row, or column."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1650
+msgid ""
+"When an appropriate number of balls have been guessed, a button will appear "
+"at the top-left corner of the grid; clicking that (with mouse or cursor) "
+"will check your guesses."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1659
+msgid ""
+"If you click the \\q{check} button and your guesses are not correct, the "
+"game will show you the minimum information necessary to demonstrate this to "
+"you, so you can try again. If your ball positions are not consistent with "
+"the beam paths you already know about, one beam path will be circled to "
+"indicate that it proves you wrong. If your positions match all the existing "
+"beam paths but are still wrong, one new beam path will be revealed (written "
+"in red)  which is not consistent with your current guesses."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1669
+msgid ""
+"If you decide to give up completely, you can select Solve to reveal the "
+"actual ball positions. At this point, correctly-placed balls will be "
+"displayed as filled black circles, incorrectly-placed balls as filled black "
+"circles with red crosses, and missing balls as filled red circles. In "
+"addition, a red circle marks any laser you had already fired which is not "
+"consistent with your ball layout (just as when you press the \\q{check} "
+"button), and red text marks any laser you \\e{could} have fired in order to "
+"distinguish your ball layout from the correct one."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1673
+msgid "\\I{parameters, for Black Box}Black Box parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1681
+msgid ""
+"Size of grid in squares. There are 2 \\by \\e{Width} \\by \\e{Height} lasers "
+"per grid, two per row and two per column."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1683
+msgid "No. of balls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1690
+msgid ""
+"Number of balls to place in the grid. This can be a single number, or a "
+"range (separated with a hyphen, like \\q{2-6}), and determines the number of "
+"balls to place on the grid. The \\q{reveal} button is only enabled if you "
+"have guessed an appropriate number of balls; a guess using a different "
+"number to the original solution is still acceptable, if all the beam inputs "
+"and outputs match."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1693
+msgid "\\i{Slant}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1695
+msgid "\\cfg{winhelp-topic}{games.slant}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1699
+msgid ""
+"You have a grid of squares. Your aim is to draw a diagonal line through each "
+"square, and choose which way each line slants so that the following "
+"conditions are met:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1701
+msgid "The diagonal lines never form a loop."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1707
+msgid ""
+"Any point with a circled number has precisely that many lines meeting at it. "
+"(Thus, a 4 is the centre of a cross shape, whereas a zero is the centre of a "
+"diamond shape \\dash or rather, a partial diamond shape, because a zero can "
+"never appear in the middle of the grid because that would immediately cause "
+"a loop.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1709
+msgid "Credit for this puzzle goes to \\i{Nikoli} \\k{nikoli-slant}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1713
+msgid ""
+"\\W{http://www.nikoli.co.jp/ja/puzzles/gokigen_naname}\\cw{http://www.nikoli."
+"co.jp/ja/puzzles/gokigen_naname} (in Japanese)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1715
+msgid "\\i{Slant controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:1716
+msgid "Slant controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1716
+#, no-wrap
+msgid "controls, for Slant"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1723
+msgid ""
+"Left-clicking in a blank square will place a \\cw{\\\\} in it (a line "
+"leaning to the left, i.e. running from the top left of the square to the "
+"bottom right). Right-clicking in a blank square will place a \\cw{/} in it "
+"(leaning to the right, running from top right to bottom left)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1730
+msgid ""
+"Continuing to click either button will cycle between the three possible "
+"square contents. Thus, if you left-click repeatedly in a blank square it "
+"will change from blank to \\cw{\\\\} to \\cw{/} back to blank, and if you "
+"right-click repeatedly the square will change from blank to \\cw{/} to "
+"\\cw{\\\\} back to blank. (Therefore, you can play the game entirely with "
+"one button if you need to.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1737
+msgid ""
+"You can also use the cursor keys to move around the grid. Pressing the "
+"return or space keys will place a \\cw{\\\\} or a \\cw{/}, respectively, and "
+"will then cycle them as above.  You can also press \\cw{/} or \\cw{\\\\} to "
+"place a \\cw{/} or \\cw{\\\\}, respectively, independent of what is already "
+"in the cursor square.  Backspace removes any line from the cursor square."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1741
+msgid "\\I{parameters, for Slant}Slant parameters"
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1750 puzzles.but:1839 puzzles.but:1921 puzzles.but:2005
+#: puzzles.but:2131 puzzles.but:2247 puzzles.but:2382 puzzles.but:2452
+#: puzzles.but:2606 puzzles.but:2704 puzzles.but:2760 puzzles.but:2829
+#: puzzles.but:3129 puzzles.but:3176 puzzles.but:3290
+msgid "Difficulty"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1759
+msgid ""
+"Controls the difficulty of the generated puzzle. At Hard level, you are "
+"required to do deductions based on knowledge of \\e{relationships} between "
+"squares rather than always being able to deduce the exact contents of one "
+"square at a time. (For example, you might know that two squares slant in the "
+"same direction, even if you don't yet know what that direction is, and this "
+"might enable you to deduce something about still other squares.) Even at "
+"Hard level, guesswork and backtracking should never be necessary."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1762
+msgid "\\i{Light Up}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1764
+msgid "\\cfg{winhelp-topic}{games.lightup}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1768
+msgid ""
+"You have a grid of squares. Some are filled in black; some of the black "
+"squares are numbered. Your aim is to \\q{light up} all the empty squares by "
+"placing light bulbs in some of them."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1772
+msgid ""
+"Each light bulb illuminates the square it is on, plus all squares in line "
+"with it horizontally or vertically unless a black square is blocking the way."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1774
+msgid "To win the game, you must satisfy the following conditions:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1776
+msgid "All non-black squares are lit."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1778
+msgid "No light is lit by another light."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1781
+msgid ""
+"All numbered black squares have exactly that number of lights adjacent to "
+"them (in the four squares above, below, and to the side)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1783
+msgid ""
+"Non-numbered black squares may have any number of lights adjacent to them."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1785
+msgid "Credit for this puzzle goes to \\i{Nikoli} \\k{nikoli-lightup}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1787
+msgid "Light Up was contributed to this collection by James Harvey."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1791
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/akari.html}\\cw{http://www.nikoli.co."
+"jp/en/puzzles/akari.html} (beware of Flash)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1793
+msgid "\\i{Light Up controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:1794
+msgid "Light Up controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1794
+#, no-wrap
+msgid "controls, for Light Up"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1799
+msgid ""
+"Left-clicking in a non-black square will toggle the presence of a light in "
+"that square. Right-clicking in a non-black square toggles a mark there to "
+"aid solving; it can be used to highlight squares that cannot be lit, for "
+"example."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1801
+msgid ""
+"You may not place a light in a marked square, nor place a mark in a lit "
+"square."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1805
+msgid ""
+"The game will highlight obvious errors in red. Lights lit by other lights "
+"are highlighted in this way, as are numbered squares which do not (or "
+"cannot) have the right number of lights next to them."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1808
+msgid ""
+"Thus, the grid is solved when all non-black squares have yellow highlights "
+"and there are no red lights."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1812
+msgid "\\I{parameters, for Light Up}Light Up parameters"
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1821
+msgid "%age of black squares"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1823
+msgid "Rough percentage of black squares in the grid."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1831
+msgid ""
+"This is a hint rather than an instruction. If the grid generator is unable "
+"to generate a puzzle to this precise specification, it will increase the "
+"proportion of black squares until it can."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1833
+msgid "Symmetry"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1837
+msgid ""
+"Allows you to specify the required symmetry of the black squares in the "
+"grid. (This does not affect the difficulty of the puzzles noticeably.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1843
+msgid ""
+"\\q{Easy} means that the puzzles should be soluble without backtracking or "
+"guessing, \\q{Hard} means that some guesses will probably be necessary."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1846
+msgid "\\i{Map}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1848
+msgid "\\cfg{winhelp-topic}{games.map}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1854
+msgid ""
+"You are given a map consisting of a number of regions. Your task is to "
+"colour each region with one of four colours, in such a way that no two "
+"regions sharing a boundary have the same colour. You are provided with some "
+"regions already coloured, sufficient to make the remainder of the solution "
+"unique."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1858
+msgid ""
+"Only regions which share a length of border are required to be different "
+"colours. Two regions which meet at only one \\e{point} (i.e. are diagonally "
+"separated) may be the same colour."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1865
+msgid ""
+"I believe this puzzle is original; I've never seen an implementation of it "
+"anywhere else. The concept of a \\i{four-colouring} puzzle was suggested by "
+"Owen Dunn; credit must also go to Nikoli and to Verity Allan for inspiring "
+"the train of thought that led to me realising Owen's suggestion was a viable "
+"puzzle. Thanks also to Gareth Taylor for many detailed suggestions."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1867
+msgid "\\i{Map controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:1868
+msgid "Map controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1868
+#, no-wrap
+msgid "controls, for Map"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1873
+msgid ""
+"To colour a region, click the left mouse button on an existing region of the "
+"desired colour and drag that colour into the new region."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1876
+msgid ""
+"(The program will always ensure the starting puzzle has at least one region "
+"of each colour, so that this is always possible!)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1879
+msgid ""
+"If you need to clear a region, you can drag from an empty region, or from "
+"the puzzle boundary if there are no empty regions left."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1885
+msgid ""
+"Dragging a colour using the \\e{right} mouse button will stipple the region "
+"in that colour, which you can use as a note to yourself that you think the "
+"region \\e{might} be that colour. A region can contain stipples in multiple "
+"colours at once. (This is often useful at the harder difficulty levels.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1897
+msgid ""
+"You can also use the cursor keys to move around the map: the colour of the "
+"cursor indicates the position of the colour you would drag (which is not "
+"obvious if you're on a region's boundary, since it depends on the direction "
+"from which you approached the boundary). Pressing the return key starts a "
+"drag of that colour, as above, which you control with the cursor keys; "
+"pressing the return key again finishes the drag. The space bar can be used "
+"similarly to create a stippled region.  Double-pressing the return key "
+"(without moving the cursor) will clear the region, as a drag from an empty "
+"region does: this is useful with the cursor mode if you have filled the "
+"entire map in but need to correct the layout."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1904
+msgid ""
+"If you press L during play, the game will toggle display of a number in each "
+"region of the map. This is useful if you want to discuss a particular puzzle "
+"instance with a friend \\dash having an unambiguous name for each region is "
+"much easier than trying to refer to them all by names such as \\q{the one "
+"down and right of the brown one on the top border}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1908
+msgid "\\I{parameters, for Map}Map parameters"
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1917
+msgid "Regions"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1919
+msgid "Number of regions in the generated map."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1927
+msgid ""
+"In \\q{Easy} mode, there should always be at least one region whose colour "
+"can be determined trivially. In \\q{Normal} and \\q{Hard} modes, you will "
+"have to use increasingly complex logic to deduce the colour of some regions. "
+"However, it will always be possible without having to guess or backtrack."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1936
+msgid ""
+"In \\q{Unreasonable} mode, the program will feel free to generate puzzles "
+"which are as hard as it can possibly make them: the only constraint is that "
+"they should still have a unique solution. Solving Unreasonable puzzles may "
+"require guessing and backtracking."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1939
+msgid "\\i{Loopy}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1941
+msgid "\\cfg{winhelp-topic}{games.loopy}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1946
+msgid ""
+"You are given a grid of dots, marked with yellow lines to indicate which "
+"dots you are allowed to connect directly together. Your aim is to use some "
+"subset of those yellow lines to draw a single unbroken loop from dot to dot "
+"within the grid."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1951
+msgid ""
+"Some of the spaces between the lines contain numbers. These numbers indicate "
+"how many of the lines around that space form part of the loop. The loop you "
+"draw must correctly satisfy all of these clues to be considered a correct "
+"solution."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1955
+msgid ""
+"In the default mode, the dots are arranged in a grid of squares; however, "
+"you can also play on triangular or hexagonal grids, or even more exotic ones."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1958
+msgid "Credit for the basic puzzle idea goes to \\i{Nikoli} \\k{nikoli-loopy}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1962
+msgid ""
+"Loopy was originally contributed to this collection by Mike Pinna, and "
+"subsequently enhanced to handle various types of non-square grid by Lambros "
+"Lambrou."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1966
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/slitherlink.html}\\cw{http://www."
+"nikoli.co.jp/en/puzzles/slitherlink.html} (beware of Flash)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1968
+msgid "\\i{Loopy controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:1969
+msgid "Loopy controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:1969
+#, no-wrap
+msgid "controls, for Loopy"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1974
+msgid ""
+"Click the left mouse button on a yellow line to turn it black, indicating "
+"that you think it is part of the loop. Click again to turn the line yellow "
+"again (meaning you aren't sure yet)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1979
+msgid ""
+"If you are sure that a particular line segment is \\e{not} part of the loop, "
+"you can click the right mouse button to remove it completely. Again, "
+"clicking a second time will turn the line back to yellow."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1983
+msgid "\\I{parameters, for Loopy}Loopy parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:1993
+msgid ""
+"Size of grid, measured in number of regions across and down. For square "
+"grids, it's clear how this is counted; for other types of grid you may have "
+"to think a bit to see how the dimensions are measured."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:1995
+msgid "Grid type"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2003
+msgid ""
+"Allows you to choose between a selection of types of tiling.  Some have all "
+"the faces the same but may have multiple different types of vertex (e.g. the "
+"\\e{Cairo} or \\e{Kites} mode); others have all the vertices the same but "
+"may have different types of face (e.g.  the \\e{Great Hexagonal}). The "
+"square, triangular and honeycomb grids are fully regular, and have all their "
+"vertices \\e{and} faces the same; this makes them the least confusing to "
+"play."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2009
+msgid ""
+"Controls the difficulty of the generated puzzle.  \\#{FIXME: what "
+"distinguishes Easy, Medium, and Hard? In particular, when are backtracking/"
+"guesswork required, if ever?}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2012
+msgid "\\i{Inertia}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2014
+msgid "\\cfg{winhelp-topic}{games.inertia}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2017
+msgid ""
+"You are a small green ball sitting in a grid full of obstacles. Your aim is "
+"to collect all the gems without running into any mines."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2026
+msgid ""
+"You can move the ball in any orthogonal \\e{or diagonal} direction.  Once "
+"the ball starts moving, it will continue until something stops it. A wall "
+"directly in its path will stop it (but if it is moving diagonally, it will "
+"move through a diagonal gap between two other walls without stopping). Also, "
+"some of the squares are \\q{stops}; when the ball moves on to a stop, it "
+"will stop moving no matter what direction it was going in. Gems do \\e{not} "
+"stop the ball; it picks them up and keeps on going."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2030
+msgid ""
+"Running into a mine is fatal. Even if you picked up the last gem in the same "
+"move which then hit a mine, the game will count you as dead rather than "
+"victorious."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2034
+msgid ""
+"This game was originally implemented for Windows by Ben Olmstead \\k{bem}, "
+"who was kind enough to release his source code on request so that it could "
+"be re-implemented for this collection."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2036
+msgid "\\W{http://xn13.com/}\\cw{http://xn13.com/}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2038
+msgid "\\i{Inertia controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:2039 puzzles.but:2040 puzzles.but:2041
+msgid "Inertia controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:2039
+#, no-wrap
+msgid "controls, for Inertia"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:2040
+#, no-wrap
+msgid "keys, for Inertia"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:2041
+#, no-wrap
+msgid "shortcuts (keyboard), for Inertia"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2047
+msgid ""
+"You can move the ball in any of the eight directions using the numeric "
+"keypad. Alternatively, if you click the left mouse button on the grid, the "
+"ball will begin a move in the general direction of where you clicked."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2057
+msgid ""
+"If you use the \\q{Solve} function on this game, the program will compute a "
+"path through the grid which collects all the remaining gems and returns to "
+"the current position. A hint arrow will appear on the ball indicating the "
+"direction in which you should move to begin on this path. If you then move "
+"in that direction, the arrow will update to indicate the next direction on "
+"the path. You can also press Space to automatically move in the direction of "
+"the hint arrow. If you move in a different direction from the one shown by "
+"the arrow, arrows will be shown only if the puzzle is still solvable."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2062
+msgid ""
+"All the actions described in \\k{common-actions} are also available.  In "
+"particular, if you do run into a mine and die, you can use the Undo function "
+"and resume playing from before the fatal move. The game will keep track of "
+"the number of times you have done this."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2064
+msgid "\\I{parameters, for Inertia}Inertia parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2074
+msgid "\\i{Tents}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2076
+msgid "\\cfg{winhelp-topic}{games.tents}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2080
+msgid ""
+"You have a grid of squares, some of which contain trees. Your aim is to "
+"place tents in some of the remaining squares, in such a way that the "
+"following conditions are met:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2082
+msgid "There are exactly as many tents as trees."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2087
+msgid ""
+"The tents and trees can be matched up in such a way that each tent is "
+"directly adjacent (horizontally or vertically, but not diagonally) to its "
+"own tree. However, a tent may be adjacent to other trees as well as its own."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2090
+msgid "No two tents are adjacent horizontally, vertically \\e{or diagonally}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2093
+msgid ""
+"The number of tents in each row, and in each column, matches the numbers "
+"given round the sides of the grid."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2097
+msgid ""
+"This puzzle can be found in several places on the Internet, and was brought "
+"to my attention by e-mail. I don't know who I should credit for inventing it."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2099
+msgid "\\i{Tents controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:2100
+msgid "Tents controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:2100
+#, no-wrap
+msgid "controls, for Tents"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2106
+msgid ""
+"Left-clicking in a blank square will place a tent in it.  Right-clicking in "
+"a blank square will colour it green, indicating that you are sure it "
+"\\e{isn't} a tent. Clicking either button in an occupied square will clear "
+"it."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2111
+msgid ""
+"If you \\e{drag} with the right button along a row or column, every blank "
+"square in the region you cover will be turned green, and no other squares "
+"will be affected. (This is useful for clearing the remainder of a row once "
+"you have placed all its tents.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2118
+msgid ""
+"You can also use the cursor keys to move around the grid. Pressing the "
+"return key over an empty square will place a tent, and pressing the space "
+"bar over an empty square will colour it green; either key will clear an "
+"occupied square.  Holding Shift and pressing the cursor keys will colour "
+"empty squares green.  Holding Control and pressing the cursor keys will "
+"colour green both empty squares and squares with tents."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2122
+msgid "\\I{parameters, for Tents}Tents parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2135
+msgid ""
+"Controls the difficulty of the generated puzzle. More difficult puzzles "
+"require more complex deductions, but at present none of the available "
+"difficulty levels requires guesswork or backtracking."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2138
+msgid "\\i{Bridges}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2140
+msgid "\\cfg{winhelp-topic}{games.bridges}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2144
+msgid ""
+"You have a set of islands distributed across the playing area. Each island "
+"contains a number. Your aim is to connect the islands together with bridges, "
+"in such a way that:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2146
+msgid "Bridges run horizontally or vertically."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2149
+msgid ""
+"The number of bridges terminating at any island is equal to the number "
+"written in that island."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2152
+msgid ""
+"Two bridges may run in parallel between the same two islands, but no more "
+"than two may do so."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2154
+msgid "No bridge crosses another bridge."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2156
+msgid "All the islands are connected together."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2162
+msgid ""
+"There are some configurable alternative modes, which involve changing the "
+"parallel-bridge limit to something other than 2, and introducing the "
+"additional constraint that no sequence of bridges may form a loop from one "
+"island back to the same island. The rules stated above are the default ones."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2164
+msgid "Credit for this puzzle goes to \\i{Nikoli} \\k{nikoli-bridges}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2166
+msgid "Bridges was contributed to this collection by James Harvey."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2170
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/hashiwokakero.html}\\cw{http://www."
+"nikoli.co.jp/en/puzzles/hashiwokakero.html} (beware of Flash)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2172
+msgid "\\i{Bridges controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:2173
+msgid "Bridges controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:2173
+#, no-wrap
+msgid "controls, for Bridges"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2181
+msgid ""
+"To place a bridge between two islands, click the mouse down on one island "
+"and drag it towards the other. You do not need to drag all the way to the "
+"other island; you only need to move the mouse far enough for the intended "
+"bridge direction to be unambiguous. (So you can keep the mouse near the "
+"starting island and conveniently throw bridges out from it in many "
+"directions.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2186
+msgid ""
+"Doing this again when a bridge is already present will add another parallel "
+"bridge. If there are already as many bridges between the two islands as "
+"permitted by the current game rules (i.e. two by default), the same dragging "
+"action will remove all of them."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2190
+msgid ""
+"If you want to remind yourself that two islands definitely \\e{do not} have "
+"a bridge between them, you can right-drag between them in the same way to "
+"draw a \\q{non-bridge} marker."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2198
+msgid ""
+"If you think you have finished with an island (i.e. you have placed all its "
+"bridges and are confident that they are in the right places), you can mark "
+"the island as finished by left-clicking on it.  This will highlight it and "
+"all the bridges connected to it, and you will be prevented from accidentally "
+"modifying any of those bridges in future. Left-clicking again on a "
+"highlighted island will unmark it and restore your ability to modify it."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2206
+msgid ""
+"You can also use the cursor keys to move around the grid: if possible the "
+"cursor will always move orthogonally, otherwise it will move towards the "
+"nearest island to the indicated direction. Holding Control and pressing a "
+"cursor key will lay a bridge in that direction (if available); Shift and a "
+"cursor key will lay a \\q{non-bridge} marker.  Pressing the return key "
+"followed by a cursor key will also lay a bridge in that direction."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2209
+msgid ""
+"You can mark an island as finished by pressing the space bar or by pressing "
+"the return key twice."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2213
+msgid ""
+"By pressing a number key, you can jump to the nearest island with that "
+"number.  Letters \\q{a}, ..., \\q{f} count as 10, ..., 15 and \\q{0} as 16."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2215
+msgid "Violations of the puzzle rules will be marked in red:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2217
+msgid "An island with too many bridges will be highlighted in red."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2223
+msgid ""
+"An island with too few bridges will be highlighted in red if it is "
+"definitely an error (as opposed to merely not being finished yet): if adding "
+"enough bridges would involve having to cross another bridge or remove a non-"
+"bridge marker, or if the island has been highlighted as complete."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2230
+msgid ""
+"A group of islands and bridges may be highlighted in red if it is a closed "
+"subset of the puzzle with no way to connect it to the rest of the islands. "
+"For example, if you directly connect two 1s together with a bridge and they "
+"are not the only two islands on the grid, they will light up red to indicate "
+"that such a group cannot be contained in any valid solution."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2234
+msgid ""
+"If you have selected the (non-default) option to disallow loops in the "
+"solution, a group of bridges which forms a loop will be highlighted."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2238
+msgid "\\I{parameters, for Bridges}Bridges parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2249
+msgid "Difficulty level of puzzle."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:2251
+msgid "Allow loops"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2255
+msgid ""
+"This is set by default. If cleared, puzzles will be generated in such a way "
+"that they are always soluble without creating a loop, and solutions which do "
+"involve a loop will be disallowed."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:2257
+msgid "Max. bridges per direction"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2261
+msgid ""
+"Maximum number of bridges in any particular direction. The default is 2, but "
+"you can change it to 1, 3 or 4. In general, fewer is easier."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:2263
+msgid "%age of island squares"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2267
+msgid ""
+"Gives a rough percentage of islands the generator will try and lay before "
+"finishing the puzzle. Certain layouts will not manage to lay enough islands; "
+"this is an upper bound."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:2269
+msgid "Expansion factor (%age)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2276
+msgid ""
+"The grid generator works by picking an existing island at random (after "
+"first creating an initial island somewhere). It then decides on a direction "
+"(at random), and then works out how far it could extend before creating "
+"another island. This parameter determines how likely it is to extend as far "
+"as it can, rather than choosing somewhere closer."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2284
+msgid ""
+"High expansion factors usually mean easier puzzles with fewer possible "
+"islands; low expansion factors can create lots of tightly-packed islands."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2287
+msgid "\\i{Unequal}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2289
+msgid "\\cfg{winhelp-topic}{games.unequal}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2293
+msgid ""
+"You have a square grid; each square may contain a digit from 1 to the size "
+"of the grid, and some squares have clue signs between them. Your aim is to "
+"fully populate the grid with numbers such that:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2295 puzzles.but:2517
+msgid "Each row contains only one occurrence of each digit"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2297 puzzles.but:2519
+msgid "Each column contains only one occurrence of each digit"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2299
+msgid "All the clue signs are satisfied."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2301
+msgid "There are two modes for this game, \\q{Unequal} and \\q{Adjacent}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2305
+msgid ""
+"In \\q{Unequal} mode, the clue signs are greater-than symbols indicating one "
+"square's value is greater than its neighbour's. In this mode not all clues "
+"may be visible, particularly at higher difficulty levels."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2311
+msgid ""
+"In \\q{Adjacent} mode, the clue signs are bars indicating one square's value "
+"is numerically adjacent (i.e. one higher or one lower)  than its neighbour. "
+"In this mode all clues are always visible: absence of a bar thus means that "
+"a square's value is definitely not numerically adjacent to that neighbour's."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2315
+msgid ""
+"In \\q{Trivial} difficulty level (available via the \\q{Custom} game type "
+"selector), there are no greater-than signs in \\q{Unequal} mode; the puzzle "
+"is to solve the \\i{Latin square} only."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2318
+msgid ""
+"At the time of writing, the \\q{Unequal} mode of this puzzle is appearing in "
+"the Guardian weekly under the name \\q{\\i{Futoshiki}}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2320
+msgid "Unequal was contributed to this collection by James Harvey."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2322
+msgid "\\i{Unequal controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:2323
+msgid "Unequal controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:2323
+#, no-wrap
+msgid "controls, for Unequal"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2326
+msgid "Unequal shares much of its control system with Solo."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2331
+msgid ""
+"To play Unequal, simply click the mouse in any empty square and then type a "
+"digit or letter on the keyboard to fill that square. If you make a mistake, "
+"click the mouse in the incorrect square and press Space to clear it again "
+"(or use the Undo feature)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2354
+msgid ""
+"As for Solo, the cursor keys can be used in conjunction with the digit keys "
+"to set numbers or pencil marks. You can also use the \\q{M} key to auto-fill "
+"every numeric hint, ready for removal as required, or the \\q{H} key to do "
+"the same but also to remove all obvious hints."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2365
+msgid ""
+"Left-clicking a clue will mark it as done (grey it out), or unmark it if it "
+"is already marked.  Holding Control or Shift and pressing an arrow key "
+"likewise marks any clue adjacent to the cursor in the given direction."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2369
+msgid "\\I{parameters, for Unequal}Unequal parameters"
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:2374
+msgid "Mode"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2376
+msgid "Mode of the puzzle (\\q{Unequal} or \\q{Adjacent})"
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:2378
+msgid "Size (s*s)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2380
+msgid "Size of grid."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2389
+msgid ""
+"Controls the difficulty of the generated puzzle. At Trivial level, there are "
+"no greater-than signs; the puzzle is to solve the Latin square only. At "
+"Recursive level (only available via the \\q{Custom} game type selector) "
+"backtracking will be required, but the solution should still be unique. The "
+"levels in between require increasingly complex reasoning to avoid having to "
+"backtrack."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2393
+msgid "\\i{Galaxies}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2395
+msgid "\\cfg{winhelp-topic}{games.galaxies}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2401
+msgid ""
+"You have a rectangular grid containing a number of dots. Your aim is to draw "
+"edges along the grid lines which divide the rectangle into regions in such a "
+"way that every region is 180\\u00b0{-degree} rotationally symmetric, and "
+"contains exactly one dot which is located at its centre of symmetry."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2405
+msgid ""
+"This puzzle was invented by \\i{Nikoli} \\k{nikoli-galaxies}, under the name "
+"\\q{Tentai Show}; its name is commonly translated into English as \\q{Spiral "
+"Galaxies}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2407
+msgid "Galaxies was contributed to this collection by James Harvey."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2409
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/astronomical_show.html}\\cw{http://"
+"www.nikoli.co.jp/en/puzzles/astronomical_show.html}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2411
+msgid "\\i{Galaxies controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:2412
+msgid "Galaxies controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:2412
+#, no-wrap
+msgid "controls, for Galaxies"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2420
+msgid ""
+"Left-click on any grid line to draw an edge if there isn't one already, or "
+"to remove one if there is. When you create a valid region (one which is "
+"closed, contains exactly one dot, is 180\\u00b0{-degree} symmetric about "
+"that dot, and contains no extraneous edges inside it) it will be highlighted "
+"automatically; so your aim is to have the whole grid highlighted in that way."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2432
+msgid ""
+"During solving, you might know that a particular grid square belongs to a "
+"specific dot, but not be sure of where the edges go and which other squares "
+"are connected to the dot. In order to mark this so you don't forget, you can "
+"right-click on the dot and drag, which will create an arrow marker pointing "
+"at the dot. Drop that in a square of your choice and it will remind you "
+"which dot it's associated with.  You can also right-click on existing arrows "
+"to pick them up and move them, or destroy them by dropping them off the edge "
+"of the grid.  (Also, if you're not sure which dot an arrow is pointing at, "
+"you can pick it up and move it around to make it clearer. It will swivel "
+"constantly as you drag it, to stay pointed at its parent dot.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2439
+msgid ""
+"You can also use the cursor keys to move around the grid squares and lines.  "
+"Pressing the return key when over a grid line will draw or clear its edge, "
+"as above. Pressing the return key when over a dot will pick up an arrow, to "
+"be dropped the next time the return key is pressed; this can also be used to "
+"move existing arrows around, removing them by dropping them on a dot or "
+"another arrow."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2443
+msgid "\\I{parameters, for Galaxies}Galaxies parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2456
+msgid ""
+"Controls the difficulty of the generated puzzle. More difficult puzzles "
+"require more complex deductions, and the \\q{Unreasonable} difficulty level "
+"may require backtracking."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2460
+msgid "\\i{Filling}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2462
+msgid "\\cfg{winhelp-topic}{games.filling}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2467
+msgid ""
+"You have a grid of squares, some of which contain digits, and the rest of "
+"which are empty. Your job is to fill in digits in the empty squares, in such "
+"a way that each connected region of squares all containing the same digit "
+"has an area equal to that digit."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2470
+msgid ""
+"(\\q{Connected region}, for the purposes of this game, does not count "
+"diagonally separated squares as adjacent.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2475
+msgid ""
+"For example, it follows that no square can contain a zero, and that two "
+"adjacent squares can not both contain a one.  No region has an area greater "
+"than 9 (because then its area would not be a single digit)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2477
+msgid "Credit for this puzzle goes to \\i{Nikoli} \\k{nikoli-fillomino}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2479
+msgid "Filling was contributed to this collection by Jonas K\\u00F6{oe}lker."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2482
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/fillomino.html}\\cw{http://www.nikoli."
+"co.jp/en/puzzles/fillomino.html}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2484
+msgid "\\I{controls, for Filling}Filling controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2491
+msgid ""
+"To play Filling, simply click the mouse in any empty square and then type a "
+"digit on the keyboard to fill that square. By dragging the mouse, you can "
+"select multiple squares to fill with a single keypress.  If you make a "
+"mistake, click the mouse in the incorrect square and press 0, Space, "
+"Backspace or Enter to clear it again (or use the Undo feature)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2498
+msgid ""
+"You can also move around the grid with the cursor keys; typing a digit will "
+"fill the square containing the cursor with that number; typing 0 will clear "
+"it.  You can also select multiple squares for numbering or clearing with the "
+"return and arrow keys, before typing a digit to fill or clear the "
+"highlighted squares (as above).  The space bar adds and removes single "
+"squares to and from the selection.  Backspace and escape remove all squares "
+"from the selection."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2502
+msgid "\\I{parameters, for Filling}Filling parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2505
+msgid ""
+"Filling allows you to configure the number of rows and columns of the grid, "
+"through the \\q{Type} menu."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2508
+msgid "\\i{Keen}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2510
+msgid "\\cfg{winhelp-topic}{games.keen}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2515
+msgid ""
+"You have a square grid; each square may contain a digit from 1 to the size "
+"of the grid. The grid is divided into blocks of varying shape and size, with "
+"arithmetic clues written in them. Your aim is to fully populate the grid "
+"with digits such that:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2523
+msgid ""
+"The digits in each block can be combined to form the number stated in the "
+"clue, using the arithmetic operation given in the clue. That is:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2550
+msgid ""
+"An addition clue means that the sum of the digits in the block must be the "
+"given number. For example, \\q{15+} means the contents of the block adds up "
+"to fifteen."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2550
+msgid ""
+"A multiplication clue (e.g. \\q{60\\times}), similarly, means that the "
+"product of the digits in the block must be the given number."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2550
+msgid ""
+"A subtraction clue will always be written in a block of size two, and it "
+"means that one of the digits in the block is greater than the other by the "
+"given amount. For example, \\q{2\\minus} means that one of the digits in the "
+"block is 2 more than the other, or equivalently that one digit minus the "
+"other one is 2. The two digits could be either way round, though."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2550
+msgid ""
+"A division clue (e.g. \\q{3\\divide}), similarly, is always in a block of "
+"size two and means that one digit divided by the other is equal to the given "
+"amount."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2550
+msgid ""
+"Note that a block may contain the same digit more than once (provided the "
+"identical ones are not in the same row and column).  This rule is precisely "
+"the opposite of the rule in Solo's \\q{Killer} mode (see \\k{solo})."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2552
+msgid "This puzzle appears in the Times under the name \\q{\\i{KenKen}}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2555
+msgid "\\i{Keen controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:2556
+msgid "Keen controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:2556
+#, no-wrap
+msgid "controls, for Keen"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2559
+msgid "Keen shares much of its control system with Solo (and Unequal)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2564
+msgid ""
+"To play Keen, simply click the mouse in any empty square and then type a "
+"digit on the keyboard to fill that square. If you make a mistake, click the "
+"mouse in the incorrect square and press Space to clear it again (or use the "
+"Undo feature)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2588 puzzles.but:2682
+msgid ""
+"As for Solo, the cursor keys can be used in conjunction with the digit keys "
+"to set numbers or pencil marks. Use the cursor keys to move a highlight "
+"around the grid, and type a digit to enter it in the highlighted square. "
+"Pressing return toggles the highlight into a mode in which you can enter or "
+"remove pencil marks."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2591 puzzles.but:2685
+msgid ""
+"Pressing M will fill in a full set of pencil marks in every square that does "
+"not have a main digit in it."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2595
+msgid "\\I{parameters, for Keen}Keen parameters"
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:2600 puzzles.but:2698
+msgid "Grid size"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2604 puzzles.but:2702
+msgid ""
+"Specifies the size of the grid. Lower limit is 3; upper limit is 9 (because "
+"the user interface would become more difficult with \\q{digits} bigger than "
+"9!)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2611 puzzles.but:2709
+msgid ""
+"Controls the difficulty of the generated puzzle. At Unreasonable level, some "
+"backtracking will be required, but the solution should still be unique. The "
+"remaining levels require increasingly complex reasoning to avoid having to "
+"backtrack."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:2613
+msgid "Multiplication only"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2616
+msgid ""
+"If this is enabled, all boxes will be multiplication boxes.  With this rule, "
+"the puzzle is known as \\q{Inshi No Heya}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2618
+msgid "\\i{Towers}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2620
+msgid "\\cfg{winhelp-topic}{games.towers}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2624
+msgid ""
+"You have a square grid. On each square of the grid you can build a tower, "
+"with its height ranging from 1 to the size of the grid.  Around the edge of "
+"the grid are some numeric clues."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2626
+msgid "Your task is to build a tower on every square, in such a way that:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2628
+msgid "Each row contains every possible height of tower once"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2630
+msgid "Each column contains every possible height of tower once"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2638
+msgid ""
+"Each numeric clue describes the number of towers that can be seen if you "
+"look into the square from that direction, assuming that shorter towers are "
+"hidden behind taller ones. For example, in a 5\\by\\.5 grid, a clue marked "
+"\\q{5} indicates that the five tower heights must appear in increasing order "
+"(otherwise you would not be able to see all five towers), whereas a clue "
+"marked \\q{1} indicates that the tallest tower (the one marked 5) must come "
+"first."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2642
+msgid ""
+"In harder or larger puzzles, some towers will be specified for you as well "
+"as the clues round the edge, and some edge clues may be missing."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2645
+msgid ""
+"This puzzle appears on the web under various names, particularly "
+"\\q{\\i{Skyscrapers}}, but I don't know who first invented it."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2648
+msgid "\\i{Towers controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:2649
+msgid "Towers controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:2649
+#, no-wrap
+msgid "controls, for Towers"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2652
+msgid "Towers shares much of its control system with Solo, Unequal and Keen."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2658
+msgid ""
+"To play Towers, simply click the mouse in any empty square and then type a "
+"digit on the keyboard to fill that square with a tower of the given height. "
+"If you make a mistake, click the mouse in the incorrect square and press "
+"Space to clear it again (or use the Undo feature)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2663
+msgid ""
+"If you \\e{right}-click in a square and then type a number, that number will "
+"be entered in the square as a \\q{pencil mark}. You can have pencil marks "
+"for multiple numbers in the same square. A square containing a tower cannot "
+"also contain pencil marks."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2689
+msgid ""
+"Left-clicking a clue will mark it as done (grey it out), or unmark it if it "
+"is already marked.  Holding Control or Shift and pressing an arrow key "
+"likewise marks any clue in the given direction."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2693
+msgid "\\I{parameters, for Towers}Towers parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2712
+msgid "\\i{Singles}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2714
+msgid "\\cfg{winhelp-topic}{games.singles}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2718
+msgid ""
+"You have a grid of white squares, all of which contain numbers. Your task is "
+"to colour some of the squares black (removing the number) so as to satisfy "
+"all of the following conditions:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2720
+msgid "No number occurs more than once in any row or column."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2723
+msgid ""
+"No black square is horizontally or vertically adjacent to any other black "
+"square."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2726
+msgid ""
+"The remaining white squares must all form one contiguous region (connected "
+"by edges, not just touching at corners)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2729
+msgid ""
+"Credit for this puzzle goes to \\i{Nikoli} \\k{nikoli-hitori} who call it "
+"\\i{Hitori}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2731
+msgid "Singles was contributed to this collection by James Harvey."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2735
+msgid ""
+"\\W{http://www.nikoli.com/en/puzzles/hitori.html}\\cw{http://www.nikoli.com/"
+"en/puzzles/hitori.html} (beware of Flash)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2737
+msgid "\\i{Singles controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:2738
+msgid "Singles controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:2738
+#, no-wrap
+msgid "controls, for Singles"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2743
+msgid ""
+"Left-clicking on an empty square will colour it black; left-clicking again "
+"will restore the number. Right-clicking will add a circle (useful for "
+"indicating that a cell is definitely not black)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2747
+msgid ""
+"You can also use the cursor keys to move around the grid. Pressing the "
+"return or space keys will turn a square black or add a circle respectively, "
+"and pressing the key again will restore the number or remove the circle."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2751
+msgid "\\I{parameters, for Singles}Singles parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2762 puzzles.but:3131 puzzles.but:3178
+msgid "Controls the difficulty of the generated puzzle."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2765
+msgid "\\i{Magnets}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2767
+msgid "\\cfg{winhelp-topic}{games.magnets}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2774
+msgid ""
+"A rectangular grid has been filled with a mixture of magnets (that is, "
+"dominoes with one positive end and one negative end) and blank dominoes "
+"(that is, dominoes with two neutral poles).  These dominoes are initially "
+"only seen in silhouette. Around the grid are placed a number of clues "
+"indicating the number of positive and negative poles contained in certain "
+"columns and rows."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2779
+msgid ""
+"Your aim is to correctly place the magnets and blank dominoes such that all "
+"the clues are satisfied, with the additional constraint that no two similar "
+"magnetic poles may be orthogonally adjacent (since they repel).  Neutral "
+"poles do not repel, and can be adjacent to any other pole."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2781
+msgid "Credit for this puzzle goes to \\i{Janko} \\k{janko-magnets}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2783
+msgid "Magnets was contributed to this collection by James Harvey."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2786
+msgid ""
+"\\W{http://www.janko.at/Raetsel/Magnete/index.htm}\\cw{http://www.janko.at/"
+"Raetsel/Magnete/index.htm}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2788
+msgid "\\i{Magnets controls}"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:2789
+msgid "Magnets controls"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:2789
+#, no-wrap
+msgid "controls, for Magnets"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2795
+msgid ""
+"Left-clicking on an empty square places a magnet at that position with the "
+"positive pole on the square and the negative pole on the other half of the "
+"magnet; left-clicking again reverses the polarity, and a third click removes "
+"the magnet."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2800
+msgid ""
+"Right-clicking on an empty square places a blank domino there.  Right-"
+"clicking again places two question marks on the domino, signifying \\q{this "
+"cannot be blank} (which can be useful to note deductions while solving), and "
+"right-clicking again empties the domino."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2803 puzzles.but:3116
+msgid ""
+"Left-clicking a clue will mark it as done (grey it out), or unmark it if it "
+"is already marked."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2809
+msgid ""
+"You can also use the cursor keys to move a cursor around the grid.  Pressing "
+"the return key will lay a domino with a positive pole at that position; "
+"pressing again reverses the polarity and then removes the domino, as with "
+"left-clicking. Using the space bar allows placement of blank dominoes and "
+"cannot-be-blank hints, as for right-clicking."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2813
+msgid "\\I{parameters, for Magnets}Magnets parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2821
+msgid ""
+"Size of grid in squares. There will be half \\e{Width} \\by \\e{Height} "
+"dominoes in the grid: if this number is odd then one square will be blank."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2827
+msgid "(Grids with at least one odd dimension tend to be easier to solve.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2833
+msgid ""
+"Controls the difficulty of the generated puzzle. At Tricky level, you are "
+"required to make more deductions about empty dominoes and row/column counts."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:2835
+msgid "Strip clues"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2838
+msgid ""
+"If true, some of the clues around the grid are removed at generation time, "
+"making the puzzle more difficult."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2841
+msgid "\\i{Signpost}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2843
+msgid "\\cfg{winhelp-topic}{games.signpost}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2853
+msgid ""
+"You have a grid of squares; each square (except the last one)  contains an "
+"arrow, and some squares also contain numbers. Your job is to connect the "
+"squares to form a continuous list of numbers starting at 1 and linked in the "
+"direction of the arrows \\dash so the arrow inside the square with the "
+"number 1 will point to the square containing the number 2, which will point "
+"to the square containing the number 3, etc. Each square can be any distance "
+"away from the previous one, as long as it is somewhere in the direction of "
+"the arrow."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2856
+msgid ""
+"By convention the first and last numbers are shown; one or more interim "
+"numbers may also appear at the beginning."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2859
+msgid ""
+"Credit for this puzzle goes to \\i{Janko} \\k{janko-arrowpath}, who call it "
+"\\q{Pfeilpfad} (\\q{arrow path})."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2861
+msgid "Signpost was contributed to this collection by James Harvey."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2864
+msgid ""
+"\\W{http://janko.at/Raetsel/Pfeilpfad/index.htm}\\cw{http://janko.at/Raetsel/"
+"Pfeilpfad/index.htm}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2866
+msgid "\\I{controls, for Signpost}Signpost controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2871
+msgid ""
+"To play Signpost, you connect squares together by dragging from one square "
+"to another, indicating that they are adjacent in the sequence. Drag with the "
+"left button from a square to its successor, or with the right button from a "
+"square to its predecessor."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2879
+msgid ""
+"If you connect together two squares in this way and one of them has a number "
+"in it, the appropriate number will appear in the other square. If you "
+"connect two non-numbered squares, they will be assigned temporary algebraic "
+"labels: on the first occasion, they will be labelled \\cq{a} and \\cq{a+1}, "
+"and then \\cq{b} and \\cq{b+1}, and so on. Connecting more squares on to the "
+"ends of such a chain will cause them all to be labelled with the same letter."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2882
+msgid ""
+"When you left-click or right-click in a square, the legal squares to connect "
+"it to will be shown."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2888
+msgid ""
+"The arrow in each square starts off black, and goes grey once you connect "
+"the square to its successor. Also, each square which needs a predecessor has "
+"a small dot in the bottom left corner, which vanishes once you link a square "
+"to it. So your aim is always to connect a square with a black arrow to a "
+"square with a dot."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2892
+msgid ""
+"To remove any links for a particular square (both incoming and outgoing), "
+"left-drag it off the grid. To remove a whole chain, right-drag any square in "
+"the chain off the grid."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2899
+msgid ""
+"You can also use the cursor keys to move around the grid squares and lines. "
+"Pressing the return key when over a square starts a link operation, and "
+"pressing the return key again over a square will finish the link, if "
+"allowable. Pressing the space bar over a square will show the other squares "
+"pointing to it, and allow you to form a backward link, and pressing the "
+"space bar again cancels this."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2903
+msgid "\\I{parameters, for Signpost}Signpost parameters"
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:2912
+msgid "Force start/end to corners"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2916
+msgid ""
+"If true, the start and end squares are always placed in opposite corners "
+"(the start at the top left, and the end at the bottom right). If false the "
+"start and end squares are placed randomly (although always both shown)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2918
+msgid "\\i{Range}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2920
+msgid "\\cfg{winhelp-topic}{games.range}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2924
+msgid ""
+"You have a grid of squares; some squares contain numbers.  Your job is to "
+"colour some of the squares black, such that several criteria are satisfied:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2926
+msgid "no square with a number is coloured black."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2928
+msgid "no two black squares are adjacent (horizontally or vertically)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2931
+msgid ""
+"for any two white squares, there is a path between them using only white "
+"squares."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2937
+msgid ""
+"for each square with a number, that number denotes the total number of white "
+"squares reachable from that square going in a straight line in any "
+"horizontal or vertical direction until hitting a wall or a black square; the "
+"square with the number is included in the total (once)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2943
+msgid ""
+"For instance, a square containing the number one must have four black "
+"squares as its neighbours by the last criterion; but then it's impossible "
+"for it to be connected to any outside white square, which violates the "
+"second to last criterion.  So no square will contain the number one."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2947
+msgid ""
+"Credit for this puzzle goes to \\i{Nikoli}, who have variously called it "
+"\\q{Kurodoko}, \\q{Kuromasu} or \\q{Where is Black Cells}.  \\k{nikoli-"
+"range}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2949
+msgid "Range was contributed to this collection by Jonas K\\u00F6{oe}lker."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2952
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/where_is_black_cells.html}\\cw{http://"
+"www.nikoli.co.jp/en/puzzles/where_is_black_cells.html}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2954
+msgid "\\I{controls, for Range}Range controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2960
+msgid ""
+"Click with the left button to paint a square black, or with the right button "
+"to mark a square with a dot to indicate that you are sure it should \\e{not} "
+"be painted black. Repeated clicking with either button will cycle the square "
+"through the three possible states (filled, dotted or empty) in opposite "
+"directions."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2966
+msgid ""
+"You can also use the cursor keys to move around the grid squares.  Pressing "
+"Return does the same as clicking with the left button, while pressing Space "
+"does the same as a right button click.  Moving with the cursor keys while "
+"holding Shift will place dots in all squares that are moved through."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2971
+msgid "\\I{parameters, for Range}Range parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2980
+msgid "\\i{Pearl}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2982
+msgid "\\cfg{winhelp-topic}{games.pearl}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2990
+msgid ""
+"You have a grid of squares. Your job is to draw lines between the centres of "
+"horizontally or vertically adjacent squares, so that the lines form a single "
+"closed loop. In the resulting grid, some of the squares that the loop passes "
+"through will contain corners, and some will be straight horizontal or "
+"vertical lines. (And some squares can be completely empty \\dash the loop "
+"doesn't have to pass through every square.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2993
+msgid ""
+"Some of the squares contain black and white circles, which are clues that "
+"the loop must satisfy."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2996
+msgid ""
+"A black circle in a square indicates that that square is a corner, but "
+"neither of the squares adjacent to it in the loop is also a corner."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:2999
+msgid ""
+"A white circle indicates that the square is a straight edge, but \\e{at "
+"least one} of the squares adjacent to it in the loop is a corner."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3004
+msgid ""
+"(In both cases, the clue only constrains the two squares adjacent \\e{in the "
+"loop}, that is, the squares that the loop passes into after leaving the clue "
+"square. The squares that are only adjacent \\e{in the grid} are not "
+"constrained.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3007
+msgid ""
+"Credit for this puzzle goes to \\i{Nikoli}, who call it \\q{Masyu}.  "
+"\\k{nikoli-pearl}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3009
+msgid "Thanks to James Harvey for assistance with the implementation."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3013
+msgid ""
+"\\W{http://www.nikoli.co.jp/en/puzzles/masyu.html}\\cw{http://www.nikoli.co."
+"jp/en/puzzles/masyu.html} (beware of Flash)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3015
+msgid "\\I{controls, for Pearl}Pearl controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3018
+msgid ""
+"Click with the left button on a grid edge to draw a segment of the loop "
+"through that edge, or to remove a segment once it is drawn."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3023
+msgid ""
+"Drag with the left button through a series of squares to draw more than one "
+"segment of the loop in one go. Alternatively, drag over an existing part of "
+"the loop to undraw it, or to undraw part of it and then go in a different "
+"direction."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3029
+msgid ""
+"Click with the right button on a grid edge to mark it with a cross, "
+"indicating that you are sure the loop does not go through that edge.  (For "
+"instance, if you have decided which of the squares adjacent to a white clue "
+"has to be a corner, but don't yet know which way the corner turns, you might "
+"mark the one way it \\e{can't} go with a cross.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3035
+msgid ""
+"Alternatively, use the cursor keys to move the cursor.  Use the Enter key to "
+"begin and end keyboard \\q{drag} operations.  Use the Space, Escape or "
+"Backspace keys to cancel the drag.  Or, hold Control while dragging with the "
+"cursor keys to toggle segments as you move between squares."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3038
+msgid ""
+"Pressing Control-Shift-arrowkey or Shift-arrowkey simulates a left or right "
+"click, respectively, on the edge in the direction of the key."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3042
+msgid "\\I{parameters, for Pearl}Pearl parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3047
+msgid "\\i{Undead}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3049
+msgid "\\cfg{winhelp-topic}{games.undead}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3053
+msgid ""
+"You are given a grid of squares, some of which contain diagonal mirrors. "
+"Every square which is not a mirror must be filled with one of three types of "
+"undead monster: a ghost, a vampire, or a zombie."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3058
+msgid ""
+"Vampires can be seen directly, but are invisible when reflected in mirrors. "
+"Ghosts are the opposite way round: they can be seen in mirrors, but are "
+"invisible when looked at directly. Zombies are visible by any means."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3066
+msgid ""
+"You are also told the total number of each type of monster in the grid. Also "
+"around the edge of the grid are written numbers, which indicate how many "
+"monsters can be seen if you look into the grid along a row or column "
+"starting from that position. (The diagonal mirrors are reflective on both "
+"sides. If your reflected line of sight crosses the same monster more than "
+"once, the number will count it each time it is visible, not just once.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3069
+msgid ""
+"This puzzle type was invented by David Millar, under the name \\q{Haunted "
+"Mirror Maze}. See \\k{janko-undead} for more details."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3071
+msgid "Undead was contributed to this collection by Steffen Bauer."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3074
+msgid ""
+"\\W{http://www.janko.at/Raetsel/Spukschloss/index.htm}\\cw{http://www.janko."
+"at/Raetsel/Spukschloss/index.htm}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3076
+msgid "\\I{controls, for Undead}Undead controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3078
+msgid "Undead has a similar control system to Solo, Unequal and Keen."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3084
+msgid ""
+"To play Undead, click the mouse in any empty square and then type a letter "
+"on the keyboard indicating the type of monster: \\q{G} for a ghost, \\q{V} "
+"for a vampire, or \\q{Z} for a zombie. If you make a mistake, click the "
+"mouse in the incorrect square and press Space to clear it again (or use the "
+"Undo feature)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3090
+msgid ""
+"If you \\e{right}-click in a square and then type a letter, the "
+"corresponding monster will be shown in reduced size in that square, as a "
+"\\q{pencil mark}. You can have pencil marks for multiple monsters in the "
+"same square. A square containing a full-size monster cannot also contain "
+"pencil marks."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3096
+msgid ""
+"The game pays no attention to pencil marks, so exactly what you use them for "
+"is up to you: you can use them as reminders that a particular square needs "
+"to be re-examined once you know more about a particular monster, or you can "
+"use them as lists of the possible monster in a given square, or anything "
+"else you feel like."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3099
+msgid ""
+"To erase a single pencil mark, right-click in the square and type the same "
+"letter again."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3103
+msgid ""
+"All pencil marks in a square are erased when you left-click and type a "
+"monster letter, or when you left-click and press Space. Right-clicking and "
+"pressing space will also erase pencil marks."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3109
+msgid ""
+"As for Solo, the cursor keys can be used in conjunction with the letter keys "
+"to place monsters or pencil marks. Use the cursor keys to move a highlight "
+"around the grid, and type a monster letter to enter it in the highlighted "
+"square. Pressing return toggles the highlight into a mode in which you can "
+"enter or remove pencil marks."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3113
+msgid ""
+"If you prefer plain letters of the alphabet to cute monster pictures, you "
+"can press \\q{A} to toggle between showing the monsters as monsters or "
+"showing them as letters."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3120
+msgid "\\I{parameters, for Undead}Undead parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3133
+msgid "\\i{Unruly}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3135
+msgid "\\cfg{winhelp-topic}{games.unruly}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3141
+msgid ""
+"You are given a grid of squares, which you must colour either black or "
+"white. Some squares are provided as clues; the rest are left for you to fill "
+"in. Each row and column must contain the same number of black and white "
+"squares, and no row or column may contain three consecutive squares of the "
+"same colour."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3144
+msgid ""
+"This puzzle type was invented by Adolfo Zanellati, under the name \\q{Tohu "
+"wa Vohu}. See \\k{janko-unruly} for more details."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3146
+msgid "Unruly was contributed to this collection by Lennard Sprong."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3149
+msgid ""
+"\\W{http://www.janko.at/Raetsel/Tohu-Wa-Vohu/index.htm}\\cw{http://www.janko."
+"at/Raetsel/Tohu-Wa-Vohu/index.htm}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3151
+msgid "\\I{controls, for Unruly}Unruly controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3157
+msgid ""
+"To play Unruly, click the mouse in a square to change its colour.  Left-"
+"clicking an empty square will turn it black, and right-clicking will turn it "
+"white. Keep clicking the same button to cycle through the three possible "
+"states for the square. If you middle-click in a square it will be reset to "
+"empty."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3162
+msgid ""
+"You can also use the cursor keys to move around the grid. Pressing the "
+"return or space keys will turn an empty square black or white respectively "
+"(and then cycle the colours in the same way as the mouse buttons), and "
+"pressing Backspace will reset a square to empty."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3166
+msgid "\\I{parameters, for Unruly}Unruly parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3174
+msgid ""
+"Size of grid in squares. (Note that the rules of the game require both the "
+"width and height to be even numbers.)"
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:3180
+msgid "Unique rows and columns"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3183
+msgid ""
+"If enabled, no two rows are permitted to have exactly the same pattern, and "
+"likewise columns. (A row and a column can match, though.)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3185
+msgid "\\i{Flood}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3187
+msgid "\\cfg{winhelp-topic}{games.flood}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3194
+msgid ""
+"You are given a grid of squares, coloured at random in multiple colours. In "
+"each move, you can flood-fill the top left square in a colour of your choice "
+"(i.e. every square reachable from the starting square by an orthogonally "
+"connected path of squares all the same colour will be filled in the new "
+"colour). As you do this, more and more of the grid becomes connected to the "
+"starting square."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3199
+msgid ""
+"Your aim is to make the whole grid the same colour, in as few moves as "
+"possible. The game will set a limit on the number of moves, based on running "
+"its own internal solver. You win if you can make the whole grid the same "
+"colour in that many moves or fewer."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3202
+msgid ""
+"I saw this game (with a fixed grid size, fixed number of colours, and fixed "
+"move limit) at http://floodit.appspot.com (no longer accessible)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3204
+msgid "\\I{controls, for Flood}Flood controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3209
+msgid ""
+"To play Flood, click the mouse in a square. The top left corner and "
+"everything connected to it will be flood-filled with the colour of the "
+"square you clicked. Clicking a square the same colour as the top left corner "
+"has no effect, and therefore does not count as a move."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3213
+msgid ""
+"You can also use the cursor keys to move a cursor (outline black square) "
+"around the grid. Pressing the return key will fill the top left corner in "
+"the colour of the square under the cursor."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3217
+msgid "\\I{parameters, for Flood}Flood parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3224 puzzles.but:3288
+msgid "Size of the grid, in squares."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3230
+msgid ""
+"Number of colours used to fill the grid. Must be at least 3 (with two "
+"colours there would only be one legal move at any stage, hence no choice to "
+"make at all), and at most 10."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:3232
+msgid "Extra moves permitted"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3239
+msgid ""
+"Controls the difficulty of the puzzle, by increasing the move limit. In each "
+"new grid, Flood will run an internal solver to generate its own solution, "
+"and then the value in this field will be added to the length of Flood's "
+"solution to generate the game's move limit. So a value of 0 requires you to "
+"be just as efficient as Flood's automated solver, and a larger value makes "
+"it easier."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3248
+msgid ""
+"(Note that Flood's internal solver will not necessarily find the shortest "
+"possible solution, though I believe it's pretty close. For a real challenge, "
+"set this value to 0 and then try to solve a grid in \\e{strictly fewer} "
+"moves than the limit you're given!)"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3250
+msgid "\\i{Tracks}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3252
+msgid "\\cfg{winhelp-topic}{games.tracks}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3257
+msgid ""
+"You are given a grid of squares, some of which are filled with train tracks. "
+"You need to complete the track from A to B so that the rows and columns "
+"contain the same number of track segments as are indicated in the clues to "
+"the top and right of the grid."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3260
+msgid ""
+"There are only straight and 90 degree curved rails, and the track may not "
+"cross itself."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3262
+msgid "Tracks was contributed to this collection by James Harvey."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3264
+msgid "\\I{controls, for Tracks}Tracks controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3268
+msgid ""
+"Left-clicking on an edge between two squares adds a track segment between "
+"the two squares. Right-clicking on an edge adds a cross on the edge, "
+"indicating no track is possible there."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3273
+msgid ""
+"Left-clicking in a square adds a colour indicator showing that you know the "
+"square must contain a track, even if you don't know which edges it crosses "
+"yet. Right-clicking in a square adds a cross indicating it contains no track "
+"segment."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3277
+msgid ""
+"Left- or right-dragging between squares allows you to lay a straight line of "
+"is-track or is-not-track indicators, useful for filling in rows or columns "
+"to match the clue."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3281
+msgid "\\I{parameters, for Tracks}Tracks parameters"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3294
+msgid ""
+"Controls the difficulty of the generated puzzle: at Tricky level, you are "
+"required to make more deductions regarding disregarding moves that would "
+"lead to impossible crossings later."
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:3296
+msgid "Disallow consecutive 1 clues"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3303
+msgid ""
+"Controls whether the Tracks game generation permits two adjacent rows or "
+"columns to have a 1 clue, or permits the row or column of the track's "
+"endpoint to have a 1 clue. By default this is not permitted, to avoid long "
+"straight boring segments of track and make the games more twiddly and "
+"interesting. If you want to restore the possibility, turn this option off."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3306
+msgid "\\i{Palisade}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3308
+msgid "\\cfg{winhelp-topic}{games.palisade}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3314
+msgid ""
+"You're given a grid of squares, some of which contain numbers.  Your goal is "
+"to subdivide the grid into contiguous regions, all of the same (given) size, "
+"such that each square containing a number is adjacent to exactly that many "
+"edges (including those between the inside and the outside of the grid)."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3317
+msgid ""
+"Credit for this puzzle goes to \\i{Nikoli}, who call it \\q{Five Cells}.  "
+"\\k{nikoli-palisade}."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3319
+msgid "Palisade was contributed to this collection by Jonas K\\u00F6{oe}lker."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3322
+msgid ""
+"\\W{http://nikoli.co.jp/en/puzzles/five_cells.html}\\cw{http://nikoli.co.jp/"
+"en/puzzles/five_cells.html}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3324
+msgid "\\I{controls, for Palisade}Palisade controls"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3330
+msgid ""
+"Left-click to place an edge.  Right-click to indicate \\q{no edge}.  "
+"Alternatively, the arrow keys will move a keyboard cursor.  Holding Control "
+"while pressing an arrow key will place an edge.  Press Shift-arrowkey to "
+"switch off an edge.  Repeat an action to perform its inverse."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3334
+msgid "\\I{parameters, for Palisade}Palisade parameters"
+msgstr ""
+
+#. type: e{#1}
+#: puzzles.but:3343
+msgid "Region size"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3345
+msgid "The size of the regions into which the grid must be subdivided."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3347
+msgid "\\I{MIT licence}\\ii{Licence}"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3349
+msgid "This software is \\i{copyright} 2004-2014 Simon Tatham."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3353
+msgid ""
+"Portions copyright Richard Boulton, James Harvey, Mike Pinna, Jonas K"
+"\\u00F6{oe}lker, Dariusz Olszewski, Michael Schierl, Lambros Lambrou, Bernd "
+"Schmidt, Steffen Bauer, Lennard Sprong and Rogier Goossens."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3361
+msgid ""
+"Permission is hereby granted, free of charge, to any person obtaining a copy "
+"of this software and associated documentation files (the \\q{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:"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3364
+msgid ""
+"The above copyright notice and this permission notice shall be included in "
+"all copies or substantial portions of the Software."
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3373
+msgid ""
+"THE SOFTWARE IS PROVIDED \\q{AS IS}, WITHOUT WARRANTY OF ANY KIND, EXPRESS "
+"OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, "
+"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE "
+"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER "
+"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING "
+"FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS "
+"IN THE SOFTWARE."
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:3374
+msgid "command-line"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:3374
+#, no-wrap
+msgid "{command line} command line"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:3376 puzzles.but:3377
+#, no-wrap
+msgid "default parameters, specifying"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:3377
+#, no-wrap
+msgid "preferences, specifying default"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:3379 puzzles.but:3380
+#, no-wrap
+msgid "Unix"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:3380
+#, no-wrap
+msgid "Linux"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:3382 puzzles.but:3383
+#, no-wrap
+msgid "generating game IDs"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:3383
+#, no-wrap
+msgid "game ID, generating"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:3385
+msgid "specific"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:3385
+#, no-wrap
+msgid "\\q{Specific}, menu option"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:3386
+msgid "custom"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:3386
+#, no-wrap
+msgid "\\q{Custom}, menu option"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:3388 puzzles.but:3389
+#, no-wrap
+msgid "game ID"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:3389
+#, no-wrap
+msgid "ID, game"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:3390 puzzles.but:3391 puzzles.but:3392
+#, no-wrap
+msgid "ID format"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:3391
+#, no-wrap
+msgid "format, ID"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:3392
+#, no-wrap
+msgid "game ID, format"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:3394 puzzles.but:3395
+#, no-wrap
+msgid "keys"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:3395
+#, no-wrap
+msgid "shortcuts (keyboard)"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:3397 puzzles.but:3398
+#, no-wrap
+msgid "initial state"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:3398
+#, no-wrap
+msgid "state, initial"
+msgstr ""
+
+#. type: IM{#1}
+#: puzzles.but:3400 puzzles.but:3401
+#, no-wrap
+msgid "MIT licence"
+msgstr ""
+
+#. type: IM
+#: puzzles.but:3401
+#, no-wrap
+msgid "licence, MIT"
+msgstr ""
+
+#. type: Plain text
+#: puzzles.but:3403
+msgid "Simon Tatham's Portable Puzzle Collection, version 20160429.b31155b"
+msgstr ""
+
+#: blackbox.R
+msgid "Ball-finding puzzle"
+msgstr ""
+
+#: bridges.R
+msgid "Bridge-placing puzzle"
+msgstr ""
+
+#: cube.R
+msgid "Rolling cube puzzle"
+msgstr ""
+
+#: dominosa.R
+msgid "Domino tiling puzzle"
+msgstr ""
+
+#: fifteen.R
+msgid "Sliding block puzzle"
+msgstr ""
+
+#: filling.R
+msgid "Polyomino puzzle"
+msgstr ""
+
+#: flip.R
+msgid "Tile inversion puzzle"
+msgstr ""
+
+#: flood.R
+msgid "Flood-filling puzzle"
+msgstr ""
+
+#: galaxies.R
+msgid "Symmetric polyomino puzzle"
+msgstr ""
+
+#: guess.R
+msgid "Combination-guessing puzzle"
+msgstr ""
+
+#: inertia.R
+msgid "Gem-collecting puzzle"
+msgstr ""
+
+#: keen.R
+msgid "Arithmetic Latin square puzzle"
+msgstr ""
+
+#: lightup.R
+msgid "Light-bulb placing puzzle"
+msgstr ""
+
+#: loopy.R pearl.R
+msgid "Loop-drawing puzzle"
+msgstr ""
+
+#: magnets.R
+msgid "Magnet-placing puzzle"
+msgstr ""
+
+#: map.R
+msgid "Map-colouring puzzle"
+msgstr ""
+
+#: mines.R
+msgid "Mine-finding puzzle"
+msgstr ""
+
+#: net.R
+msgid "Network jigsaw puzzle"
+msgstr ""
+
+#: netslide.R
+msgid "Toroidal sliding network puzzle"
+msgstr ""
+
+#: palisade.R
+msgid "Grid-division puzzle"
+msgstr ""
+
+#: pattern.R
+msgid "Pattern puzzle"
+msgstr ""
+
+#: pegs.R
+msgid "Peg solitaire puzzle"
+msgstr ""
+
+#: range.R
+msgid "Visible-distance puzzle"
+msgstr ""
+
+#: rect.R
+msgid "Rectangles puzzle"
+msgstr ""
+
+#: samegame.R
+msgid "Block-clearing puzzle"
+msgstr ""
+
+#: signpost.R
+msgid "Square-connecting puzzle"
+msgstr ""
+
+#: singles.R
+msgid "Number-removing puzzle"
+msgstr ""
+
+#: sixteen.R
+msgid "Toroidal sliding block puzzle"
+msgstr ""
+
+#: slant.R
+msgid "Maze-drawing puzzle"
+msgstr ""
+
+#: solo.R
+msgid "Number placement puzzle"
+msgstr ""
+
+#: tents.R
+msgid "Tent-placing puzzle"
+msgstr ""
+
+#: towers.R
+msgid "Tower-placing Latin square puzzle"
+msgstr ""
+
+#: tracks.R
+msgid "Path-finding railway track puzzle"
+msgstr ""
+
+#: twiddle.R
+msgid "Rotational sliding block puzzle"
+msgstr ""
+
+#: undead.R
+msgid "Monster-placing puzzle"
+msgstr ""
+
+#: unequal.R
+msgid "Latin square puzzle"
+msgstr ""
+
+#: unruly.R
+msgid "Black and white grid puzzle"
+msgstr ""
+
+#: untangle.R
+msgid "Planar graph layout puzzle"
+msgstr ""
+
+#. Translator: conventional name for manual section 6
+#: mkmanpages.pl:28
+msgid "Games"
+msgstr ""
+
+#: mkmanpages.pl:44
+msgid "January"
+msgstr ""
+
+#: mkmanpages.pl:44
+msgid "February"
+msgstr ""
+
+#: mkmanpages.pl:44
+msgid "March"
+msgstr ""
+
+#: mkmanpages.pl:45
+msgid "April"
+msgstr ""
+
+#: mkmanpages.pl:45
+msgid "May"
+msgstr ""
+
+#: mkmanpages.pl:45
+msgid "June"
+msgstr ""
+
+#: mkmanpages.pl:46
+msgid "July"
+msgstr ""
+
+#: mkmanpages.pl:46
+msgid "August"
+msgstr ""
+
+#: mkmanpages.pl:46
+msgid "September"
+msgstr ""
+
+#: mkmanpages.pl:47
+msgid "October"
+msgstr ""
+
+#: mkmanpages.pl:47
+msgid "November"
+msgstr ""
+
+#: mkmanpages.pl:47
+msgid "December"
+msgstr ""
+
+#: mkmanpages.pl:93
+msgid "NAME"
+msgstr ""
+
+#: mkmanpages.pl:95
+msgid "SYNOPSIS"
+msgstr ""
+
+#. Translator: abbreviation for 'number'
+#: mkmanpages.pl:97 mkmanpages.pl:102
+msgid "n"
+msgstr ""
+
+#. Translator: abbreviation for 'width'
+#: mkmanpages.pl:99
+msgid "w"
+msgstr ""
+
+#. Translator: abbreviation for 'height'
+#: mkmanpages.pl:101
+msgid "h"
+msgstr ""
+
+#: mkmanpages.pl:103
+msgid "game-parameters"
+msgstr ""
+
+#: mkmanpages.pl:103
+msgid "game-ID"
+msgstr ""
+
+#: mkmanpages.pl:104
+msgid "random-seed"
+msgstr ""
+
+#: mkmanpages.pl:106
+msgid "DESCRIPTION"
+msgstr ""
+
+#: mkmanpages.pl:109
+msgid "SEE ALSO"
+msgstr ""
+
+#. Translator: "Full documentation in <filename>."
+#: mkmanpages.pl:111
+#, perl-format
+msgid "Full documentation in %s."
+msgstr ""
+
+#. Translator: earlier in the manual page
+#: mkmanpages.pl:122
+msgid "above"
+msgstr ""
+
+#. Translator: later in the manual page
+#: mkmanpages.pl:125
+msgid "below"
+msgstr ""
diff --git a/debian/po/puzzles-doc.pot.head b/debian/po/puzzles-doc.pot.head
new file mode 100644 (file)
index 0000000..cc88c8d
--- /dev/null
@@ -0,0 +1,7 @@
+# Documentation for Simon Tatham's Portable Puzzle Collection:
+# translation into LANGUAGE.
+# Copyright YEAR TRANSLATION COPYRIGHT HOLDER
+# This file is distributed under the same license as the English
+# documentation.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..b6b6f89
--- /dev/null
@@ -0,0 +1,80 @@
+#!/usr/bin/make -f
+
+# We require some bash features
+override SHELL := /bin/bash
+
+include /usr/share/dpkg/default.mk
+
+LANGUAGES := en $(patsubst debian/po/%.po,%,$(wildcard debian/po/*.po))
+
+# Distributed files that we regenerate
+AUTOGEN_FILES := HACKING Makefile.am Makefile.cyg Makefile.emcc \
+                Makefile.gnustep Makefile.gtk Makefile.in Makefile.nestedvm \
+                Makefile.osx Makefile.vc Makefile.wce aclocal.m4 configure \
+                depcomp install-sh list.c missing preprocessed.but \
+                puzzles.cnt puzzles.hlp puzzles.txt
+
+CFLAGS += -Wno-error=deprecated-declarations
+
+%:
+       dh $@
+
+override_dh_auto_configure:
+       ./mkfiles.pl
+       ./mkauto.sh
+       CFLAGS="$(CFLAGS)" CPPFLAGS="$(CPPFLAGS) -DDEBIAN_VERSION=\"\\\"$(DEB_VERSION)\\\"\"" LDFLAGS="$(LDFLAGS)" ./configure --prefix=/usr --bindir=/usr/games --program-prefix=sgt-
+       [ -L po ] || ln -s debian/po po
+       rm -f preprocessed.but
+
+override_dh_auto_build:
+       $(MAKE)
+       $(MAKE) -f Makefile.doc BINPREFIX=sgt-
+
+# Disable running tests; upstream tarballs don't include the necessary files
+override_dh_auto_test:
+
+override_dh_auto_install:
+       $(MAKE) DESTDIR=debian/sgt-puzzles install
+
+override_dh_installdocs:
+       for lang in $(LANGUAGES); do \
+               dh_install doc/html-$$lang/*.html usr/share/sgt-puzzles/help/$$lang \
+               || exit; \
+       done
+       dh_installdocs
+
+override_dh_installman:
+       for lang in $(LANGUAGES); do \
+               dh_installman --language=$${lang/en/C} doc/man-$$lang/* || exit; \
+       done
+
+override_dh_install:
+       dh_install debian/desktop/*.desktop usr/share/applications
+       for icon in icons/*-48d24.png; do \
+           base="$$(basename $$icon -48d24.png)" && \
+           install -m644 $$icon debian/sgt-puzzles/usr/share/icons/hicolor/48x48/apps/sgt-$$base.png \
+           || exit; \
+       done
+
+override_dh_installmenu:
+       awk -F: '{ printf "?package(sgt-puzzles):needs=\"x11\" section=\"Games/Puzzles\" title=\"%s\" command=\"/usr/games/sgt-%s\"\n", $$3, $$1 }' < gamedesc.txt > debian/sgt-puzzles.menu
+       dh_installmenu
+
+override_dh_auto_clean:
+       ! [ -f Makefile ] || $(MAKE) distclean
+       $(MAKE) -f Makefile.doc clean
+       if [ -d .git ]; then                            \
+               git checkout HEAD $(AUTOGEN_FILES);     \
+       else                                            \
+               rm -f $(AUTOGEN_FILES);                 \
+       fi
+       rm -f po
+       dh_clean debian/sgt-puzzles.menu debian/substvars compile gamedesc.txt version2.def
+
+get-orig-source:
+       wget -O puzzles-new.tar.gz http://www.chiark.greenend.org.uk/~sgtatham/puzzles/puzzles.tar.gz
+       version="$$(tar -xOzf puzzles-new.tar.gz --wildcards '*/version.h' | \
+                   sed -n 's/^\#define VER "Version \([^ ]*\)"$$/\1/p')" \
+       && test -n "$$version"                                          \
+       && mk-origtargz --exclude-file '*.chm' -v"$$version" puzzles-new.tar.gz
+       rm -f puzzles-new.tar.gz
diff --git a/debian/sgt-puzzles.dirs b/debian/sgt-puzzles.dirs
new file mode 100644 (file)
index 0000000..9d39c99
--- /dev/null
@@ -0,0 +1,5 @@
+usr/games
+usr/share/applications
+usr/share/icons/hicolor/48x48/apps
+usr/share/sgt-puzzles/help
+usr/share/man/man6
diff --git a/debian/sgt-puzzles.docs b/debian/sgt-puzzles.docs
new file mode 100644 (file)
index 0000000..dd06aa5
--- /dev/null
@@ -0,0 +1,2 @@
+puzzles.txt
+doc/puzzles.txt.*
diff --git a/debian/source/format b/debian/source/format
new file mode 100644 (file)
index 0000000..163aaf8
--- /dev/null
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/depcomp b/depcomp
new file mode 100755 (executable)
index 0000000..fc98710
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2013-05-30.07; # UTC
+
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# 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.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+    exit 1;
+    ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'.  Note that this directory component will
+# be either empty or ending with a '/' character.  This is deliberate.
+set_dir_from ()
+{
+  case $1 in
+    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+      *) dir=;;
+  esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+  echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+  # If the compiler actually managed to produce a dependency file,
+  # post-process it.
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependency.h'.
+    # Do two passes, one to just change these to
+    #   $object: dependency.h
+    # and one to simply output
+    #   dependency.h:
+    # which is needed to avoid the deleted-header problem.
+    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+    } > "$depfile"
+    rm -f "$tmpdepfile"
+  else
+    make_dummy_depfile
+  fi
+}
+
+# A tabulation character.
+tab='  '
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+  # This is just like dashmstdout with a different argument.
+  dashmflag=-xM
+  depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+  # This is just like msvisualcpp but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+  # This is just like msvc7 but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+  gccflag=-qmakedep=gcc,-MF
+  depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).  Also, it might not be
+##   supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The second -e expression handles DOS-style file names with drive
+  # letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like '#:fec' to the end of the
+    # dependency line.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+      | tr "$nl" ' ' >> "$depfile"
+    echo >> "$depfile"
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+      >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  set_dir_from "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  aix_post_process_depfile
+  ;;
+
+tcc)
+  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+  # FIXME: That version still under development at the moment of writing.
+  #        Make that this statement remains true also for stable, released
+  #        versions.
+  # It will wrap lines (doesn't matter whether long or short) with a
+  # trailing '\', as in:
+  #
+  #   foo.o : \
+  #    foo.c \
+  #    foo.h \
+  #
+  # It will put a trailing '\' even on the last line, and will use leading
+  # spaces rather than leading tabs (at least since its commit 0394caf7
+  # "Emit spaces for -MD").
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+  # We have to change lines of the first kind to '$object: \'.
+  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+  # And for each line of the second kind, we have to emit a 'dep.h:'
+  # dummy dependency, to avoid the deleted-header problem.
+  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file.  A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+  # Portland's C compiler understands '-MD'.
+  # Will always output deps to 'file.d' where file is the root name of the
+  # source file under compilation, even if file resides in a subdirectory.
+  # The object file name does not affect the name of the '.d' file.
+  # pgcc 10.2 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using '\' :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+  set_dir_from "$object"
+  # Use the source, not the object, to determine the base name, since
+  # that's sadly what pgcc will do too.
+  set_base_from "$source"
+  tmpdepfile=$base.d
+
+  # For projects that build the same source file twice into different object
+  # files, the pgcc approach of using the *source* file root name can cause
+  # problems in parallel builds.  Use a locking strategy to avoid stomping on
+  # the same $tmpdepfile.
+  lockdir=$base.d-lock
+  trap "
+    echo '$0: caught signal, cleaning up...' >&2
+    rmdir '$lockdir'
+    exit 1
+  " 1 2 13 15
+  numtries=100
+  i=$numtries
+  while test $i -gt 0; do
+    # mkdir is a portable test-and-set.
+    if mkdir "$lockdir" 2>/dev/null; then
+      # This process acquired the lock.
+      "$@" -MD
+      stat=$?
+      # Release the lock.
+      rmdir "$lockdir"
+      break
+    else
+      # If the lock is being held by a different process, wait
+      # until the winning process is done or we timeout.
+      while test -d "$lockdir" && test $i -gt 0; do
+        sleep 1
+        i=`expr $i - 1`
+      done
+    fi
+    i=`expr $i - 1`
+  done
+  trap - 1 2 13 15
+  if test $i -le 0; then
+    echo "$0: failed to acquire lock after $numtries attempts" >&2
+    echo "$0: check lockdir '$lockdir'" >&2
+    exit 1
+  fi
+
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  set_dir_from  "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
+    sed -ne '2,${
+               s/^ *//
+               s/ \\*$//
+               s/$/:/
+               p
+             }' "$tmpdepfile" >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+  # The Tru64 compiler uses -MD to generate dependencies as a side
+  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+  # dependencies in 'foo.d' instead, so we check for that too.
+  # Subdirectories are respected.
+  set_dir_from  "$object"
+  set_base_from "$object"
+
+  if test "$libtool" = yes; then
+    # Libtool generates 2 separate objects for the 2 libraries.  These
+    # two compilations output dependencies in $dir.libs/$base.o.d and
+    # in $dir$base.o.d.  We have to check for both files, because
+    # one of the two compilations can be disabled.  We should prefer
+    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+    # automatically cleaned when .libs/ is deleted, while ignoring
+    # the former would cause a distcleancheck panic.
+    tmpdepfile1=$dir$base.o.d          # libtool 1.5
+    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
+    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
+    "$@" -Wc,-MD
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    tmpdepfile3=$dir$base.d
+    "$@" -MD
+  fi
+
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  # Same post-processing that is required for AIX mode.
+  aix_post_process_depfile
+  ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/'"$tab"'/
+  G
+  p
+}' >> "$depfile"
+  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for ':'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+  "$@" $dashmflag |
+    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this sed invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process the last invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed '1,2d' "$tmpdepfile" \
+    | tr ' ' "$nl" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E \
+    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+    | sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+        set fnord "$@"
+        shift
+        shift
+        ;;
+    *)
+        set fnord "$@" "$arg"
+        shift
+        shift
+        ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/desktop.pl b/desktop.pl
deleted file mode 100755 (executable)
index 204c0ce..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/perl
-
-# Make .desktop files for the puzzles.
-#
-# At present, this script is intended for developer usage: if you're
-# working on the puzzles and want to play your bleeding-edge locally
-# modified and compiled versions, run this script and it will create a
-# collection of desktop files in ~/.local/share/applications where
-# XFCE can pick them up and add them to its main menu. (Be sure to run
-# 'xfdesktop --reload' after running this.)
-#
-# (If you don't use XFCE, patches to support other desktop
-# environments are welcome :-)
-
-use strict;
-use warnings;
-use Cwd 'abs_path';
-
-die "usage: desktop.pl [<outdir> [<bindir> <icondir>]]\n"
-    unless @ARGV == 0 or @ARGV == 1 or @ARGV == 3;
-
-my ($outdir, $bindir, $icondir) = @ARGV;
-$outdir = $ENV{'HOME'}."/.local/share/applications" unless defined $outdir;
-$bindir = "." unless defined $bindir;
-$icondir = "./icons" unless defined $icondir;
-$bindir = abs_path($bindir);
-$icondir = abs_path($icondir);
-
-open my $desc, "<", "gamedesc.txt"
-    or die "gamedesc.txt: open: $!\n";
-
-while (<$desc>) {
-    chomp;
-    my ($id, $win, $displayname, $description, $summary) = split /:/, $_;
-
-    open my $desktop, ">", "$outdir/$id.desktop"
-        or die "$outdir/$id.desktop: open: $!\n";
-
-    print $desktop "[Desktop Entry]\n";
-    print $desktop "Version=1.0\n";
-    print $desktop "Type=Application\n";
-    print $desktop "Name=$displayname\n";
-    print $desktop "Comment=$description\n";
-    print $desktop "Exec=$bindir/$id\n";
-    print $desktop "Icon=$icondir/$id-48d24.png\n";
-    print $desktop "StartupNotify=false\n";
-    print $desktop "Categories=Game;\n";
-    print $desktop "Terminal=false\n";
-
-    close $desktop
-        or die "$outdir/$id.desktop: close: $!\n";
-}
index 131678c17b85e99273a125ddcd95016b28038d4f..bf1c74fd435246d90744933ebd5852e7ece076bf 100644 (file)
--- a/devel.but
+++ b/devel.but
@@ -4922,3 +4922,5 @@ that the redraw and the animations (if any) work properly. Failing
 to animate undo properly seems to be a common error.
 
 Other than that, just use your common sense.
+
+\versionid Simon Tatham's Portable Puzzle Collection, version 20161228.7cae89f
diff --git a/emcclib.js b/emcclib.js
deleted file mode 100644 (file)
index 907dc19..0000000
+++ /dev/null
@@ -1,701 +0,0 @@
-/*
- * emcclib.js: one of the Javascript components of an Emscripten-based
- * web/Javascript front end for Puzzles.
- *
- * The other parts of this system live in emcc.c and emccpre.js. It
- * also depends on being run in the context of a web page containing
- * an appropriate collection of bits and pieces (a canvas, some
- * buttons and links etc), which is generated for each puzzle by the
- * script html/jspage.pl.
- *
- * This file contains a set of Javascript functions which we insert
- * into Emscripten's library object via the --js-library option; this
- * allows us to provide JS code which can be called from the
- * Emscripten-compiled C, mostly dealing with UI interaction of
- * various kinds.
- */
-
-mergeInto(LibraryManager.library, {
-    /*
-     * void js_debug(const char *message);
-     *
-     * A function to write a diagnostic to the Javascript console.
-     * Unused in production, but handy in development.
-     */
-    js_debug: function(ptr) {
-        console.log(Pointer_stringify(ptr));
-    },
-
-    /*
-     * void js_error_box(const char *message);
-     *
-     * A wrapper around Javascript's alert(), so the C code can print
-     * simple error message boxes (e.g. when invalid data is entered
-     * in a configuration dialog).
-     */
-    js_error_box: function(ptr) {
-        alert(Pointer_stringify(ptr));
-    },
-
-    /*
-     * void js_remove_type_dropdown(void);
-     *
-     * Get rid of the drop-down list on the web page for selecting
-     * game presets. Called at setup time if the game back end
-     * provides neither presets nor configurability.
-     */
-    js_remove_type_dropdown: function() {
-        gametypelist.style.display = "none";
-    },
-
-    /*
-     * void js_remove_solve_button(void);
-     *
-     * Get rid of the Solve button on the web page. Called at setup
-     * time if the game doesn't support an in-game solve function.
-     */
-    js_remove_solve_button: function() {
-        document.getElementById("solve").style.display = "none";
-    },
-
-    /*
-     * void js_add_preset(int menuid, const char *name, int value);
-     *
-     * Add a preset to the drop-down types menu, or to a submenu of
-     * it. 'menuid' specifies an index into our array of submenus
-     * where the item might be placed; 'value' specifies the number
-     * that js_get_selected_preset() will return when this item is
-     * clicked.
-     */
-    js_add_preset: function(menuid, ptr, value) {
-        var name = Pointer_stringify(ptr);
-        var item = document.createElement("li");
-        item.setAttribute("data-index", value);
-        var tick = document.createElement("span");
-        tick.appendChild(document.createTextNode("\u2713"));
-        tick.style.color = "transparent";
-        tick.style.paddingRight = "0.5em";
-        item.appendChild(tick);
-        item.appendChild(document.createTextNode(name));
-        gametypesubmenus[menuid].appendChild(item);
-        gametypeitems.push(item);
-
-        item.onclick = function(event) {
-            if (dlg_dimmer === null) {
-                gametypeselectedindex = value;
-                command(2);
-            }
-        }
-    },
-
-    /*
-     * int js_add_preset_submenu(int menuid, const char *name);
-     *
-     * Add a submenu in the presets menu hierarchy. Returns its index,
-     * for passing as the 'menuid' argument in further calls to
-     * js_add_preset or this function.
-     */
-    js_add_preset_submenu: function(menuid, ptr, value) {
-        var name = Pointer_stringify(ptr);
-        var item = document.createElement("li");
-        // We still create a transparent tick element, even though it
-        // won't ever be selected, to make submenu titles line up
-        // nicely with their neighbours.
-        var tick = document.createElement("span");
-        tick.appendChild(document.createTextNode("\u2713"));
-        tick.style.color = "transparent";
-        tick.style.paddingRight = "0.5em";
-        item.appendChild(tick);
-        item.appendChild(document.createTextNode(name));
-        var submenu = document.createElement("ul");
-        item.appendChild(submenu);
-        gametypesubmenus[menuid].appendChild(item);
-        var toret = gametypesubmenus.length;
-        gametypesubmenus.push(submenu);
-        return toret;
-    },
-
-    /*
-     * int js_get_selected_preset(void);
-     *
-     * Return the index of the currently selected value in the type
-     * dropdown.
-     */
-    js_get_selected_preset: function() {
-        return gametypeselectedindex;
-    },
-
-    /*
-     * void js_select_preset(int n);
-     *
-     * Cause a different value to be selected in the type dropdown
-     * (for when the user selects values from the Custom configurer
-     * which turn out to exactly match a preset).
-     */
-    js_select_preset: function(n) {
-        gametypeselectedindex = n;
-        for (var i in gametypeitems) {
-            var item = gametypeitems[i];
-            var tick = item.firstChild;
-            if (item.getAttribute("data-index") == n) {
-                tick.style.color = "inherit";
-            } else {
-                tick.style.color = "transparent";
-            }
-        }
-    },
-
-    /*
-     * void js_get_date_64(unsigned *p);
-     *
-     * Return the current date, in milliseconds since the epoch
-     * (Javascript's native format), as a 64-bit integer. Used to
-     * invent an initial random seed for puzzle generation.
-     */
-    js_get_date_64: function(ptr) {
-        var d = (new Date()).valueOf();
-        setValue(ptr, d, 'i64');
-    },
-
-    /*
-     * void js_update_permalinks(const char *desc, const char *seed);
-     *
-     * Update the permalinks on the web page for a new game
-     * description and optional random seed. desc can never be NULL,
-     * but seed might be (if the game was generated by entering a
-     * descriptive id by hand), in which case we suppress display of
-     * the random seed permalink.
-     */
-    js_update_permalinks: function(desc, seed) {
-        desc = Pointer_stringify(desc);
-        permalink_desc.href = "#" + desc;
-
-        if (seed == 0) {
-            permalink_seed.style.display = "none";
-        } else {
-            seed = Pointer_stringify(seed);
-            permalink_seed.href = "#" + seed;
-            permalink_seed.style.display = "inline";
-        }
-    },
-
-    /*
-     * void js_enable_undo_redo(int undo, int redo);
-     *
-     * Set the enabled/disabled states of the undo and redo buttons,
-     * after a move.
-     */
-    js_enable_undo_redo: function(undo, redo) {
-        disable_menu_item(undo_button, (undo == 0));
-        disable_menu_item(redo_button, (redo == 0));
-    },
-
-    /*
-     * void js_activate_timer();
-     *
-     * Start calling the C timer_callback() function every 20ms.
-     */
-    js_activate_timer: function() {
-        if (timer === null) {
-            timer_reference_date = (new Date()).valueOf();
-            timer = setInterval(function() {
-                var now = (new Date()).valueOf();
-                timer_callback((now - timer_reference_date) / 1000.0);
-                timer_reference_date = now;
-                return true;
-            }, 20);
-        }
-    },
-
-    /*
-     * void js_deactivate_timer();
-     *
-     * Stop calling the C timer_callback() function every 20ms.
-     */
-    js_deactivate_timer: function() {
-        if (timer !== null) {
-            clearInterval(timer);
-            timer = null;
-        }
-    },
-
-    /*
-     * void js_canvas_start_draw(void);
-     *
-     * Prepare to do some drawing on the canvas.
-     */
-    js_canvas_start_draw: function() {
-        ctx = offscreen_canvas.getContext('2d');
-        update_xmin = update_xmax = update_ymin = update_ymax = undefined;
-    },
-
-    /*
-     * void js_canvas_draw_update(int x, int y, int w, int h);
-     *
-     * Mark a rectangle of the off-screen canvas as needing to be
-     * copied to the on-screen one.
-     */
-    js_canvas_draw_update: function(x, y, w, h) {
-        /*
-         * Currently we do this in a really simple way, just by taking
-         * the smallest rectangle containing all updates so far. We
-         * could instead keep the data in a richer form (e.g. retain
-         * multiple smaller rectangles needing update, and only redraw
-         * the whole thing beyond a certain threshold) but this will
-         * do for now.
-         */
-        if (update_xmin === undefined || update_xmin > x) update_xmin = x;
-        if (update_ymin === undefined || update_ymin > y) update_ymin = y;
-        if (update_xmax === undefined || update_xmax < x+w) update_xmax = x+w;
-        if (update_ymax === undefined || update_ymax < y+h) update_ymax = y+h;
-    },
-
-    /*
-     * void js_canvas_end_draw(void);
-     *
-     * Finish the drawing, by actually copying the newly drawn stuff
-     * to the on-screen canvas.
-     */
-    js_canvas_end_draw: function() {
-        if (update_xmin !== undefined) {
-            var onscreen_ctx = onscreen_canvas.getContext('2d');
-            onscreen_ctx.drawImage(offscreen_canvas,
-                                   update_xmin, update_ymin,
-                                   update_xmax - update_xmin,
-                                   update_ymax - update_ymin,
-                                   update_xmin, update_ymin,
-                                   update_xmax - update_xmin,
-                                   update_ymax - update_ymin);
-        }
-        ctx = null;
-    },
-
-    /*
-     * void js_canvas_draw_rect(int x, int y, int w, int h,
-     *                          const char *colour);
-     * 
-     * Draw a rectangle.
-     */
-    js_canvas_draw_rect: function(x, y, w, h, colptr) {
-        ctx.fillStyle = Pointer_stringify(colptr);
-        ctx.fillRect(x, y, w, h);
-    },
-
-    /*
-     * void js_canvas_clip_rect(int x, int y, int w, int h);
-     * 
-     * Set a clipping rectangle.
-     */
-    js_canvas_clip_rect: function(x, y, w, h) {
-        ctx.save();
-        ctx.beginPath();
-        ctx.rect(x, y, w, h);
-        ctx.clip();
-    },
-
-    /*
-     * void js_canvas_unclip(void);
-     * 
-     * Reset to no clipping.
-     */
-    js_canvas_unclip: function() {
-        ctx.restore();
-    },
-
-    /*
-     * void js_canvas_draw_line(float x1, float y1, float x2, float y2,
-     *                          int width, const char *colour);
-     * 
-     * Draw a line. We must adjust the coordinates by 0.5 because
-     * Javascript's canvas coordinates appear to be pixel corners,
-     * whereas we want pixel centres. Also, we manually draw the pixel
-     * at each end of the line, which our clients will expect but
-     * Javascript won't reliably do by default (in common with other
-     * Postscriptish drawing frameworks).
-     */
-    js_canvas_draw_line: function(x1, y1, x2, y2, width, colour) {
-        colour = Pointer_stringify(colour);
-
-        ctx.beginPath();
-        ctx.moveTo(x1 + 0.5, y1 + 0.5);
-        ctx.lineTo(x2 + 0.5, y2 + 0.5);
-        ctx.lineWidth = width;
-        ctx.lineCap = 'round';
-        ctx.lineJoin = 'round';
-        ctx.strokeStyle = colour;
-        ctx.stroke();
-        ctx.fillStyle = colour;
-        ctx.fillRect(x1, y1, 1, 1);
-        ctx.fillRect(x2, y2, 1, 1);
-    },
-
-    /*
-     * void js_canvas_draw_poly(int *points, int npoints,
-     *                          const char *fillcolour,
-     *                          const char *outlinecolour);
-     * 
-     * Draw a polygon.
-     */
-    js_canvas_draw_poly: function(pointptr, npoints, fill, outline) {
-        ctx.beginPath();
-        ctx.moveTo(getValue(pointptr  , 'i32') + 0.5,
-                   getValue(pointptr+4, 'i32') + 0.5);
-        for (var i = 1; i < npoints; i++)
-            ctx.lineTo(getValue(pointptr+8*i  , 'i32') + 0.5,
-                       getValue(pointptr+8*i+4, 'i32') + 0.5);
-        ctx.closePath();
-        if (fill != 0) {
-            ctx.fillStyle = Pointer_stringify(fill);
-            ctx.fill();
-        }
-        ctx.lineWidth = '1';
-        ctx.lineCap = 'round';
-        ctx.lineJoin = 'round';
-        ctx.strokeStyle = Pointer_stringify(outline);
-        ctx.stroke();
-    },
-
-    /*
-     * void js_canvas_draw_circle(int x, int y, int r,
-     *                            const char *fillcolour,
-     *                            const char *outlinecolour);
-     * 
-     * Draw a circle.
-     */
-    js_canvas_draw_circle: function(x, y, r, fill, outline) {
-        ctx.beginPath();
-        ctx.arc(x + 0.5, y + 0.5, r, 0, 2*Math.PI);
-        if (fill != 0) {
-            ctx.fillStyle = Pointer_stringify(fill);
-            ctx.fill();
-        }
-        ctx.lineWidth = '1';
-        ctx.lineCap = 'round';
-        ctx.lineJoin = 'round';
-        ctx.strokeStyle = Pointer_stringify(outline);
-        ctx.stroke();
-    },
-
-    /*
-     * int js_canvas_find_font_midpoint(int height, const char *fontptr);
-     * 
-     * Return the adjustment required for text displayed using
-     * ALIGN_VCENTRE. We want to place the midpoint between the
-     * baseline and the cap-height at the specified position; so this
-     * function returns the adjustment which, when added to the
-     * desired centre point, returns the y-coordinate at which you
-     * should put the baseline.
-     *
-     * There is no sensible method of querying this kind of font
-     * metric in Javascript, so instead we render a piece of test text
-     * to a throwaway offscreen canvas and then read the pixel data
-     * back out to find the highest and lowest pixels. That's good
-     * _enough_ (in that we only needed the answer to the nearest
-     * pixel anyway), but rather disgusting!
-     *
-     * Since this is a very expensive operation, we cache the results
-     * per (font,height) pair.
-     */
-    js_canvas_find_font_midpoint: function(height, font) {
-        font = Pointer_stringify(font);
-
-        // Reuse cached value if possible
-        if (midpoint_cache[font] !== undefined)
-            return midpoint_cache[font];
-
-        // Find the width of the string
-        var ctx1 = onscreen_canvas.getContext('2d');
-        ctx1.font = font;
-        var width = (ctx1.measureText(midpoint_test_str).width + 1) | 0;
-
-        // Construct a test canvas of appropriate size, initialise it to
-        // black, and draw the string on it in white
-        var measure_canvas = document.createElement('canvas');
-        var ctx2 = measure_canvas.getContext('2d');
-        ctx2.canvas.width = width;
-        ctx2.canvas.height = 2*height;
-        ctx2.fillStyle = "#000000";
-        ctx2.fillRect(0, 0, width, 2*height);
-        var baseline = (1.5*height) | 0;
-        ctx2.fillStyle = "#ffffff";
-        ctx2.font = font;
-        ctx2.fillText(midpoint_test_str, 0, baseline);
-
-        // Scan the contents of the test canvas to find the top and bottom
-        // set pixels.
-        var pixels = ctx2.getImageData(0, 0, width, 2*height).data;
-        var ymin = 2*height, ymax = -1;
-        for (var y = 0; y < 2*height; y++) {
-            for (var x = 0; x < width; x++) {
-                if (pixels[4*(y*width+x)] != 0) {
-                    if (ymin > y) ymin = y;
-                    if (ymax < y) ymax = y;
-                    break;
-                }
-            }
-        }
-
-        var ret = (baseline - (ymin + ymax) / 2) | 0;
-        midpoint_cache[font] = ret;
-        return ret;
-    },
-
-    /*
-     * void js_canvas_draw_text(int x, int y, int halign,
-     *                          const char *colptr, const char *fontptr,
-     *                          const char *text);
-     * 
-     * Draw text. Vertical alignment has been taken care of on the C
-     * side, by optionally calling the above function. Horizontal
-     * alignment is handled here, since we can get the canvas draw
-     * function to do it for us with almost no extra effort.
-     */
-    js_canvas_draw_text: function(x, y, halign, colptr, fontptr, text) {
-        ctx.font = Pointer_stringify(fontptr);
-        ctx.fillStyle = Pointer_stringify(colptr);
-        ctx.textAlign = (halign == 0 ? 'left' :
-                         halign == 1 ? 'center' : 'right');
-        ctx.textBaseline = 'alphabetic';
-        ctx.fillText(Pointer_stringify(text), x, y);
-    },
-
-    /*
-     * int js_canvas_new_blitter(int w, int h);
-     * 
-     * Create a new blitter object, which is just an offscreen canvas
-     * of the specified size.
-     */
-    js_canvas_new_blitter: function(w, h) {
-        var id = blittercount++;
-        blitters[id] = document.createElement("canvas");
-        blitters[id].width = w;
-        blitters[id].height = h;
-        return id;
-    },
-
-    /*
-     * void js_canvas_free_blitter(int id);
-     * 
-     * Free a blitter (or rather, destroy our reference to it so JS
-     * can garbage-collect it, and also enforce that we don't
-     * accidentally use it again afterwards).
-     */
-    js_canvas_free_blitter: function(id) {
-        blitters[id] = null;
-    },
-
-    /*
-     * void js_canvas_copy_to_blitter(int id, int x, int y, int w, int h);
-     * 
-     * Copy from the puzzle image to a blitter. The size is passed to
-     * us, partly so we don't have to remember the size of each
-     * blitter, but mostly so that the C side can adjust the copy
-     * rectangle in the case where it partially overlaps the edge of
-     * the screen.
-     */
-    js_canvas_copy_to_blitter: function(id, x, y, w, h) {
-        var blitter_ctx = blitters[id].getContext('2d');
-        blitter_ctx.drawImage(offscreen_canvas,
-                              x, y, w, h,
-                              0, 0, w, h);
-    },
-
-    /*
-     * void js_canvas_copy_from_blitter(int id, int x, int y, int w, int h);
-     * 
-     * Copy from a blitter back to the puzzle image. As above, the
-     * size of the copied rectangle is passed to us from the C side
-     * and may already have been modified.
-     */
-    js_canvas_copy_from_blitter: function(id, x, y, w, h) {
-        ctx.drawImage(blitters[id],
-                      0, 0, w, h,
-                      x, y, w, h);
-    },
-
-    /*
-     * void js_canvas_make_statusbar(void);
-     * 
-     * Cause a status bar to exist. Called at setup time if the puzzle
-     * back end turns out to want one.
-     */
-    js_canvas_make_statusbar: function() {
-        var statusholder = document.getElementById("statusbarholder");
-        statusbar = document.createElement("div");
-        statusbar.style.overflow = "hidden";
-        statusbar.style.width = (onscreen_canvas.width - 4) + "px";
-        statusholder.style.width = onscreen_canvas.width + "px";
-        statusbar.style.height = "1.2em";
-        statusbar.style.textAlign = "left";
-        statusbar.style.background = "#d8d8d8";
-        statusbar.style.borderLeft = '2px solid #c8c8c8';
-        statusbar.style.borderTop = '2px solid #c8c8c8';
-        statusbar.style.borderRight = '2px solid #e8e8e8';
-        statusbar.style.borderBottom = '2px solid #e8e8e8';
-        statusbar.appendChild(document.createTextNode(" "));
-        statusholder.appendChild(statusbar);
-    },
-
-    /*
-     * void js_canvas_set_statusbar(const char *text);
-     * 
-     * Set the text in the status bar.
-     */
-    js_canvas_set_statusbar: function(ptr) {
-        var text = Pointer_stringify(ptr);
-        statusbar.replaceChild(document.createTextNode(text),
-                               statusbar.lastChild);
-    },
-
-    /*
-     * void js_canvas_set_size(int w, int h);
-     * 
-     * Set the size of the puzzle canvas. Called at setup, and every
-     * time the user picks new puzzle settings requiring a different
-     * size.
-     */
-    js_canvas_set_size: function(w, h) {
-        onscreen_canvas.width = w;
-        offscreen_canvas.width = w;
-        if (statusbar !== null) {
-            statusbar.style.width = (w - 4) + "px";
-            document.getElementById("statusbarholder").style.width = w + "px";
-        }
-        resizable_div.style.width = w + "px";
-
-        onscreen_canvas.height = h;
-        offscreen_canvas.height = h;
-    },
-
-    /*
-     * void js_dialog_init(const char *title);
-     * 
-     * Begin constructing a 'dialog box' which will be popped up in an
-     * overlay on top of the rest of the puzzle web page.
-     */
-    js_dialog_init: function(titletext) {
-        dialog_init(Pointer_stringify(titletext));
-    },
-
-    /*
-     * void js_dialog_string(int i, const char *title, const char *initvalue);
-     * 
-     * Add a string control (that is, an edit box) to the dialog under
-     * construction.
-     */
-    js_dialog_string: function(index, title, initialtext) {
-        dlg_form.appendChild(document.createTextNode(Pointer_stringify(title)));
-        var editbox = document.createElement("input");
-        editbox.type = "text";
-        editbox.value = Pointer_stringify(initialtext);
-        dlg_form.appendChild(editbox);
-        dlg_form.appendChild(document.createElement("br"));
-
-        dlg_return_funcs.push(function() {
-            dlg_return_sval(index, editbox.value);
-        });
-    },
-
-    /*
-     * void js_dialog_choices(int i, const char *title, const char *choicelist,
-     *                        int initvalue);
-     * 
-     * Add a choices control (i.e. a drop-down list) to the dialog
-     * under construction. The 'choicelist' parameter is unchanged
-     * from the way the puzzle back end will have supplied it: i.e.
-     * it's still encoded as a single string whose first character
-     * gives the separator.
-     */
-    js_dialog_choices: function(index, title, choicelist, initvalue) {
-        dlg_form.appendChild(document.createTextNode(Pointer_stringify(title)));
-        var dropdown = document.createElement("select");
-        var choicestr = Pointer_stringify(choicelist);
-        var items = choicestr.slice(1).split(choicestr[0]);
-        var options = [];
-        for (var i in items) {
-            var option = document.createElement("option");
-            option.value = i;
-            option.appendChild(document.createTextNode(items[i]));
-            if (i == initvalue) option.selected = true;
-            dropdown.appendChild(option);
-            options.push(option);
-        }
-        dlg_form.appendChild(dropdown);
-        dlg_form.appendChild(document.createElement("br"));
-
-        dlg_return_funcs.push(function() {
-            var val = 0;
-            for (var i in options) {
-                if (options[i].selected) {
-                    val = options[i].value;
-                    break;
-                }
-            }
-            dlg_return_ival(index, val);
-        });
-    },
-
-    /*
-     * void js_dialog_boolean(int i, const char *title, int initvalue);
-     * 
-     * Add a boolean control (a checkbox) to the dialog under
-     * construction. Checkboxes are generally expected to be sensitive
-     * on their label text as well as the box itself, so for this
-     * control we create an actual label rather than merely a text
-     * node (and hence we must allocate an id to the checkbox so that
-     * the label can refer to it).
-     */
-    js_dialog_boolean: function(index, title, initvalue) {
-        var checkbox = document.createElement("input");
-        checkbox.type = "checkbox";
-        checkbox.id = "cb" + String(dlg_next_id++);
-        checkbox.checked = (initvalue != 0);
-        dlg_form.appendChild(checkbox);
-        var checkboxlabel = document.createElement("label");
-        checkboxlabel.setAttribute("for", checkbox.id);
-        checkboxlabel.textContent = Pointer_stringify(title);
-        dlg_form.appendChild(checkboxlabel);
-        dlg_form.appendChild(document.createElement("br"));
-
-        dlg_return_funcs.push(function() {
-            dlg_return_ival(index, checkbox.checked ? 1 : 0);
-        });
-    },
-
-    /*
-     * void js_dialog_launch(void);
-     * 
-     * Finish constructing a dialog, and actually display it, dimming
-     * everything else on the page.
-     */
-    js_dialog_launch: function() {
-        dialog_launch(function(event) {
-            for (var i in dlg_return_funcs)
-                dlg_return_funcs[i]();
-            command(3);         // OK
-        }, function(event) {
-            command(4);         // Cancel
-        });
-    },
-
-    /*
-     * void js_dialog_cleanup(void);
-     * 
-     * Stop displaying a dialog, and clean up the internal state
-     * associated with it.
-     */
-    js_dialog_cleanup: function() {
-        dialog_cleanup();
-    },
-
-    /*
-     * void js_focus_canvas(void);
-     * 
-     * Return keyboard focus to the puzzle canvas. Called after a
-     * puzzle-control button is pressed, which tends to have the side
-     * effect of taking focus away from the canvas.
-     */
-    js_focus_canvas: function() {
-        onscreen_canvas.focus();
-    }
-});
diff --git a/emccpre.js b/emccpre.js
deleted file mode 100644 (file)
index 5082555..0000000
+++ /dev/null
@@ -1,477 +0,0 @@
-/*
- * emccpre.js: one of the Javascript components of an Emscripten-based
- * web/Javascript front end for Puzzles.
- *
- * The other parts of this system live in emcc.c and emcclib.js. It
- * also depends on being run in the context of a web page containing
- * an appropriate collection of bits and pieces (a canvas, some
- * buttons and links etc), which is generated for each puzzle by the
- * script html/jspage.pl.
- *
- * This file contains the Javascript code which is prefixed unmodified
- * to Emscripten's output via the --pre-js option. It declares all our
- * global variables, and provides the puzzle init function and a
- * couple of other helper functions.
- */
-
-// To avoid flicker while doing complicated drawing, we use two
-// canvases, the same size. One is actually on the web page, and the
-// other is off-screen. We do all our drawing on the off-screen one
-// first, and then copy rectangles of it to the on-screen canvas in
-// response to draw_update() calls by the game backend.
-var onscreen_canvas, offscreen_canvas;
-
-// A persistent drawing context for the offscreen canvas, to save
-// constructing one per individual graphics operation.
-var ctx;
-
-// Bounding rectangle for the copy to the onscreen canvas that will be
-// done at drawing end time. Updated by js_canvas_draw_update and used
-// by js_canvas_end_draw.
-var update_xmin, update_xmax, update_ymin, update_ymax;
-
-// Module object for Emscripten. We fill in these parameters to ensure
-// that Module.run() won't be called until we're ready (we want to do
-// our own init stuff first), and that when main() returns nothing
-// will get cleaned up so we remain able to call the puzzle's various
-// callbacks.
-var Module = {
-    'noInitialRun': true,
-    'noExitRuntime': true
-};
-
-// Variables used by js_canvas_find_font_midpoint().
-var midpoint_test_str = "ABCDEFGHIKLMNOPRSTUVWXYZ0123456789";
-var midpoint_cache = [];
-
-// Variables used by js_activate_timer() and js_deactivate_timer().
-var timer = null;
-var timer_reference_date;
-
-// void timer_callback(double tplus);
-//
-// Called every 20ms while timing is active.
-var timer_callback;
-
-// The status bar object, if we create one.
-var statusbar = null;
-
-// Currently live blitters. We keep an integer id for each one on the
-// JS side; the C side, which expects a blitter to look like a struct,
-// simply defines the struct to contain that integer id.
-var blittercount = 0;
-var blitters = [];
-
-// State for the dialog-box mechanism. dlg_dimmer and dlg_form are the
-// page-darkening overlay and the actual dialog box respectively;
-// dlg_next_id is used to allocate each checkbox a unique id to use
-// for linking its label to it (see js_dialog_boolean);
-// dlg_return_funcs is a list of JS functions to be called when the OK
-// button is pressed, to pass the results back to C.
-var dlg_dimmer = null, dlg_form = null;
-var dlg_next_id = 0;
-var dlg_return_funcs = null;
-
-// void dlg_return_sval(int index, const char *val);
-// void dlg_return_ival(int index, int val);
-//
-// C-side entry points called by functions in dlg_return_funcs, to
-// pass back the final value in each dialog control.
-var dlg_return_sval, dlg_return_ival;
-
-// The <ul> object implementing the game-type drop-down, and a list of
-// the <li> objects inside it. Used by js_add_preset(),
-// js_get_selected_preset() and js_select_preset().
-var gametypelist = null, gametypeitems = [];
-var gametypeselectedindex = null;
-var gametypesubmenus = [];
-
-// The two anchors used to give permalinks to the current puzzle. Used
-// by js_update_permalinks().
-var permalink_seed, permalink_desc;
-
-// The undo and redo buttons. Used by js_enable_undo_redo().
-var undo_button, redo_button;
-
-// A div element enclosing both the puzzle and its status bar, used
-// for positioning the resize handle.
-var resizable_div;
-
-// Helper function to find the absolute position of a given DOM
-// element on a page, by iterating upwards through the DOM finding
-// each element's offset from its parent, and thus calculating the
-// page-relative position of the target element.
-function element_coords(element) {
-    var ex = 0, ey = 0;
-    while (element.offsetParent) {
-        ex += element.offsetLeft;
-        ey += element.offsetTop;
-        element = element.offsetParent;
-    }
-    return {x: ex, y:ey};
-}
-
-// Helper function which is passed a mouse event object and a DOM
-// element, and returns the coordinates of the mouse event relative to
-// the top left corner of the element by subtracting element_coords
-// from event.page{X,Y}.
-function relative_mouse_coords(event, element) {
-    var ecoords = element_coords(element);
-    return {x: event.pageX - ecoords.x,
-            y: event.pageY - ecoords.y};
-}
-
-// Enable and disable items in the CSS menus.
-function disable_menu_item(item, disabledFlag) {
-    if (disabledFlag)
-        item.className = "disabled";
-    else
-        item.className = "";
-}
-
-// Dialog-box functions called from both C and JS.
-function dialog_init(titletext) {
-    // Create an overlay on the page which darkens everything
-    // beneath it.
-    dlg_dimmer = document.createElement("div");
-    dlg_dimmer.style.width = "100%";
-    dlg_dimmer.style.height = "100%";
-    dlg_dimmer.style.background = '#000000';
-    dlg_dimmer.style.position = 'fixed';
-    dlg_dimmer.style.opacity = 0.3;
-    dlg_dimmer.style.top = dlg_dimmer.style.left = 0;
-    dlg_dimmer.style["z-index"] = 99;
-
-    // Now create a form which sits on top of that in turn.
-    dlg_form = document.createElement("form");
-    dlg_form.style.width = (window.innerWidth * 2 / 3) + "px";
-    dlg_form.style.opacity = 1;
-    dlg_form.style.background = '#ffffff';
-    dlg_form.style.color = '#000000';
-    dlg_form.style.position = 'absolute';
-    dlg_form.style.border = "2px solid black";
-    dlg_form.style.padding = "20px";
-    dlg_form.style.top = (window.innerHeight / 10) + "px";
-    dlg_form.style.left = (window.innerWidth / 6) + "px";
-    dlg_form.style["z-index"] = 100;
-
-    var title = document.createElement("p");
-    title.style.marginTop = "0px";
-    title.appendChild(document.createTextNode(titletext));
-    dlg_form.appendChild(title);
-
-    dlg_return_funcs = [];
-    dlg_next_id = 0;
-}
-
-function dialog_launch(ok_function, cancel_function) {
-    // Put in the OK and Cancel buttons at the bottom.
-    var button;
-
-    if (ok_function) {
-        button = document.createElement("input");
-        button.type = "button";
-        button.value = "OK";
-        button.onclick = ok_function;
-        dlg_form.appendChild(button);
-    }
-
-    if (cancel_function) {
-        button = document.createElement("input");
-        button.type = "button";
-        button.value = "Cancel";
-        button.onclick = cancel_function;
-        dlg_form.appendChild(button);
-    }
-
-    document.body.appendChild(dlg_dimmer);
-    document.body.appendChild(dlg_form);
-}
-
-function dialog_cleanup() {
-    document.body.removeChild(dlg_dimmer);
-    document.body.removeChild(dlg_form);
-    dlg_dimmer = dlg_form = null;
-    onscreen_canvas.focus();
-}
-
-// Init function called from body.onload.
-function initPuzzle() {
-    // Construct the off-screen canvas used for double buffering.
-    onscreen_canvas = document.getElementById("puzzlecanvas");
-    offscreen_canvas = document.createElement("canvas");
-    offscreen_canvas.width = onscreen_canvas.width;
-    offscreen_canvas.height = onscreen_canvas.height;
-
-    // Stop right-clicks on the puzzle from popping up a context menu.
-    // We need those right-clicks!
-    onscreen_canvas.oncontextmenu = function(event) { return false; }
-
-    // Set up mouse handlers. We do a bit of tracking of the currently
-    // pressed mouse buttons, to avoid sending mousemoves with no
-    // button down (our puzzles don't want those events).
-    mousedown = Module.cwrap('mousedown', 'void',
-                             ['number', 'number', 'number']);
-    buttons_down = 0;
-    onscreen_canvas.onmousedown = function(event) {
-        var xy = relative_mouse_coords(event, onscreen_canvas);
-        mousedown(xy.x, xy.y, event.button);
-        buttons_down |= 1 << event.button;
-        onscreen_canvas.setCapture(true);
-    };
-    mousemove = Module.cwrap('mousemove', 'void',
-                             ['number', 'number', 'number']);
-    onscreen_canvas.onmousemove = function(event) {
-        if (buttons_down) {
-            var xy = relative_mouse_coords(event, onscreen_canvas);
-            mousemove(xy.x, xy.y, buttons_down);
-        }
-    };
-    mouseup = Module.cwrap('mouseup', 'void',
-                           ['number', 'number', 'number']);
-    onscreen_canvas.onmouseup = function(event) {
-        if (buttons_down & (1 << event.button)) {
-            buttons_down ^= 1 << event.button;
-            var xy = relative_mouse_coords(event, onscreen_canvas);
-            mouseup(xy.x, xy.y, event.button);
-        }
-    };
-
-    // Set up keyboard handlers. We do all the actual keyboard
-    // handling in onkeydown; but we also call event.preventDefault()
-    // in both the keydown and keypress handlers. This means that
-    // while the canvas itself has focus, _all_ keypresses go only to
-    // the puzzle - so users of this puzzle collection in other media
-    // can indulge their instinct to press ^R for redo, for example,
-    // without accidentally reloading the page.
-    key = Module.cwrap('key', 'void', ['number', 'number', 'string',
-                                       'string', 'number', 'number']);
-    onscreen_canvas.onkeydown = function(event) {
-        key(event.keyCode, event.charCode, event.key, event.char,
-            event.shiftKey ? 1 : 0, event.ctrlKey ? 1 : 0);
-        event.preventDefault();
-    };
-    onscreen_canvas.onkeypress = function(event) {
-        event.preventDefault();
-    };
-
-    // command() is a C function called to pass back events which
-    // don't fall into other categories like mouse and key events.
-    // Mostly those are button presses, but there's also one for the
-    // game-type dropdown having been changed.
-    command = Module.cwrap('command', 'void', ['number']);
-
-    // Event handlers for buttons and things, which call command().
-    document.getElementById("specific").onclick = function(event) {
-        // Ensure we don't accidentally process these events when a
-        // dialog is actually active, e.g. because the button still
-        // has keyboard focus
-        if (dlg_dimmer === null)
-            command(0);
-    };
-    document.getElementById("random").onclick = function(event) {
-        if (dlg_dimmer === null)
-            command(1);
-    };
-    document.getElementById("new").onclick = function(event) {
-        if (dlg_dimmer === null)
-            command(5);
-    };
-    document.getElementById("restart").onclick = function(event) {
-        if (dlg_dimmer === null)
-            command(6);
-    };
-    undo_button = document.getElementById("undo");
-    undo_button.onclick = function(event) {
-        if (dlg_dimmer === null)
-            command(7);
-    };
-    redo_button = document.getElementById("redo");
-    redo_button.onclick = function(event) {
-        if (dlg_dimmer === null)
-            command(8);
-    };
-    document.getElementById("solve").onclick = function(event) {
-        if (dlg_dimmer === null)
-            command(9);
-    };
-
-    // 'number' is used for C pointers
-    get_save_file = Module.cwrap('get_save_file', 'number', []);
-    free_save_file = Module.cwrap('free_save_file', 'void', ['number']);
-    load_game = Module.cwrap('load_game', 'void', ['string', 'number']);
-
-    document.getElementById("save").onclick = function(event) {
-        if (dlg_dimmer === null) {
-            var savefile_ptr = get_save_file();
-            var savefile_text = Pointer_stringify(savefile_ptr);
-            free_save_file(savefile_ptr);
-            dialog_init("Download saved-game file");
-            dlg_form.appendChild(document.createTextNode(
-                "Click to download the "));
-            var a = document.createElement("a");
-            a.download = "puzzle.sav";
-            a.href = "data:application/octet-stream," +
-                encodeURIComponent(savefile_text);
-            a.appendChild(document.createTextNode("saved-game file"));
-            dlg_form.appendChild(a);
-            dlg_form.appendChild(document.createTextNode("."));
-            dlg_form.appendChild(document.createElement("br"));
-            dialog_launch(function(event) {
-                dialog_cleanup();
-            });
-        }
-    };
-
-    document.getElementById("load").onclick = function(event) {
-        if (dlg_dimmer === null) {
-            dialog_init("Upload saved-game file");
-            var input = document.createElement("input");
-            input.type = "file";
-            input.multiple = false;
-            dlg_form.appendChild(input);
-            dlg_form.appendChild(document.createElement("br"));
-            dialog_launch(function(event) {
-                if (input.files.length == 1) {
-                    var file = input.files.item(0);
-                    var reader = new FileReader();
-                    reader.addEventListener("loadend", function() {
-                        var string = reader.result;
-                        load_game(string, string.length);
-                    });
-                    reader.readAsBinaryString(file);
-                }
-                dialog_cleanup();
-            }, function(event) {
-                dialog_cleanup();
-            });
-        }
-    };
-
-    gametypelist = document.getElementById("gametype");
-    gametypesubmenus.push(gametypelist);
-
-    // In IE, the canvas doesn't automatically gain focus on a mouse
-    // click, so make sure it does
-    onscreen_canvas.addEventListener("mousedown", function(event) {
-        onscreen_canvas.focus();
-    });
-
-    // In our dialog boxes, Return and Escape should be like pressing
-    // OK and Cancel respectively
-    document.addEventListener("keydown", function(event) {
-
-        if (dlg_dimmer !== null && event.keyCode == 13) {
-            for (var i in dlg_return_funcs)
-                dlg_return_funcs[i]();
-            command(3);
-        }
-
-        if (dlg_dimmer !== null && event.keyCode == 27)
-            command(4);
-    });
-
-    // Set up the function pointers we haven't already grabbed. 
-    dlg_return_sval = Module.cwrap('dlg_return_sval', 'void',
-                                   ['number','string']);
-    dlg_return_ival = Module.cwrap('dlg_return_ival', 'void',
-                                   ['number','number']);
-    timer_callback = Module.cwrap('timer_callback', 'void', ['number']);
-
-    // Save references to the two permalinks.
-    permalink_desc = document.getElementById("permalink-desc");
-    permalink_seed = document.getElementById("permalink-seed");
-
-    // Default to giving keyboard focus to the puzzle.
-    onscreen_canvas.focus();
-
-    // Create the resize handle.
-    var resize_handle = document.createElement("canvas");
-    resize_handle.width = 10;
-    resize_handle.height = 10;
-    {
-        var ctx = resize_handle.getContext("2d");
-        ctx.beginPath();
-        for (var i = 1; i <= 7; i += 3) {
-            ctx.moveTo(8.5, i + 0.5);
-            ctx.lineTo(i + 0.5, 8.5);
-        }
-        ctx.lineWidth = '1px';
-        ctx.lineCap = 'round';
-        ctx.lineJoin = 'round';
-        ctx.strokeStyle = '#000000';
-        ctx.stroke();
-    }
-    resizable_div = document.getElementById("resizable");
-    resizable_div.appendChild(resize_handle);
-    resize_handle.style.position = 'absolute';
-    resize_handle.style.zIndex = 98;
-    resize_handle.style.bottom = "0";
-    resize_handle.style.right = "0";
-    resize_handle.style.cursor = "se-resize";
-    resize_handle.title = "Drag to resize the puzzle. Right-click to restore the default size.";
-    var resize_xbase = null, resize_ybase = null, restore_pending = false;
-    var resize_xoffset = null, resize_yoffset = null;
-    var resize_puzzle = Module.cwrap('resize_puzzle',
-                                     'void', ['number', 'number']);
-    var restore_puzzle_size = Module.cwrap('restore_puzzle_size', 'void', []);
-    resize_handle.oncontextmenu = function(event) { return false; }
-    resize_handle.onmousedown = function(event) {
-        if (event.button == 0) {
-            var xy = element_coords(onscreen_canvas);
-            resize_xbase = xy.x + onscreen_canvas.width / 2;
-            resize_ybase = xy.y;
-            resize_xoffset = xy.x + onscreen_canvas.width - event.pageX;
-            resize_yoffset = xy.y + onscreen_canvas.height - event.pageY;
-        } else {
-            restore_pending = true;
-        }
-        resize_handle.setCapture(true);
-        event.preventDefault();
-    };
-    window.addEventListener("mousemove", function(event) {
-        if (resize_xbase !== null && resize_ybase !== null) {
-            resize_puzzle((event.pageX + resize_xoffset - resize_xbase) * 2,
-                          (event.pageY + resize_yoffset - resize_ybase));
-            event.preventDefault();
-            // Chrome insists on selecting text during a resize drag
-            // no matter what I do
-            if (window.getSelection)
-                window.getSelection().removeAllRanges();
-            else
-                document.selection.empty();        }
-    });
-    window.addEventListener("mouseup", function(event) {
-        if (resize_xbase !== null && resize_ybase !== null) {
-            resize_xbase = null;
-            resize_ybase = null;
-            onscreen_canvas.focus(); // return focus to the puzzle
-            event.preventDefault();
-        } else if (restore_pending) {
-            // If you have the puzzle at larger than normal size and
-            // then right-click to restore, I haven't found any way to
-            // stop Chrome and IE popping up a context menu on the
-            // revealed piece of document when you release the button
-            // except by putting the actual restore into a setTimeout.
-            // Gah.
-            setTimeout(function() {
-                restore_pending = false;
-                restore_puzzle_size();
-                onscreen_canvas.focus();
-            }, 20);
-            event.preventDefault();
-        }
-    });
-
-    // Run the C setup function, passing argv[1] as the fragment
-    // identifier (so that permalinks of the form puzzle.html#game-id
-    // can launch the specified id).
-    Module.callMain([location.hash]);
-
-    // And if we get here with everything having gone smoothly, i.e.
-    // we haven't crashed for one reason or another during setup, then
-    // it's probably safe to hide the 'sorry, no puzzle here' div and
-    // show the div containing the actual puzzle.
-    document.getElementById("apology").style.display = "none";
-    document.getElementById("puzzle").style.display = "inline";
-}
diff --git a/emccx.json b/emccx.json
deleted file mode 100644 (file)
index bdab346..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-// -*- js -*-
-//
-// List of entry points exported by the C side of the Emscripten
-// puzzle builds. Passed in to emcc via the option '-s
-// EXPORTED_FUNCTIONS=[list]'.
-//
-// This file isn't actually a valid list in its current state, since
-// emcc doesn't like comments or newlines. However, it's a nicer
-// source form to keep the comments and newlines in, so we sed them
-// away at compile time.
-[
-    // Event handlers for mouse and keyboard input
-    '_mouseup',
-    '_mousedown',
-    '_mousemove',
-    '_key',
-    // Callback when the program activates timing
-    '_timer_callback',
-    // Callback from button presses in the UI outside the canvas
-    '_command',
-    // Game-saving and game-loading functions
-    '_get_save_file',
-    '_free_save_file',
-    '_load_game',
-    // Callbacks to return values from dialog boxes
-    '_dlg_return_sval',
-    '_dlg_return_ival',
-    // Callbacks when the resizing controls are used
-    '_resize_puzzle',
-    '_restore_puzzle_size',
-    // Main program, run at initialisation time
-    '_main'
-]
diff --git a/gtk.c b/gtk.c
index 37ba8078e20d5858eb25659cf34336cb2f57cece..30257cbfbc3802e691118cdb3964e409519aabf7 100644 (file)
--- a/gtk.c
+++ b/gtk.c
@@ -2,6 +2,10 @@
  * gtk.c: GTK front end for my puzzle collection.
  */
 
+#ifndef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 1 /* for PATH_MAX */
+#endif
+
 #include <stdio.h>
 #include <assert.h>
 #include <stdlib.h>
@@ -10,6 +14,9 @@
 #include <string.h>
 #include <errno.h>
 #include <math.h>
+#include <limits.h>
+#include <unistd.h>
+#include <locale.h>
 
 #include <sys/time.h>
 #include <sys/resource.h>
@@ -2364,6 +2371,89 @@ static void menu_config_event(GtkMenuItem *menuitem, gpointer data)
     midend_redraw(fe->me);
 }
 
+#ifndef HELP_BROWSER_PATH
+#define HELP_BROWSER_PATH "xdg-open:sensible-browser"
+#endif
+
+static void show_help(frontend *fe, const char *topic)
+{
+    const char *list = HELP_BROWSER_PATH;
+    char path[PATH_MAX + 1];
+    struct {
+       const char *s;
+       int len;
+    } lang[3];
+    int i;
+
+    /*
+     * Search for help file, trying:
+     * 1. Version for this locale, ignoring encoding (HTML browsers
+     *    must handle multiple encodings)
+     * 2. Version for this locale, ignoring encoding and country
+     * 3. English version
+     */
+    lang[0].s = setlocale(LC_MESSAGES, NULL);
+    lang[0].len = strcspn(lang[0].s, ".@");
+    lang[1].s = lang[0].s;
+    lang[1].len = strcspn(lang[1].s, "_");
+    if (lang[1].len > lang[0].len)
+       lang[1].len = lang[0].len;
+    lang[2].s = "en";
+    lang[2].len = 2;
+    for (i = 0; i < lenof(lang); i++) {
+       sprintf(path, "%s/sgt-puzzles/help/%.*s/%s.html",
+               SHAREDIR, lang[i].len, lang[i].s, topic);
+       if (access(path, R_OK) == 0)
+           break;
+    }
+    if (i == lenof(lang)) {
+       error_box(fe->window, "Help file is not installed");
+       return;
+    }
+
+    for (;;) {
+       size_t len;
+       char buf[PATH_MAX + 1];
+       const char *command;
+       const char *argv[3];
+
+       len = strcspn(list, ":");
+       if (len <= PATH_MAX) {
+           memcpy(buf, list, len);
+           buf[len] = 0;
+           if (buf[0] == '$')
+               command = getenv(buf + 1);
+           else
+               command = buf;
+           if (command) {
+               argv[0] = command;
+               argv[1] = path;
+               argv[2] = NULL;
+               if (g_spawn_async(NULL, (char **)argv, NULL,
+                                 G_SPAWN_SEARCH_PATH,
+                                 NULL, NULL, NULL, NULL))
+                   return;
+           }
+       }
+
+       if (!list[len])
+           break;
+       list += len + 1;
+    }
+
+    error_box(fe->window, "Failed to start a help browser");
+}
+
+static void menu_help_contents_event(GtkMenuItem *menuitem, gpointer data)
+{
+    show_help((frontend *)data, "index");
+}
+
+static void menu_help_specific_event(GtkMenuItem *menuitem, gpointer data)
+{
+    show_help((frontend *)data, thegame.htmlhelp_topic);
+}
+
 static void menu_about_event(GtkMenuItem *menuitem, gpointer data)
 {
     frontend *fe = (frontend *)data;
@@ -2711,6 +2801,25 @@ static frontend *new_window(char *arg, int argtype, char **error)
     menu = gtk_menu_new();
     gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);
 
+    menuitem = gtk_menu_item_new_with_label("Contents");
+    gtk_container_add(GTK_CONTAINER(menu), menuitem);
+    g_signal_connect(G_OBJECT(menuitem), "activate",
+                    G_CALLBACK(menu_help_contents_event), fe);
+    gtk_widget_show(menuitem);
+
+    if (thegame.htmlhelp_topic) {
+       char *item;
+       assert(thegame.name);
+       item = snewn(9+strlen(thegame.name), char); /*ick*/
+       sprintf(item, "Help on %s", thegame.name);
+       menuitem = gtk_menu_item_new_with_label(item);
+       sfree(item);
+       gtk_container_add(GTK_CONTAINER(menu), menuitem);
+       g_signal_connect(G_OBJECT(menuitem), "activate",
+                        G_CALLBACK(menu_help_specific_event), fe);
+       gtk_widget_show(menuitem);
+    }
+
     menuitem = gtk_menu_item_new_with_label("About");
     gtk_container_add(GTK_CONTAINER(menu), menuitem);
     g_signal_connect(G_OBJECT(menuitem), "activate",
diff --git a/html/blackbox.html b/html/blackbox.html
deleted file mode 100644 (file)
index f98604f..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-Black Box
-<p>
-Determine where the hidden balls are in the box, by observing the
-behaviour of light beams fired into the box from the sides.
-<p>
-Click in a square around the edge of the box to send a beam into the
-box. Possible results are 'H' (the beam hit a ball dead-on and
-stopped), 'R' (the beam was either reflected back the way it came or
-there was a ball just to one side of its entry point) or a number
-appearing in two squares (indicating that the beam entered one of
-those squares and emerged from the other).
-<p>
-Click in the middle of the box to place your guessed ball positions.
-When you have placed enough, a green button will appear in the top
-left; click that to indicate that you think you have the answer.
-You can also right-click to mark squares as definitely known.
diff --git a/html/bridges.html b/html/bridges.html
deleted file mode 100644 (file)
index 06ec2d4..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-Bridges
-<p>
-Draw horizontal or vertical bridges to link up all the islands.
-Bridges may be single or double; they may not cross; the islands
-must all end up connected to each other; the number in each island
-must match the number of bridges that end at that island (counting
-double bridges as two). Note that loops of bridges are permitted.
-<p>
-Click on an island and drag left, right, up or down to draw a bridge
-to the next island in that direction. Do the same again to create a
-double bridge, and again to remove the bridge if you change your
-mind. Click on an island without dragging to mark the island as
-completed once you think you have placed all its bridges.
diff --git a/html/cube.html b/html/cube.html
deleted file mode 100644 (file)
index f08e16c..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-Cube
-<p>
-Roll the cube around the grid, picking up the blue squares on its
-faces. Try to get all the blue squares on to the object at the same
-time, in as few moves as possible.
-<p>
-Use the arrow keys to roll the cube, or click the mouse where you
-want it to roll towards. After every roll, the grid square and cube
-face that you brought into contact swap their colours, so that a
-non-blue cube face can pick up a blue square, but a blue face rolled
-on to a non-blue square puts it down again.
-<p>
-When you have mastered the cube, use the Type menu to select other
-regular solids!
diff --git a/html/dominosa.html b/html/dominosa.html
deleted file mode 100644 (file)
index d2f6728..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-Dominosa
-<p>
-Tile the rectangle with dominoes (1&times;2 rectangles) so that
-every possible domino appears exactly once (that is, every possible
-pair of numbers, including doubles).
-<p>
-Click between two adjacent numbers to place or remove a domino.
-Right-click to place a line between numbers if you think a domino
-definitely cannot go there. Dominoes light up red if two identical
-ones appear on the grid.
diff --git a/html/fifteen.html b/html/fifteen.html
deleted file mode 100644 (file)
index 53053b4..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-Fifteen
-<p>
-Slide the tiles around the box until they appear in numerical order
-from the top left, with the hole in the bottom right corner.
-<p>
-Click on a tile to slide it towards the hole.
diff --git a/html/filling.html b/html/filling.html
deleted file mode 100644 (file)
index 70ce16d..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Filling
-<p>
-Write a number in every blank square of the grid. When the grid is
-full, every orthogonally connected group of identical numbers should
-have an area equal to that number: so 1s always appear alone, 2s in
-pairs, and so on.
-<p>
-To place a number, click the mouse in a blank square to select it,
-then type the number you want on the keyboard. You can also drag to
-select multiple squares, and then type a number to place it in all
-of them. To erase numbers, select one or more squares in the same
-way and then press Backspace.
diff --git a/html/flip.html b/html/flip.html
deleted file mode 100644 (file)
index 404aae6..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-Flip
-<p>
-Try to light up all the squares in the grid by flipping combinations
-of them.
-<p>
-Click in a square to flip it and some of its neighbours. The diagram
-in each square indicates which other squares will flip.
-<p>
-Select one of the 'Random' settings from the Type menu for more
-varied puzzles.
diff --git a/html/flood.html b/html/flood.html
deleted file mode 100644 (file)
index cf09eac..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-Flood
-<p>
-Try to get the whole grid to be the same colour within the given
-number of moves, by repeatedly flood-filling the top left corner in
-different colours.
-<p>
-Click in a square to flood-fill the top left corner with that square's
-colour.
diff --git a/html/galaxies.html b/html/galaxies.html
deleted file mode 100644 (file)
index 8041a95..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Galaxies
-<p>
-Draw lines along grid edges so as to divide the grid up into
-regions. Every region should have two-way rotational symmetry, and
-should contain exactly one dot which is in its centre.
-<p>
-Click on a grid edge to add or remove a line. Right-click on a dot
-and drag the mouse to place an arrow in a grid square pointing to
-that dot, to indicate that you think that square must belong in the
-same region as that dot. Right-drag an existing arrow to move it, or
-drop it off the edge of the grid to remove it.
diff --git a/html/group.html b/html/group.html
deleted file mode 100644 (file)
index c0f52de..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-unfinished:Group
-<p>
-Fill in the grid with the letters shown to the top and left of it, so
-that the full grid is a valid
-<a href="http://en.wikipedia.org/wiki/Cayley_table">Cayley table</a>
-for a
-<a href="http://en.wikipedia.org/wiki/Group_(mathematics)">group</a>.
-<p>
-If you don't already know what a group is, I don't really recommend
-trying to play this game. But if you want to try anyway, the above is
-equivalent to saying that the following conditions must be satisfied:
-<ul>
-<li>
-<strong>Latin square</strong>. Every row and column must contain
-exactly one of each letter.
-<li>
-<strong>Identity</strong>. There must be some letter <i>e</i> such
-that, for all <i>a</i>, the letter in row <i>e</i> column <i>a</i> and
-the one in row <i>a</i> column <i>e</i> are both <i>a</i>. In the
-default mode, this letter is always <i>e</i> and its row and column
-are filled in for you; by reconfiguring the game using the Type menu,
-you can select a mode in which you have to work out which letter is
-the identity.
-<li>
-<strong>Inverses</strong>. For every letter <i>a</i>, there must be
-some letter <i>b</i> (which may sometimes be the same letter
-as <i>a</i>) such that the letters in row <i>a</i> column <i>b</i> and
-in row <i>b</i> column <i>a</i> are both the identity letter (as
-defined above).
-<li>
-<strong>Associativity</strong>. For every combination of
-letters <i>a</i>, <i>b</i>, and <i>c</i>, denote the letter in
-row <i>a</i> column <i>b</i> by <i>d</i>, and the one in row <i>b</i>
-column <i>c</i> by <i>e</i>. Then the letters in row <i>d</i>
-column <i>c</i> and in row <i>a</i> column <i>e</i> must be the same.
-</ul>
-<p>
-To place a letter, click in a square to select it, then type the
-letter on the keyboard. To erase a letter, click to select a square
-and then press Backspace.
-<p>
-Right-click in a square and then type a letter to add or remove the
-number as a pencil mark, indicating letters that you think
-<em>might</em> go in that square.
-<p>
-You can rearrange the order of elements in the rows and columns by
-dragging the column or row headings back and forth. (The rows and
-columns will stay in sync with each other.) Also,
-left-clicking <em>between</em> two row or column headings will add or
-remove a thick line between those two rows and the corresponding pair
-of columns (which is useful if you're considering a subgroup and its
-cosets).
diff --git a/html/guess.html b/html/guess.html
deleted file mode 100644 (file)
index 1e4fc1e..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Guess
-<p>
-Try to guess the hidden combination of colours. You will be given
-limited information about each guess you make, enabling you to
-refine the next guess.
-<p>
-Drag from the colours on the left into the topmost unfilled row to
-make a guess; then click on the small circles to submit that guess.
-The small circles give you your feedback: black pegs indicate how
-many of the colours you guessed were the right colour in the right
-place, and white pegs indicate how many of the rest were the right
-colours but in the wrong place.
diff --git a/html/inertia.html b/html/inertia.html
deleted file mode 100644 (file)
index 20077c0..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-Inertia
-<p>
-Slide the ball around the grid picking up the gems. Every time the
-ball moves, it will keep sliding until it either hits a wall, or
-stops on a stop square (the broken circles). Try to collect every
-gem without running into any of the mines.
-<p>
-Use the numeric keypad to slide the ball horizontally, vertically or
-diagonally. Alternatively, click on the grid to make the ball move
-towards where you clicked.
-<p>
-If you hit a mine and explode, you can select Undo from the Game
-menu and continue playing; the game will track how many times you
-died.
diff --git a/html/javapage.pl b/html/javapage.pl
deleted file mode 100755 (executable)
index cd5e6a1..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-open my $footerfile, "<", shift @ARGV or die "footer: open: $!\n";
-my $footer = "";
-$footer .= $_ while <$footerfile>;
-close $footerfile;
-
-for my $arg (@ARGV) {
-    $arg =~ /(.*\/)?([^\/]+)\.html$/ or die;
-    my $filename = $2;
-    open my $gamefile, "<", $arg or die "$arg: open: $!\n";
-    my $unfinished = 0;
-    my $docname = $filename;
-    chomp(my $puzzlename = <$gamefile>);
-    while ($puzzlename =~ s/^([^:=]+)(=([^:]+))?://) {
-        if ($1 eq "unfinished") {
-            $unfinished = 1;
-        } elsif ($1 eq "docname") {
-            $docname = $3;
-        } else {
-            die "$arg: unknown keyword '$1'\n";
-        }
-    }
-    my $instructions = "";
-    $instructions .= $_ while <$gamefile>;
-    close $gamefile;
-
-    open my $outpage, ">", "${filename}.html";
-
-    my $unfinishedtitlefragment = $unfinished ? "an unfinished puzzle " : "";
-    my $unfinishedheading = $unfinished ? "<h2 align=center>an unfinished puzzle</h2>\n" : "";
-    my $unfinishedpara;
-    my $links;
-    if ($unfinished) {
-        $unfinishedpara = <<EOF;
-<p>
-You have found your way to a page containing an <em>unfinished</em>
-puzzle in my collection, not linked from the <a href="../">main
-puzzles page</a>. Don't be surprised if things are hard to understand
-or don't work as you expect.
-EOF
-        $links = <<EOF;
-<p align="center">
-<a href="../">Back to main puzzles page</a> (which does not link to this)
-EOF
-    } else {
-        $unfinishedpara = "";
-        $links = <<EOF;
-<p align="center">
-<a href="../doc/${docname}.html#${docname}">Full instructions</a>
-|
-<a href="../">Back to main puzzles page</a>
-EOF
-    }
-
-    print $outpage <<EOF;
-<html>
-<head>
-<title>${puzzlename}, ${unfinishedtitlefragment}from Simon Tatham's Portable Puzzle Collection</title>
-<link rel="stylesheet" type="text/css" href="../../sitestyle.css" name="Simon Tatham's Home Page Style">
-<script type="text/javascript" src="resize-puzzle-applet.js"></script>
-</head>
-<body onLoad="initResizablePuzzleApplet();">
-<h1 align=center>${puzzlename}</h1>
-${unfinishedheading}
-<h2 align=center>from Simon Tatham's Portable Puzzle Collection</h2>
-
-${unfinishedpara}
-
-<p align="center">
-<table cellpadding="0">
-<tr>
-<td>
-<applet id="applet" archive="${filename}.jar" code="PuzzleApplet"
-        width="700" height="500">
-</applet>
-</td>
-<td>
-<div id="eresize" style="width:5px;height:500px;cursor:e-resize;"></div>
-</td>
-</tr>
-<td>
-<div id="sresize" style="width:700px;height:5px;cursor:s-resize;"></div>
-</td>
-<td>
-<div id="seresize" style="width:5px;height:5px;cursor:se-resize;"></div>
-</td>
-</tr>
-</table>
-
-${instructions}
-
-${links}
-
-${footer}
-</body>
-</html>
-EOF
-
-    close $outpage;
-}
diff --git a/html/jspage.pl b/html/jspage.pl
deleted file mode 100755 (executable)
index b409783..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-my $jspath = "";
-while ($ARGV[0] =~ /^-/) {
-    my $opt = shift @ARGV;
-    last if $opt eq "--";
-    if ($opt =~ /^--jspath=(.+)$/) {
-        $jspath = $1;
-    } else {
-        die "jspage.pl: unrecognised option '$opt'\n";
-    }
-}
-
-open my $footerfile, "<", shift @ARGV or die "footer: open: $!\n";
-my $footer = "";
-$footer .= $_ while <$footerfile>;
-close $footerfile;
-
-for my $arg (@ARGV) {
-    $arg =~ /(.*\/)?([^\/]+)\.html$/ or die;
-    my $filename = $2;
-    open my $gamefile, "<", $arg or die "$arg: open: $!\n";
-    my $unfinished = 0;
-    my $docname = $filename;
-    chomp(my $puzzlename = <$gamefile>);
-    while ($puzzlename =~ s/^([^:=]+)(=([^:]+))?://) {
-        if ($1 eq "unfinished") {
-            $unfinished = 1;
-        } elsif ($1 eq "docname") {
-            $docname = $3;
-        } else {
-            die "$arg: unknown keyword '$1'\n";
-        }
-    }
-    my $instructions = "";
-    $instructions .= $_ while <$gamefile>;
-    close $gamefile;
-
-    open my $outpage, ">", "${filename}.html";
-
-    my $unfinishedtitlefragment = $unfinished ? "an unfinished puzzle " : "";
-    my $unfinishedheading = $unfinished ? "<h2 align=center>an unfinished puzzle</h2>\n" : "";
-    my $unfinishedpara;
-    my $links;
-    if ($unfinished) {
-        $unfinishedpara = <<EOF;
-<p>
-You have found your way to a page containing an <em>unfinished</em>
-puzzle in my collection, not linked from the <a href="../">main
-puzzles page</a>. Don't be surprised if things are hard to understand
-or don't work as you expect.
-EOF
-        $links = <<EOF;
-<p align="center">
-<a href="../">Back to main puzzles page</a> (which does not link to this)
-EOF
-    } else {
-        $unfinishedpara = "";
-        $links = <<EOF;
-<p align="center">
-<a href="../doc/${docname}.html#${docname}">Full instructions</a>
-|
-<a href="../">Back to main puzzles page</a>
-EOF
-    }
-
-    print $outpage <<EOF;
-<!DOCTYPE html>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ASCII" />
-<title>${puzzlename}, ${unfinishedtitlefragment}from Simon Tatham's Portable Puzzle Collection</title>
-<script type="text/javascript" src="${jspath}${filename}.js"></script>
-<style class="text/css">
-/* Margins and centring on the top-level div for the game menu */
-#gamemenu { margin-top: 0; margin-bottom: 0.5em; text-align: center }
-
-/* Inside that div, the main menu bar and every submenu inside it is a <ul> */
-#gamemenu ul {
-    list-style: none;  /* get rid of the normal unordered-list bullets */
-    display: inline;   /* make top-level menu bar items appear side by side */
-    position: relative; /* allow submenus to position themselves near parent */
-    margin: 0;
-    margin-bottom: 0.5em;
-    padding: 0;
-}
-
-/* Individual menu items are <li> elements within such a <ul> */
-#gamemenu ul li {
-    /* Add a little mild text formatting */
-    font-weight: bold; font-size: 0.8em;
-    /* Line height and padding appropriate to top-level menu items */
-    padding-left: 0.75em; padding-right: 0.75em;
-    padding-top: 0.2em; padding-bottom: 0.2em;
-    margin: 0;
-    /* Make top-level menu items appear side by side, not vertically stacked */
-    display: inline;
-    /* Suppress the text-selection I-beam pointer */
-    cursor: default;
-    /* Surround each menu item with a border. The left border is removed
-     * because it will abut the right border of the previous item. (A rule
-     * below will reinstate the left border for the leftmost menu item.) */
-    border-left: 0;
-    border-right: 1px solid rgba(0,0,0,0.3);
-    border-top: 1px solid rgba(0,0,0,0.3);
-    border-bottom: 1px solid rgba(0,0,0,0.3);
-}
-
-#gamemenu ul li.disabled {
-    /* Grey out menu items with the "disabled" class */
-    color: rgba(0,0,0,0.5);
-}
-
-#gamemenu ul li.separator {
-    color: transparent;
-    border: 0;
-}
-
-#gamemenu ul li.afterseparator {
-    border-left: 1px solid rgba(0,0,0,0.3);
-}
-
-#gamemenu ul li:first-of-type {
-    /* Reinstate the left border for the leftmost top-level menu item */
-    border-left: 1px solid rgba(0,0,0,0.3);
-}
-
-#gamemenu ul li:hover {
-    /* When the mouse is over a menu item, highlight it */
-    background: rgba(0,0,0,0.3);
-    /* Set position:relative, so that if this item has a submenu it can
-     * position itself relative to the parent item. */
-    position: relative;
-}
-
-#gamemenu ul li.disabled:hover {
-    /* Disabled menu items don't get a highlight on mouse hover */
-    background: inherit;
-}
-
-#gamemenu ul ul {
-    /* Second-level menus and below are not displayed by default */
-    display: none;
-    /* When they are displayed, they are positioned immediately below
-     * their parent <li>, and with the left edge aligning */
-    position: absolute;
-    top: 100%;
-    left: 0;
-    /* We must specify an explicit background colour for submenus, because
-     * they must be opaque (don't want other page contents showing through
-     * them). */
-    background: white;
-    /* And make sure they appear in front. */
-    z-index: 1;
-}
-
-#gamemenu ul ul.left {
-    /* A second-level menu with class "left" aligns its right edge with
-     * its parent, rather than its left edge */
-    left: inherit; right: 0;
-}
-
-/* Menu items in second-level menus and below */
-#gamemenu ul ul li {
-    /* Go back to vertical stacking, for drop-down submenus */
-    display: block;
-    /* Inhibit wrapping, so the submenu will expand its width as needed. */
-    white-space: nowrap;
-    /* Override the text-align:center from above */
-    text-align: left;
-    /* Don't make the text any smaller than the previous level of menu */
-    font-size: 100%;
-    /* This time it's the top border that we omit on all but the first
-     * element in the submenu, since now they're vertically stacked */
-    border-left: 1px solid rgba(0,0,0,0.3);
-    border-right: 1px solid rgba(0,0,0,0.3);
-    border-top: 0;
-    border-bottom: 1px solid rgba(0,0,0,0.3);
-}
-
-#gamemenu ul ul li:first-of-type {
-    /* Reinstate top border for first item in a submenu */
-    border-top: 1px solid rgba(0,0,0,0.3);
-}
-
-#gamemenu ul ul ul {
-    /* Third-level submenus are drawn to the side of their parent menu
-     * item, not below it */
-    top: 0; left: 100%;
-}
-
-#gamemenu ul ul ul.left {
-    /* A submenu with class "left" goes to the left of its parent,
-     * not the right */
-    left: inherit; right: 100%;
-}
-
-#gamemenu ul li:hover > ul {
-    /* Last but by no means least, the all-important line that makes
-     * submenus be displayed! Any <ul> whose parent <li> is being
-     * hovered over gets display:block overriding the display:none
-     * from above. */
-    display: block;
-}
-</style>
-</head>
-<body onLoad="initPuzzle();">
-<h1 align=center>${puzzlename}</h1>
-${unfinishedheading}
-<h2 align=center>from Simon Tatham's Portable Puzzle Collection</h2>
-
-${unfinishedpara}
-
-<hr>
-<div id="puzzle" style="display: none">
-<div id="gamemenu"><ul><li>Game...<ul
-><li id="specific">Enter game ID</li
-><li id="random">Enter random seed</li
-><li id="save">Download save file</li
-><li id="load">Upload save file</li
-></ul></li
-><li>Type...<ul id="gametype"></ul></li
-><li class="separator"></li
-><li id="new" class="afterseparator">New game</li
-><li id="restart">Restart game</li
-><li id="undo">Undo move</li
-><li id="redo">Redo move</li
-><li id="solve">Solve game</li
-></ul></div>
-<div align=center>
-  <div id="resizable" style="position:relative; left:0; top:0">
-  <canvas style="display: block" id="puzzlecanvas" width="1px" height="1px" tabindex="1">
-  </canvas>
-  <div id="statusbarholder" style="display: block">
-  </div>
-  </div>
-  <p>
-    Link to this puzzle:
-    <a id="permalink-desc">by game ID</a>
-    <a id="permalink-seed">by random seed</a>
-  </p>
-</div>
-</div>
-<div id="apology">
-Sorry, this Javascript puzzle doesn't seem to work in your web
-browser. Perhaps you have Javascript disabled, or perhaps your browser
-doesn't provide a feature that the puzzle code requires (such as
-<a href="https://developer.mozilla.org/en-US/docs/JavaScript/Typed_arrays">typed arrays</a>).
-These puzzles have been successfully run in Firefox 19, Chrome 26,
-Internet Explorer 10 and Safari 6.
-</div>
-<hr>
-
-${instructions}
-
-${links}
-
-${footer}
-</body>
-</html>
-EOF
-
-    close $outpage;
-}
diff --git a/html/keen.html b/html/keen.html
deleted file mode 100644 (file)
index bd0eb36..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-Keen
-<p>
-Fill in the grid with digits from 1 to the grid size, so that every
-digit appears exactly once in each row and column, and so that all
-the arithmetic clues are satisfied (i.e. the clue number in each
-thick box should be possible to construct from the digits in the box
-using the specified arithmetic operation).
-<p>
-To place a number, click in a square to select it, then type the
-number on the keyboard. To erase a number, click to select a square
-and then press Backspace.
-<p>
-Right-click in a square and then type a number to add or remove the
-number as a pencil mark, indicating numbers that you think
-<em>might</em> go in that square.
diff --git a/html/lightup.html b/html/lightup.html
deleted file mode 100644 (file)
index 2de2f91..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-Light Up
-<p>
-Place light bulbs in the grid so as to light up all the blank
-squares. A light illuminates its own square and all the squares in
-the same row or column unless blocked by walls (black squares).
-Lights may not illuminate each other. Each numbered square must be
-orthogonally adjacent to exactly the given number of lights.
-<p>
-Click on a square to place or remove a light. Right-click to place a
-dot indicating that you think there is no light in that square.
diff --git a/html/loopy.html b/html/loopy.html
deleted file mode 100644 (file)
index 96f3a9d..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-Loopy
-<p>
-Form a single closed loop out of the grid edges, in such a way that
-every numbered square has exactly that many of its edges included in
-the loop.
-<p>
-Click on a grid edge to mark it as part of the loop (black), and
-again to return to marking it as undecided (yellow). Right-click on
-a grid edge to mark it as definitely not part of the loop (faint
-grey), and again to mark it as undecided again.
-<p>
-When you have mastered the square grid, look in the Type menu for
-many other types of tiling!
diff --git a/html/magnets.html b/html/magnets.html
deleted file mode 100644 (file)
index 2807569..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-Magnets
-<p>
-Fill each domino shape with either a magnet (consisting of a + and
-&#8722; pole) or a neutral domino (green).
-<p>
-The number of + poles that in each row and column must match the
-numbers along the top and left; the number of &#8722; poles must
-match the numbers along the bottom and right. Two + poles may not be
-orthogonally adjacent to each other, and similarly two &#8722; poles.
-<p>
-Left-click a domino to toggle it between being empty and being a
-magnet (the + is placed in the end you click). Right-click to toggle
-between empty, neutral, and a ?? mark indicating that you're sure
-it's a magnet but don't yet know which way round it goes.
-<p>
-Left-click a clue to mark it as done (grey it out). To unmark a clue
-as done, left-click it again.
diff --git a/html/map.html b/html/map.html
deleted file mode 100644 (file)
index 5f81793..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-Map
-<p>
-Colour the map with four colours, so that no two adjacent regions
-have the same colour. (Regions touching at only one corner do not
-count as adjacent.) There is a unique colouring consistent with the
-coloured regions you are already given.
-<p>
-Drag from a coloured region to a blank one to colour the latter the
-same colour as the former. Drag from outside the grid into a region
-to erase its colour. (You cannot change the colours of the regions
-you are given at the start of the game.)
-<p>
-Right-drag from a coloured region to a blank one to add dots marking
-the latter region as <em>possibly</em> the same colour as the
-former, or to remove those dots again.
diff --git a/html/mines.html b/html/mines.html
deleted file mode 100644 (file)
index d17d6ff..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-Mines
-<p>
-Try to expose every square in the grid that is not one of the hidden
-mines, without opening any square that is a mine.
-<p>
-Click in a square to open it. Every opened square are marked with
-the number of mines in the surrounding 8 squares, if there are any;
-if not, all the surrounding squares are automatically opened.
-<p>
-Right-click in a square to mark it with a flag if you think it is a
-mine. If a numbered square has exactly the right number of flags
-around it, you can click in it to open all the squares around it
-that are not flagged.
-<p>
-The first square you open is guaranteed to be safe, and (by default)
-you are guaranteed to be able to solve the whole grid by deduction
-rather than guesswork. (Deductions may require you to think about
-the total number of mines.)
diff --git a/html/net.html b/html/net.html
deleted file mode 100644 (file)
index 08bffba..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-Net
-<p>
-Rotate the grid squares so that they all join up into a single
-connected network with no loops.
-<p>
-Left-click in a square to rotate it anticlockwise. Right-click to
-rotate it clockwise. Middle-click, or shift-left-click if you have
-no middle mouse button, to lock a square once you think it is
-correct (so you don't accidentally rotate it again); do the same
-again to unlock it if you change your mind.
-<p>
-Squares connected to the middle square are lit up. Aim to light up
-every square in the grid (not just the endpoint blobs).
-<p>
-When this gets too easy, select a 'wrapping' variant from the Type
-menu to enable grid lines to run off one edge of the playing area
-and come back on the opposite edge!
diff --git a/html/netslide.html b/html/netslide.html
deleted file mode 100644 (file)
index f187741..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-Netslide
-<p>
-Slide the grid squares around so that they all join up into a single
-connected network with no loops.
-<p>
-Click on the arrows at the edges of the grid to move a row or column
-left, right, up or down. The square that falls off the end of the
-row comes back on the other end.
-<p>
-Squares connected to the middle square are lit up. Aim to light up
-every square in the grid (not just the endpoint blobs).
-<p>
-Connecting across a red barrier line is forbidden. On harder levels,
-there are fewer barriers, which makes it harder rather than easier!
diff --git a/html/palisade.html b/html/palisade.html
deleted file mode 100644 (file)
index 5b6b933..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Palisade
-<p>
-Draw lines along the grid edges, in such a way that the grid is
-divided into connected regions, all of the size shown in the status
-line. Also, each square containing a number should have that many of
-its edges drawn in.
-<p>
-Click on a grid edge to mark it as a division between regions (black),
-and again to return to marking it as undecided (yellow). Right-click
-on a grid edge to mark it as definitely not part of the loop (faint
-grey), and again to mark it as undecided again.
diff --git a/html/pattern.html b/html/pattern.html
deleted file mode 100644 (file)
index 54e05d6..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Pattern
-<p>
-Fill in the grid with a pattern of black and white squares, so that
-the numbers in each row and column match the lengths of consecutive
-runs of black squares.
-<p>
-Left-click in a square to mark it black; right-click (or hold Ctrl
-while left-clicking) to mark it white. Click and drag along a row or
-column to mark multiple squares black or white at once. Middle-click
-(or hold Shift while left-clicking) to return a square to grey
-(meaning undecided): dragging like that can erase a whole rectangle,
-not just a row or column.
diff --git a/html/pearl.html b/html/pearl.html
deleted file mode 100644 (file)
index 2ca25a5..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-Pearl
-<p>
-Draw a single closed loop by connecting together the centres of
-adjacent grid squares, so that some squares end up as corners, some as
-straights (horizontal or vertical), and some may be empty. Every
-square containing a black circle must be a corner not connected
-directly to another corner; every square containing a white circle
-must be a straight which is connected to <em>at least one</em> corner.
-<p>
-Drag between squares to draw or undraw pieces of the loop.
-Alternatively, left-click the edge between two squares to turn it on
-or off. Right-click an edge to mark it with a cross indicating that
-you are sure the loop does not go through it.
diff --git a/html/pegs.html b/html/pegs.html
deleted file mode 100644 (file)
index 4a23788..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-Pegs
-<p>
-Jump one peg over another to remove the one you jumped over. Try to
-remove all but one peg.
-<p>
-Drag a peg into an empty space to make a move. The target space must
-be exactly two holes away from the starting peg, in an orthogonal
-direction, and there must be a peg in the hole in between.
diff --git a/html/range.html b/html/range.html
deleted file mode 100644 (file)
index bb5b59c..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-Range
-<p>
-Colour some squares black, so as to meet the following conditions:
-<ul>
-<li>
-No two black squares are orthogonally adjacent.
-<li>
-No group of white squares is separated from the rest of the grid by
-black squares.
-<li>
-Each numbered cell can see precisely that many white squares in
-total by looking in all four orthogonal directions, counting itself.
-(Black squares block the view. So, for example, a 2 clue must be
-adjacent to three black squares or grid edges, and in the fourth
-direction there must be one white square and then a black one beyond
-it.)
-</ul>
-
-<p>
-Left-click to colour a square black. Right-click to mark a square
-with a dot, if you know it should not be black.
diff --git a/html/rect.html b/html/rect.html
deleted file mode 100644 (file)
index d23d827..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-docname=rectangles:Rectangles
-<p>
-Draw lines along the grid edges to divide the grid into rectangles,
-so that each rectangle contains exactly one numbered square and its
-area is equal to the number written in that square.
-<p>
-Click and drag from one grid corner to another, or from one square
-centre to another, to draw a rectangle. You can also drag along a
-grid line to just draw a line at a time, or just click on a single
-grid edge to draw or erase it.
diff --git a/html/samegame.html b/html/samegame.html
deleted file mode 100644 (file)
index e6de095..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-Same Game
-<p>
-Try to empty the playing area completely, by removing connected
-groups of two or more squares of the same colour. Then try to score
-as much as possible, by removing large groups at a time instead of
-small ones.
-<p>
-Click on a coloured square to highlight the rest of its connected
-group. The status line will print the number of squares selected,
-and the score you would gain by removing them. Click again to remove
-the group; other squares will fall down to fill the space, and if
-you empty a whole column then the other columns will move up. You
-cannot remove a single isolated square: try to avoid dead-end
-positions where all remaining squares are isolated.
diff --git a/html/signpost.html b/html/signpost.html
deleted file mode 100644 (file)
index fa23e99..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-Signpost
-<p>
-Connect all the squares together into a sequence, so that every
-square's arrow points towards the square that follows it (though the
-next square can be any distance away in that direction).
-
-<p>
-Left-drag from a square to the square that should follow it, or
-right-drag from a square to the square that should precede it.
-
-<p>
-Left-drag a square off the grid to break all links to it. Right-drag
-a square off the grid to break all links to it and everything else
-in its connected chain.
diff --git a/html/singles.html b/html/singles.html
deleted file mode 100644 (file)
index 252bffb..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Singles
-<p>
-Black out some of the squares, in such a way that:
-<ul><li>no number appears twice in any row or column
-<li>no two black squares are adjacent
-<li>the white squares form a single connected group (connections
-along diagonals do not count).</ul>
-<p>
-Click in a square to black it out, and again to uncover it.
-Right-click in a square to mark it with a circle, indicating that
-you're sure it should <em>not</em> be blacked out.
diff --git a/html/sixteen.html b/html/sixteen.html
deleted file mode 100644 (file)
index 4530469..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-Sixteen
-<p>
-Slide the grid squares around so that the numbers end up in
-consecutive order from the top left corner.
-<p>
-Click on the arrows at the edges of the grid to move a row or column
-left, right, up or down. The square that falls off the end of the
-row comes back on the other end.
diff --git a/html/slant.html b/html/slant.html
deleted file mode 100644 (file)
index d6d31aa..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-Slant
-<p>
-Fill in a diagonal line in every grid square so that there are no
-loops in the grid, and so that every numbered point has that many
-lines meeting at it.
-<p>
-Left-click in a square to mark it with a <code>\</code>; right-click
-to mark it with a <code>/</code>. Keep clicking in a square to
-cycle it between <code>\</code>, <code>/</code> and empty.
diff --git a/html/solo.html b/html/solo.html
deleted file mode 100644 (file)
index 88ebd5c..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-Solo
-<p>
-Fill in a number in every square so that every number appears
-exactly once in each row, each column and each block marked by thick
-lines.
-<p>
-To place a number, click in a square to select it, then type the
-number on the keyboard. To erase a number, click to select a square
-and then press Backspace.
-<p>
-Right-click in a square and then type a number to add or remove the
-number as a pencil mark, indicating numbers that you think
-<em>might</em> go in that square.
-<p>
-When you master the basic game, try Jigsaw mode (irregularly shaped
-blocks), X mode (the two main diagonals of the grid must also
-contain every number once), Killer mode (instead of single-cell
-clues you are given regions of the grid each of which must add up to
-a given total, again without reusing any digits), or all of those at
-once!
diff --git a/html/tents.html b/html/tents.html
deleted file mode 100644 (file)
index e3f6d5f..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-Tents
-<p>
-Place tents in the empty squares in such a way that:
-<ul>
-<li>no two tents are adjacent, even diagonally
-<li>the number of tents in each row and column matches the numbers
-around the edge of the grid
-<li>it is possible to match tents to trees so that each tree is
-orthogonally adjacent to its own tent (but may also be adjacent to
-other tents).
-</ul>
-<p>
-Click in a square to place or remove a tent. Right-click to mark a
-square as empty (not a tent). Right-click and drag along a row or
-column to mark many squares at once as empty.
-<p>
-Warning '!' marks appear to indicate adjacent tents. Numbers round
-the edge of the grid light up red to indicate they do not match the
-number of tents in the row. Groups of tents light up red to indicate
-that they have too few trees between them, and vice versa.
diff --git a/html/towers.html b/html/towers.html
deleted file mode 100644 (file)
index a710e0a..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-Towers
-<p>
-Fill in the grid with towers whose heights range from 1 to the grid
-size, so that every possible height appears exactly once in each row
-and column, and so that each clue around the edge counts the number
-of towers that are visible when looking into the grid from that
-direction. (Taller towers hide shorter ones behind them. So the
-sequence 2,1,4,3,5 would match a clue of 3 on the left, because the
-1 is hidden behind the 2 and the 3 is hidden behind the 4. On the
-right, it would match a clue of 1 because the 5 hides everything
-else.)
-<p>
-To place a tower, click in a square to select it, then type the
-desired height on the keyboard. To erase a tower, click to select a
-square and then press Backspace.
-<p>
-Right-click in a square and then type a number to add or remove the
-number as a pencil mark, indicating tower heights that you think
-<em>might</em> go in that square.
-<p>
-Left-click on a clue to mark it as done (grey it out). To unmark a
-clue as done, left-click on it again.
\ No newline at end of file
diff --git a/html/tracks.html b/html/tracks.html
deleted file mode 100644 (file)
index afabed3..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-Tracks
-<p>
-Complete the track from A to B so that the rows and
-columns contain the same number of track segments as are indicated in the
-clues to the top and right of the grid. There are only straight and
-90-degree curved rail sections, and the track may not cross itself.
-<p>
-Left-click on an edge between two squares to add a track segment between
-the two squares. Right-click on an edge to add a cross on the edge,
-indicating no track is possible there.
-<p>
-Left-click in a square to add a colour indicator showing that you know the
-square must contain a track, even if you don't know which edges it crosses
-yet. Right-click in a square to add a cross indicating it contains no
-track segment.
-<p>
-Left- or right-drag between squares to lay a straight line of is-track or
-is-not-track indicators, useful for filling in rows or columns to match the
-clue.
diff --git a/html/twiddle.html b/html/twiddle.html
deleted file mode 100644 (file)
index 5f94e4e..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-Twiddle
-<p>
-Rotate square sections of the grid to arrange the squares into
-numerical order starting from the top left.
-<p>
-In the basic game, you rotate a 2&times;2 square section. Left-click
-in the centre of that section (i.e. on a corner point between four
-squares) to rotate the whole section anticlockwise. Right-click to
-rotate the section clockwise.
-<p>
-When you master the basic game, go to the Type menu to try it with
-larger rotating groups (for a 3&times;3 group you must click in the
-centre of a square to rotate the block around it). Or select the
-'orientable' mode in which every square must end up the right way
-round as well as in the right place. Or both!
diff --git a/html/undead.html b/html/undead.html
deleted file mode 100644 (file)
index c21374f..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-Undead
-<p>
-Fill in every grid square which doesn't contain a mirror with either a
-ghost, a vampire, or a zombie. The numbers round the grid edges show
-how many monsters must be visible along your line of sight if you look
-directly into the grid from that position, along a row or column.
-Zombies are always visible; ghosts are only visible when reflected in
-at least one mirror; vampires are only visible when not reflected in
-any mirror.
-
-<p>
-To place a monster, click in a square to select it, then type the
-monster's letter on the keyboard: G for a ghost, V for a vampire or Z
-for a zombie. To erase a monster, click to select a square and then
-press Backspace.
-<p>
-Right-click in a square and then type a letter to add or remove the
-monster as a pencil mark, indicating monsters that you think
-<em>might</em> go in that square.
-<p>
-Left-click on a clue to mark it as done (grey it out). To unmark a
-clue as done, left-click on it again.
diff --git a/html/unequal.html b/html/unequal.html
deleted file mode 100644 (file)
index 085f82e..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-Unequal
-<p>
-Fill in the grid with numbers from 1 to the grid size, so that every
-number appears exactly once in each row and column, and so that all
-the <code>&lt;</code> signs represent true inequalities (i.e. the
-number at the pointed end is smaller than the number at the open end).
-<p>
-To place a number, click in a square to select it, then type the
-number on the keyboard. To erase a number, click to select a square
-and then press Backspace.
-<p>
-Right-click in a square and then type a number to add or remove the
-number as a pencil mark, indicating numbers that you think
-<em>might</em> go in that square.
diff --git a/html/unruly.html b/html/unruly.html
deleted file mode 100644 (file)
index 2cd3fb2..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Unruly
-<p>
-Colour every square either black or white, in such a way that:
-<ul><li>no three consecutive squares, horizontally or vertically, are
-the same colour
-<li>each row and column contains the same number of black and white
-squares.</ul>
-<p>
-Left-click in an empty square to turn it black, or right-click to turn
-it white. Click again in an already-filled square to cycle it between
-black and white and empty; middle-click to reset any square to empty.
diff --git a/html/untangle.html b/html/untangle.html
deleted file mode 100644 (file)
index 7171a3d..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-Untangle
-<p>
-Move the points around so that none of the lines cross.
-<p>
-Click on a point and drag it to move it.
diff --git a/icons/blackbox-16d24.png b/icons/blackbox-16d24.png
new file mode 100644 (file)
index 0000000..45a0d2d
Binary files /dev/null and b/icons/blackbox-16d24.png differ
diff --git a/icons/blackbox-16d4.png b/icons/blackbox-16d4.png
new file mode 100644 (file)
index 0000000..d378aad
Binary files /dev/null and b/icons/blackbox-16d4.png differ
diff --git a/icons/blackbox-16d8.png b/icons/blackbox-16d8.png
new file mode 100644 (file)
index 0000000..45a0d2d
Binary files /dev/null and b/icons/blackbox-16d8.png differ
diff --git a/icons/blackbox-32d24.png b/icons/blackbox-32d24.png
new file mode 100644 (file)
index 0000000..00c38e9
Binary files /dev/null and b/icons/blackbox-32d24.png differ
diff --git a/icons/blackbox-32d4.png b/icons/blackbox-32d4.png
new file mode 100644 (file)
index 0000000..47f42ab
Binary files /dev/null and b/icons/blackbox-32d4.png differ
diff --git a/icons/blackbox-32d8.png b/icons/blackbox-32d8.png
new file mode 100644 (file)
index 0000000..00c38e9
Binary files /dev/null and b/icons/blackbox-32d8.png differ
diff --git a/icons/blackbox-48d24.png b/icons/blackbox-48d24.png
new file mode 100644 (file)
index 0000000..976e278
Binary files /dev/null and b/icons/blackbox-48d24.png differ
diff --git a/icons/blackbox-48d4.png b/icons/blackbox-48d4.png
new file mode 100644 (file)
index 0000000..ba442ee
Binary files /dev/null and b/icons/blackbox-48d4.png differ
diff --git a/icons/blackbox-48d8.png b/icons/blackbox-48d8.png
new file mode 100644 (file)
index 0000000..976e278
Binary files /dev/null and b/icons/blackbox-48d8.png differ
diff --git a/icons/blackbox-base.png b/icons/blackbox-base.png
new file mode 100644 (file)
index 0000000..e13f6d0
Binary files /dev/null and b/icons/blackbox-base.png differ
diff --git a/icons/blackbox-ibase.png b/icons/blackbox-ibase.png
new file mode 100644 (file)
index 0000000..268f0bb
Binary files /dev/null and b/icons/blackbox-ibase.png differ
diff --git a/icons/blackbox-ibase4.png b/icons/blackbox-ibase4.png
new file mode 100644 (file)
index 0000000..0b0e142
Binary files /dev/null and b/icons/blackbox-ibase4.png differ
diff --git a/icons/blackbox-icon.c b/icons/blackbox-icon.c
new file mode 100644 (file)
index 0000000..d09227e
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qX0XqX0X9X7X7X8X8X7X7X8X7X7X8XqX",
+"eXqX4XtX'.4.9.i.a.7.0.h.q.7.s.8X",
+"qXsX@.T. X..$.2.6.$.&.w.=.#.7.7X",
+"wXtXW.&X'.*.3.8.9.-.:.t.,.=.q.7X",
+"eX7XsXdX].,.| p.j.w.r.z.t.w.h.8X",
+"wXtXI..X!.#   k q.*.;.r.:.&.0.7X",
+"wXiX0.G.U.    6 5.%.*.w.-.$.7.7X",
+"eX9X0XyX'.A 0 ..g.5.9.g.0.5.a.8X",
+"eX0X6XrX_.6.9.p.u.4.6.d.7.3.i.8X",
+"eXeX0XpX(.@.=.4.8.*.-.r.:.&.9.7X",
+"eXwX9XiX~...#.<.3.+.$.0.%.o.4.7X",
+"wX6X3X6X*X^.(._._./.(.`.).'.`.9X",
+"qXqXqXqXyXiXiXrXeXpXuXrX7X[.aX9X",
+"qXqXqXqXeX0XqX8X7XqX0X9X:Xg.eX9X",
+"qXqXqXqXqX6X7X4X4X7X6X3X5X4X5X0X",
+"qXqXqXqX0X7X7X7X7X7X7X7X7X8X7XqX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXqXqXwXwXwXwXwXwXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqX0X8X8X8X8X9X8X0XqXqXqXqXqX0X0XqXqXqXqXqX0X0XqXqXqXqXqX0XqXqX",
+"0XtXqX7X8X9X7X7X0XB.8.r.e.e.0.k.m.9.r.e.r.0.l.n.9.r.e.r.0.k.0XqX",
+"0XtXeXqXwX5XyXqXtXh.O.*.&.*.@.0.s.+.*.&.*.@.w.p.+.*.&.*.@.0.qXqX",
+"0XtX0XsXD.H d.pXwXl.%.>.:.>.*.r.g.&.>.:.>.*.t.d.&.>.:.>.*.r.qXqX",
+"0XtX0XgXc.i 2.dXqXk.$.:.;.:.&.e.f.%.:.;.:.&.t.d.%.:.;.:.&.e.qXqX",
+"0XtXqXsXH.y.p.9XrXl.%.>.:.>.*.r.g.&.>.:.>.*.y.d.&.>.:.>.*.r.qXqX",
+"0XrXrXqXtXsXyXqXyXg.X.%.#.$.O.9.a.o.&.%.&.O.q.i.O.&.%.&.+.9.qXqX",
+"0XtX9X3X4X3X3X4X6XS.i.z.z.x.d.v.C.i.d.d.d.p.m.V.i.d.d.d.p.n.0XqX",
+"0XtX0X5X7X6X6X6X8XC.w.] V L ,.v.m.q.y.t.t.q.z.m.q.y.t.t.w.l.0XqX",
+"0XtXrXwXqXrXwXqXtXl.w   .     $.h.o.*.&.&.+.q.p.O.*.&.*.@.0.qXqX",
+"0XtX0XfXb.j.1.$XfX1.  O o O   b z.%.>.:.:.&.t.d.&.>.:.>.*.e.qXqX",
+"0XtX0XhXf.F D %XjX .  o   .   t d.%.:.;.:.&.t.d.%.:.;.:.&.e.qXqX",
+"0XtXqXsXD.U.j.&XfX<.  O o +   v z.%.>.:.>.*.y.d.&.>.:.>.*.r.qXqX",
+"0XrXrXqXuXtXiXeXtXk.9   .     @.g.X.&.%.&.O.q.i.o.&.%.&.+.9.qXqX",
+"0XtX9X3X3X3X3X3X6XF.a. .D T 5.V.C.a.g.f.g.a.M.C.a.g.f.g.s.m.0XqX",
+"0XtX0X6X7X7X6X6X9XN.9.s.a.s.e.h.m.9.r.e.r.0.l.b.9.r.e.r.0.k.0XqX",
+"0XtXrXqXwXwXwXqXtXh.O.&.%.%.+.0.s.+.*.&.*.@.w.p.+.*.&.*.@.0.qXqX",
+"0XtXeX0XqXqXqX0XrXl.%.>.:.:.*.r.g.&.>.:.:.&.t.d.&.>.:.>.*.e.qXqX",
+"0XtXeX0XqXqXqX0XrXk.$.:.;.:.&.e.f.%.:.;.:.&.t.d.%.:.;.:.&.e.qXqX",
+"0XtXeX0XqXqX0X0XrXl.&.,.:.>.*.r.g.&.>.:.>.*.y.f.&.>.:.>.*.r.qXqX",
+"0XrXrXwXeXeXeXwXyXg.X.&.$.%.O.8.p.o.%.$.%.O.0.i.o.%.$.%.O.8.qXqX",
+"0XtX6X,X1X1X1X<X3XH.g.l.k.l.h.B.D.g.l.k.l.h.V.S.g.l.k.l.h.B.0XqX",
+"qXwX7X4X5X4X5X4X8XeXrXrXrXrXtX9X6XyXrXrXrXtX9X6XtXtXiXrXtX0X8XwX",
+"qXqXwXeXeXeXeXwXyXwX0X0X0X0XqX6X4XwX0X0X0XqX6X4XwX7X;X9XqX7X9XwX",
+"qXqXqXqXqXqXqX0XtXeX0XqXqXqXwX6X4XwXqXqXqXwX6X3XrX1XE |.pX6X9XwX",
+"qXqXqXqXqXqXqX0XtXeX0XqXqXqXwX7X4XwXqXqXqXwX6X4X0XfX$.R.dX6X9XwX",
+"qXqXqXqXqXqXqX0XtXwX0XqXqX0XwX6X4XwX0XqX0XwX6X3XtX<X| b.pX6X9XwX",
+"qXqXqXqXqXqXqX0XtXrXwXeXeXeXrX8X5XrXeXeXeXrX8X6XrXeXdXuXeX9X9XwX",
+"qXqXqXqXqXqXqX0XtX5X,X<X<X<X1X:X;X1X<X<X<X1X:X;X1X<X>X,X<X>X9XwX",
+"qXqXqXqXqXqXqXqXwX7X5X5X5X5X5X5X6X5X5X5X5X5X6X6X5X5X5X5X5X6XqXqX",
+"qXqXqXqXqXqXqXqXqXwXeXwXeXwXeXwXwXeXwXeXwXeXwXwXeXwXeXwXeXwXqXqX"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0X0X0X0X0X0X0X0XqXqX0X0X0X0X0X0X0X0XqXqX0X0X0X0X0X0X0X0XqXqXqXqXqX",
+"qXqXqXqXwXwXwXwXwXwXwXwXwXwXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXqXqXqXqX",
+"qXqXqXeX8X5X6X6X6X6X6X6X6X6X3X2X2X2X2X2X2X2X2X3X3X2X2X2X2X2X2X2X2X3X3X2X2X2X2X2X2X2X2X4XqXqXqXqX",
+"qXqX0XpX9X7X8X7X6X6X8X8X8X7Xl.>.4.3.3.3.3.4.:.v.v.:.4.3.3.3.3.4.:.b.x.:.4.3.3.3.3.4.:.b.tX0XqXqX",
+"qXqX0XiXwXqXqXtXdXaXqXwXwXqXd.#.-.=.=.=.=.-.@.k.k.@.-.=.=.=.=.-.+.l.h.@.-.=.=.=.=.;.@.l.yX0XqXqX",
+"qXqX0XiXqX0XeX,XR.'.tX0XqX0Xg.%.>.;.;.;.;.>.$.l.l.$.>.;.;.;.;.>.$.x.j.$.>.;.;.;.;.>.$.z.yX0XqXqX",
+"qXqX0XiXqX7XjXe.j n f.gX8X0Xf.%.:.;.;.;.;.:.$.l.l.$.:.;.;.;.;.:.#.z.j.$.:.;.;.;.;.:.$.z.yX0XqXqX",
+"qXqX0XiXqX8XjXw.G U n.fX9X0Xf.%.:.;.;.;.;.:.$.l.l.$.:.;.;.;.;.:.#.z.j.$.:.;.;.;.;.:.$.z.yX0XqXqX",
+"qXqX0XiXqX7XjXq.l n s.fX9X0Xf.%.:.;.;.;.;.:.$.l.l.$.:.;.;.;.;.:.#.z.j.$.:.;.;.;.;.:.$.z.yX0XqXqX",
+"qXqX0XiXqX9XsXS.Z.oX>.uX0X0Xf.%.:.;.;.;.;.:.$.l.l.$.:.;.;.;.;.:.#.z.j.$.:.;.;.;.;.:.$.z.yX0XqXqX",
+"qXqX0XiXqX0X9XiXiXtXfX9XqX0Xg.&.>.:.:.:.:.>.%.l.l.%.>.:.:.:.:.>.%.x.k.%.>.:.:.:.:.,.%.x.yX0XqXqX",
+"qXqX0XiXwXwXeXqX0XqX0XwXwXwXa.o.&.#.#.#.#.&.X.h.h.X.&.%.%.%.%.&.X.j.f.X.&.%.%.%.%.&.X.j.uX0XqXqX",
+"qXqX9XpX4X>X,X,X,X,X,X,X,X>XT.C.S.K.L.L.L.F.V.R.R.C.S.S.S.S.S.S.C.E.T.C.S.S.S.S.S.D.C.W.eXqXqXqX",
+"qXqX0XpX9X7X8X7X6X8X6X7X8X7Xc.6.q._ M v U 2.8.n.M.3.0.9.9.9.9.0.3.N.n.4.0.9.9.9.9.0.3.N.tX0XqXqX",
+"qXqX0XiXwXwXqXyXuXwXpXwXwX0Xf...9   .     $ Y c.h.O.=.*.*.*.*.=.O.l.g.O.=.*.*.*.*.=.O.k.yX0XqXqX",
+"qXqX0XiXqX0XrX*X+X7X[.0XqX9Xl.t   o X X X   + p.x.#.>.;.;.;.;.>.$.x.j.$.>.;.;.;.;.>.$.z.yX0XqXqX",
+"qXqX0XiXqX7XlX6.{ 5Xu 7XwXeX6.  X         o   } m.@.:.;.;.;.;.:.#.z.j.$.:.;.;.;.;.:.$.z.yX0XqXqX",
+"qXqX0XiXqX8XhXp.0 U i 9X0XuX+.  o         o   J n.@.:.;.;.;.;.:.#.z.j.$.:.;.;.;.;.:.$.z.yX0XqXqX",
+"qXqX0XiXqX7XkX7.Y (.e 6XqXyX%.  X         o   U n.@.:.;.;.;.;.:.#.z.j.$.:.;.;.;.;.:.$.z.yX0XqXqX",
+"qXqX0XiXqX9XsXJ.n.qX2.9XqXwXr.o   .       o   %.n.@.:.;.;.;.;.:.#.z.j.$.:.;.;.;.;.:.$.z.yX0XqXqX",
+"qXqX0XiXqX0X9XiXaXqXgXqXqX9Xx.m   . X o X   3 l.z.$.>.:.:.:.:.>.$.x.k.%.>.:.:.:.:.>.%.x.yX0XqXqX",
+"qXqX0XiXwXwXwXqX0XwX9XwXwXqXa.#.m X   .   w [ k.g.o.*.%.%.%.%.*.X.k.f.o.*.%.%.%.%.*.o.j.yX0XqXqX",
+"qXqX9XpX4X:X,X,X,X,X,X,X,X>XT.Z.L.n.9.5.g.J.S.R.E.Z.D.D.D.D.D.D.Z.E.R.Z.D.D.D.D.D.D.Z.Q.eXqXqXqX",
+"qXqX0XpX9X7X8X8X8X8X8X8X8X7Xc.3.7.0.r.r.q.7.1.m.m.2.8.7.7.7.7.8.2.M.b.2.8.7.7.7.7.8.2.M.tX0XqXqX",
+"qXqX0XiXwXqXwXwXwXwXwXqXwXqXd.@.-.*.&.&.&.=.+.j.j.+.=.*.*.*.*.=.O.l.g.+.=.*.*.*.*.-.+.k.yX0XqXqX",
+"qXqX0XiXqX0XqXqXqXqXqXqXqX0Xg.%.>.;.;.;.;.>.$.l.l.$.>.;.;.;.;.>.$.x.j.$.:.;.;.;.;.>.$.z.yX0XqXqX",
+"qXqX0XiXqXqXqXqXqXqXqXqXqX0Xf.%.:.;.;.;.;.:.$.l.l.$.:.;.;.;.;.:.#.z.j.$.:.;.;.;.;.:.$.z.yX0XqXqX",
+"qXqX0XiXqXqXqXqXqXqXqXqXqX0Xf.%.:.;.;.;.;.:.$.l.l.$.:.;.;.;.;.:.#.z.j.$.:.;.;.;.;.:.$.z.yX0XqXqX",
+"qXqX0XiXqXqXqXqXqXqXqXqXqX0Xf.%.:.;.;.;.;.:.$.l.l.$.:.;.;.;.;.:.#.z.j.$.:.;.;.;.;.:.$.z.yX0XqXqX",
+"qXqX0XiXqXqXqXqXqXqXqXqXqX0Xf.%.:.;.;.;.;.:.$.l.l.$.:.;.;.;.;.:.#.z.j.$.:.;.;.;.;.:.$.z.yX0XqXqX",
+"qXqX0XiXqX0XqXqXqXqXqX0XqX0Xg.&.,.:.:.:.:.,.%.z.z.%.>.:.:.:.:.,.%.x.k.%.>.:.:.:.:.,.%.x.yX0XqXqX",
+"qXqX0XiXeXeXeXeXeXeXeXeXeXwXp.X.%.$.$.$.$.%...g.g...%.$.$.$.$.%...j.d...%.$.$.$.$.%...h.uX0XqXqX",
+"qXqX0XpX>X&X*X*X*X*X*X*X*X=X^.P.U.U.U.U.U.U.P././.P.U.U.U.U.U.U.P./.^.P.U.U.U.U.U.Y.P.).wXqXqXqX",
+"qXqXqXqX7X6X6X6X6X6X6X6X5XrXrXyXyXyXyXyXyXtXiX6X6XiXtXyXyXyXyXtXiX5X6XiXtXyXrXrXyXtXuX8X8XwXqXqX",
+"qXqXqXqXwXwXwXwXwXwXwXeXqXaX0X0X0X0X0X0X0X0XwX2X2XwX0X0X0X0X0X0XwX2X3XwX0XqXsXiX9X0XqX5X9XwXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqX0XiXqXqXqXqXqXqXqXqXeX3X3XeXqXqXqXqXqXqXeX2X3XwXqX9XU.`.eX0XwX5X9XwXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqX0XpXqXqXqXqXqXqXqXqXeX3X3XeXqXqXqXqXqXqXeX2X3XwXwX7XY D aX9XwX5X9XwXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqX0XpXqXqXqXqXqXqXqXqXeX3X3XeXqXqXqXqXqXqXeX2X3XeX8XjX(.Y kX8XwX5X9XwXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqX0XpXqXqXqXqXqXqXqXqXeX3X3XeXqXqXqXqXqXqXeX2X3XwX0XyX0.g &XeXqX5X9XwXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqX0XpXqXqXqXqXqXqXqXqXeX3X3XeXqXqXqXqXqXqXeX2X3XwXeX2X1. .F.pX0X5X9XwXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqX0XpXqX0XqXqXqXqXqX0XwX3X3XwX0XqXqXqXqX0XwX2X3XwX0XwXhXlXpX9XwX5X9XwXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqX0XpXwXeXeXeXeXeXeXwXtX4X4XtXwXeXeXeXeXwXtX4X5XrXeXeX0X9XqXeXrX6X9XwXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqX0XiX:X%X*X*X*X*X*X*X*X$X$X*X*X*X*X*X*X*X*X$X$X*X*X*X*X*X*X*X*X*X0XqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8XqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/blackbox-web.png b/icons/blackbox-web.png
new file mode 100644 (file)
index 0000000..3e2446d
Binary files /dev/null and b/icons/blackbox-web.png differ
diff --git a/icons/blackbox.ico b/icons/blackbox.ico
new file mode 100644 (file)
index 0000000..6a2cb1c
Binary files /dev/null and b/icons/blackbox.ico differ
diff --git a/icons/blackbox.rc b/icons/blackbox.rc
new file mode 100644 (file)
index 0000000..d698666
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "blackbox.ico"
diff --git a/icons/bridges-16d24.png b/icons/bridges-16d24.png
new file mode 100644 (file)
index 0000000..49c140a
Binary files /dev/null and b/icons/bridges-16d24.png differ
diff --git a/icons/bridges-16d4.png b/icons/bridges-16d4.png
new file mode 100644 (file)
index 0000000..ee265c9
Binary files /dev/null and b/icons/bridges-16d4.png differ
diff --git a/icons/bridges-16d8.png b/icons/bridges-16d8.png
new file mode 100644 (file)
index 0000000..49c140a
Binary files /dev/null and b/icons/bridges-16d8.png differ
diff --git a/icons/bridges-32d24.png b/icons/bridges-32d24.png
new file mode 100644 (file)
index 0000000..8608719
Binary files /dev/null and b/icons/bridges-32d24.png differ
diff --git a/icons/bridges-32d4.png b/icons/bridges-32d4.png
new file mode 100644 (file)
index 0000000..aad675c
Binary files /dev/null and b/icons/bridges-32d4.png differ
diff --git a/icons/bridges-32d8.png b/icons/bridges-32d8.png
new file mode 100644 (file)
index 0000000..8608719
Binary files /dev/null and b/icons/bridges-32d8.png differ
diff --git a/icons/bridges-48d24.png b/icons/bridges-48d24.png
new file mode 100644 (file)
index 0000000..973c21f
Binary files /dev/null and b/icons/bridges-48d24.png differ
diff --git a/icons/bridges-48d4.png b/icons/bridges-48d4.png
new file mode 100644 (file)
index 0000000..355cd0c
Binary files /dev/null and b/icons/bridges-48d4.png differ
diff --git a/icons/bridges-48d8.png b/icons/bridges-48d8.png
new file mode 100644 (file)
index 0000000..973c21f
Binary files /dev/null and b/icons/bridges-48d8.png differ
diff --git a/icons/bridges-base.png b/icons/bridges-base.png
new file mode 100644 (file)
index 0000000..577a87f
Binary files /dev/null and b/icons/bridges-base.png differ
diff --git a/icons/bridges-ibase.png b/icons/bridges-ibase.png
new file mode 100644 (file)
index 0000000..fa919d1
Binary files /dev/null and b/icons/bridges-ibase.png differ
diff --git a/icons/bridges-ibase4.png b/icons/bridges-ibase4.png
new file mode 100644 (file)
index 0000000..42382d4
Binary files /dev/null and b/icons/bridges-ibase4.png differ
diff --git a/icons/bridges-icon.c b/icons/bridges-icon.c
new file mode 100644 (file)
index 0000000..d0ddbed
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXqXqXqXqXqXqXwX3X+X8X<X9X5X3XtX",
+"qXqXqXqXqX0X0XwX4Xy.;Xd.2X@Xg.wX",
+"qXqXqXqX9XtXuX8XyXL.~.|._.E.Q.'.",
+"qXqXqX0XaX=X#XiXtXS.*Xj.OX=Xf.1X",
+"wXeX9XaXD.5.r.z.fXm.gX~.u.t. XiX",
+"&X|.sX%Xp.!.W.l.[.G.9XxX^.OXjX8X",
+"#X).dXXXg.'.N.N.XXJ.dXaX~.|.iX0X",
+"qXiXyXjXN.a.l.f.K.1.F.jX!.|.aX9X",
+"0X-X*X*X<XP.T.Z.J.#XB.E.].{.aX0X",
+"3X8.>.<.,.8.8.) CX7.=XS.'. XpX9X",
+"0X*X%X&X&X#X,XM.A.1XA.R.Z.D.gX0X",
+"wXjXkXkXkXkXkXkXU.M.R.j.C.B.b.pX",
+"&X7.f.s.s.s.s.d.v.m.<.(.$XT.P.|.",
+"-Xh.V.N.N.N.N.N.n.A.7.L.>XoXV.+X",
+"wXdXfXfXfXfXfXfXfXdXlXb.N.m.F.aX",
+"qX8X8X8X8X8X8X8X8X8X8XpX.X@XaX0X"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXuXuXuXuXqX9XtXiXqXwXpXwX9XqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXwX#X@X@X$X0XpX>XXX9X3X|.9XyX0XqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX9XXXE E  XsXG.g %XUXKXv.l >XtX0X",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX5XPXp.i.IX2Xk >XkX3.Y.UXy.( jX8X",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXwX4XDXi.t.UXm.^ UXjX;Xl bXNXn <XrX",
+"qXqXqXqXqXqXqXqXqXqXqX0X0XqXqXwX4XGXp.y.UXy.#.UXUXw.n.UXHXB @XuX",
+"qXqXqXqXqXqXqXqXqX9X9XtXyX0X8XwX4XGXp.u.UXW.N UX Xq 4.GX4Xn rXqX",
+"qXqXqXqXqXqXqXqX9XiXhX:X%XpXfX9X4XGXp.p.DXiXT ,.UXPXUXAXM a.jX8X",
+"qXqX0XqXqXqXqX9XaXoXL l x m Z.gX2XGXp.p.FX7X8XK Z l.e.d ,.dX9XqX",
+"qXwXrXqXqXqX9XiXXXw e.qXtXK.e z.iXSXp.p.GX3XtXuX}.b ..-XfX0XqXqX",
+"tX-X].uX0XqX9XhXI t.ZX#.:.VX|.d -XKXi.p.GX5XqX3XUX$.T.AX4XqXqXqX",
+"iX.X8.fX9X0XtX:Xv 1XaXm.Y uXhXT c.UXy.p.GX4XwX4XJX+.L.mX6XqXqXqX",
+"pX.X>.fX8X0XyX%Xv 6XsXK.G 0XkX^ d.UXt.i.FX4XwX4XPX@.I.NX6XqXqXqX",
+"uX#XJ.pX9XqX0XiXN P.cX#.N !.iXg `.IXp.s.FX2XwX4XPX@.I.NX6XqXqXqX",
+"qX0XqXwXqXqX9XgXA.r |.bXNXqXF X.bXNX-.;.CXpX0X4XPX@.I.NX6XqXqXqX",
+"qXqX7X6X6X6X6X4XiXf.r H Y u [ lXv.j Y P j v.gX1XPX@.I.NX6XqXqXqX",
+"qXeXmXBXNXNXNXNXmXLXlX/.T.8XUXN.a 8XIXUX0Xs b.uXJX@.I.NX6XqXqXqX",
+"wX8XI.J.K.K.K.K.K.G.I./.(.Y.U.z 5XZX9._ ZX5Xz 3XIX@.I.NX6XqXqXqX",
+"eX5Xe.5.7.7.7.7.7.7.6.5.3.e._ H UXUX}.z pXUXK I.UX+.I.NX6XqXqXqX",
+"eX5Xe.5.7.7.7.7.7.7.7.7.6.r._ G UXbXQ.g *XUXJ I.UXo.P.MX6XqXqXqX",
+"wX8XI.J.K.K.K.K.K.K.K.K.K.J.R.z 6XbXt.M.UX1Xz 1XUX$.Y.VX4XqXqXqX",
+"qXeXMXBXBXBXBXBXBXBXBXBXBXmXLXB.a wXUXUX0Xa n.nX8XG 5.aXsX9XqXqX",
+"qXqX2X,X,X,X,X,X,X,X,X,X,X,X:XyXj.i C C i k.zX{ z <.| p k.gX9XqX",
+"wX9XnXKXGXGXGXGXGXGXGXGXGXGXHXDXUXSX2X2XAXUX../ HXBXUXaXd C.fX8X",
+"tX-X5.p.y.u.u.u.u.u.u.u.u.u.u.u.r.u.k.k.a.5.n JXiX-.Y UX@XN iX0X",
+"uX@XT N.z.x.x.x.x.x.x.x.x.x.x.x.x.x.z.k.A.( @.UXUXG.A DXKXN $XuX",
+"yX%XN @.X.o.o.o.o.o.o.o.o.o.o.o.o.o.o.X.=.n ' UXwXc.g hXDXn ;XtX",
+"tX>X/.*X@X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X$X+Xk uXkXv.@XUXN.P hX8X",
+"qXwXhXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXgXVXl.p ,XUXKXC.r oXiX9X",
+"qXqX8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X6XfXC.v b c J XXaX9XqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX9XfXpX$X;XhXiX9XqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX8X0XuXtX8X9XqXqXqX"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0X8X8X8X8X9XqXqXqX8X8X0XqXqX0X8X9XqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XuXkXjXhXkXpXqXqX0XgXlXuX9X9XpXlXdX9XqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XrX}.k.c.n.g.~.wXqXyXF.f.].iXyX/.s.I.pX0XqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXeX$X!.M 5 L.XX9XfX-.  h.NXUXIXhX8.  y.gX8XqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XUX2.M UXeXsXI.  ).UXfX/.3XIXUXZ.  {.pX9XqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXwX4XUX,.b UX6XgXS E UXLX&.! 1 z.UXUXb _ kX8XqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX4XUX1.n UXqX6X- R.UXJXAXUXP } UXUXl.8 uXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX4XUX1.n UXwX1XX @XUXKXUXn.N bXUXUXU.= rXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX4XUX1.n UXqX8X1 S.UXUXq.  n.8XLXUXt.y pX0XqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0X8X8X8X8X9XqXqXqXqX4XUX1.n UX6XjXQ N UXUX<.( R y.UXLXy %.kX8XqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqX8XtXjXlXlXkXdX0X0XqXqX4XUX1.n UX7XiX{.. c.UXPXUXUXPXUX5.& =XyX0XqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqX9XfX:X0.S b ) L.aXtX9XwX4XUX1.n UX9X8XfXk.  o.0XJXGX3X~   G.dX8XqXqXqX",
+"qXqXqX0XqXqXqXqXqXqXqXqX9XdXx.# 1 U / b   Z <XyX0X4XUX1.n UX9XqX9XfXP.e + r w o f (.dX8XqXqXqXqX",
+"qXqX0XrXwXqXqXqXqXqXqX8XfXx.  :.rXSXDXgX'.e f 8XeX3XUX1.n UX9XqXqX9XsXyX0Xf D tXuXaX8XqXqXqXqXqX",
+"qX0XyX@X,XrXqXqXqXqX0XtX;X= ,.mX;Xw.u.<XhX1X, &.jX1XUX1.n UX9XqXqXqX8X7XUXK +.UX4X9XqXqXqXqXqXqX",
+"qX8XhXb.B.gX9XqXqXqX8XjX0.2 9XiX'.C > +XqXkXt.< 6X6XUX1.n UX9XqXqXqXqX7XUXH X.UX5XqXqXqXqXqXqXqX",
+"qX8XlXf.$.xX7XqXqXqX8XlXA R kX5XdX{.4 OXrXtXXXO /.rXUX1.n UX9XqXqXqXqX7XUXJ O.UX5XqXqXqXqXqXqXqX",
+"qX8XlXd. .cX7XqXqXqX8XlXb _ xX5XgX|.5 4XiXeX-Xo E.tXUX1.n UX9XqXqXqXqX7XUXJ O.UX5XqXqXqXqXqXqXqX",
+"qX8XkXk.0.kX8XqXqXqX8XkX` n sXqX-XX.% <.,XfXI.% OXqXUX1.n UX9XqXqXqXqX7XUXJ O.UX5XqXqXqXqXqXqXqX",
+"qX9XsXI.`.pX0XqXqXqX9XdXP.. `.zX`.] &.{ $XnXI c dX<XUX1.n UX6X0XqXqXqX7XUXJ O.UX5XqXqXqXqXqXqXqX",
+"qXqXqX9X0XqXqXqXqXqXqX0XpXF t <XbXMXvXCXbXu.  I.pXrXUX2.N UXdX0X0XqXqX7XUXJ O.UX5XqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqX0XtX<Xd - w.}.%XK.L   y.gXaXK.` , @ Y v.uXtX9XqX7XUXJ O.UX5XqXqXqXqXqXqXqX",
+"qXqXqXqX0X0X0X0X0X0X0XqX9XtX9X#., O X # k I.fXwX(   H x.B.` X c <XyX9X7XUXJ O.UX5XqXqXqXqXqXqXqX",
+"qXqXqXqX0X0X0X0X0X0X0X0X0X8XqXhX5X~.T.XXsXiXsX` - -XUXPXIXUXdXg k wXwX7XUXJ O.UX5XqXqXqXqXqXqXqX",
+"qXwX8XgXUXIXUXUXUXUXUXUXUXUXUXUXUXUXUXUXLXUXOX  %XUX@X{ >.qXUXlX, 6.jX4XUXJ O.UX5XqXqXqXqXqXqXqX",
+"qX9XdXP.r l h h h h h h h h h h g f f g g b , ^ UXUXXX`.A H UXUXw.t yX7XUXJ O.UX5XqXqXqXqXqXqXqX",
+"qX0XyXOXi.g.f.f.f.f.f.f.f.f.f.f.f.f.f.f.f.x.+ n.UXKXIXV.y c.UXUX&XO -XwXUXJ O.UX5XqXqXqXqXqXqXqX",
+"qXqXwX7X:X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X7X1 M.UXKXPX,X! A UXUX:XX =XwXUXJ O.UX5XqXqXqXqXqXqXqX",
+"qX8XgXV.  # O O O O O O O O O O O O O O o $   $.UXUXp.r.M P UXUXc.7 0X8XUXJ o.UX5XqXqXqXqXqXqXqX",
+"qXwX9XfXUXLXLXLXLXLXLXLXLXLXLXLXLXLXLXLXHXUXT.# iXUX-Xl.Y.BXUXHXi O.jX1XUXJ O.UX2XqXqXqXqXqXqXqX",
+"qXqX0XrXdXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXhXN h cXUXIXIXUXKX) 4 :XyXdXUXH X.UXaXwX9XqXqXqXqXqX",
+"qXqXqX0X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X7XrX<Xf = q.@X-Xv.e > _.jX6X<.d o + k q.rXyX9XqXqXqXqX",
+"qXqXqX0X9X0X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X0X7XrXqX4.0 X . 2 | ;XhXoX0 < w.XX}.1.& g ,XtX0XqXqXqX",
+"qXqX0XtXaXuXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXiXyXiXnXfX2X1XuXnXgXqXy F CXUXIXIXUXzXh n tXqXqXqXqX",
+"qX0XiX`.fXUXIXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXLXUXd.4 NXUXB.Z _ 4XUXaX* h.hX8XqXqX",
+"qX8XgXV.o ; * * * * * * * * * * * * * * * * * * * * * & & * & <   d.UXLX=X0Xg %.UXUX+.m dX9XqXqX",
+"qX8XlXg.! <X{. X X X X X X X X X X X X X X X X X X X X X X XoX_.. oXUXUXVX+.3 |.UXUXJ.: tXqXqXqX",
+"qX8XkXk.A T.B.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.C.S.n.  .XUXLXAXdXG R UXUXF., tXqXqXqX",
+"qX8XgXV.2 y e e e e e e e e e e e e e e e e e e e e e e e e w s O q.UXHX+.| r s.UXUX] Z gX9XqXqX",
+"qX0XuX XzXUXIXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXKXUXm.= kXUXqX_.7XIXUX8X+ M.gX8XqXqX",
+"qXqX0XtXtXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXeXyXx g gXUXIXPXUXqX7 L pX0XqXqXqX",
+"qXqXqX0X9X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8XtX,Xx O o.G.S.'   G 8XrX0XqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXwX9XtXyXh.v : > V M.aXeX9XqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXhXfXtXtXgXgX0X0XqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX8X9XqXqX9X8XqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/bridges-web.png b/icons/bridges-web.png
new file mode 100644 (file)
index 0000000..7bf435c
Binary files /dev/null and b/icons/bridges-web.png differ
diff --git a/icons/bridges.ico b/icons/bridges.ico
new file mode 100644 (file)
index 0000000..3c17b94
Binary files /dev/null and b/icons/bridges.ico differ
diff --git a/icons/bridges.rc b/icons/bridges.rc
new file mode 100644 (file)
index 0000000..c5c7f27
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "bridges.ico"
diff --git a/icons/cube-16d24.png b/icons/cube-16d24.png
new file mode 100644 (file)
index 0000000..394c969
Binary files /dev/null and b/icons/cube-16d24.png differ
diff --git a/icons/cube-16d4.png b/icons/cube-16d4.png
new file mode 100644 (file)
index 0000000..732412e
Binary files /dev/null and b/icons/cube-16d4.png differ
diff --git a/icons/cube-16d8.png b/icons/cube-16d8.png
new file mode 100644 (file)
index 0000000..9892a76
Binary files /dev/null and b/icons/cube-16d8.png differ
diff --git a/icons/cube-32d24.png b/icons/cube-32d24.png
new file mode 100644 (file)
index 0000000..592d5a6
Binary files /dev/null and b/icons/cube-32d24.png differ
diff --git a/icons/cube-32d4.png b/icons/cube-32d4.png
new file mode 100644 (file)
index 0000000..cbb82a9
Binary files /dev/null and b/icons/cube-32d4.png differ
diff --git a/icons/cube-32d8.png b/icons/cube-32d8.png
new file mode 100644 (file)
index 0000000..cdc79ea
Binary files /dev/null and b/icons/cube-32d8.png differ
diff --git a/icons/cube-48d24.png b/icons/cube-48d24.png
new file mode 100644 (file)
index 0000000..99179d3
Binary files /dev/null and b/icons/cube-48d24.png differ
diff --git a/icons/cube-48d4.png b/icons/cube-48d4.png
new file mode 100644 (file)
index 0000000..cc59b8d
Binary files /dev/null and b/icons/cube-48d4.png differ
diff --git a/icons/cube-48d8.png b/icons/cube-48d8.png
new file mode 100644 (file)
index 0000000..6fee156
Binary files /dev/null and b/icons/cube-48d8.png differ
diff --git a/icons/cube-base.png b/icons/cube-base.png
new file mode 100644 (file)
index 0000000..6e3f87d
Binary files /dev/null and b/icons/cube-base.png differ
diff --git a/icons/cube-ibase.png b/icons/cube-ibase.png
new file mode 100644 (file)
index 0000000..6e3f87d
Binary files /dev/null and b/icons/cube-ibase.png differ
diff --git a/icons/cube-ibase4.png b/icons/cube-ibase4.png
new file mode 100644 (file)
index 0000000..d4fe125
Binary files /dev/null and b/icons/cube-ibase4.png differ
diff --git a/icons/cube-icon.c b/icons/cube-icon.c
new file mode 100644 (file)
index 0000000..dcc5639
--- /dev/null
@@ -0,0 +1,801 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 236 2 ",
+"   c #E3E3E4",
+".  c #CECEDC",
+"X  c #CCCCDC",
+"o  c #CDCDDC",
+"O  c #CDCDDB",
+"+  c #CDCDDC",
+"@  c #CCCCDC",
+"#  c #CECEDB",
+"$  c #DADADA",
+"%  c gray86",
+"&  c gray86",
+"*  c #DADADA",
+"=  c gray86",
+"-  c #DADADA",
+";  c gray86",
+":  c gray90",
+">  c #1818E9",
+",  c #0909F6",
+"<  c #0D0DF2",
+"1  c #0C0CE2",
+"2  c #0D0DF3",
+"3  c #0909F6",
+"4  c #1A1AE6",
+"5  c #CECED5",
+"6  c #E0E0DE",
+"7  c #DBDBDC",
+"8  c #CDCDCD",
+"9  c #DDDDDD",
+"0  c gray87",
+"q  c LightGray",
+"w  c #DDDDDD",
+"e  c #CDCDDC",
+"r  c #0D0DF3",
+"t  c blue",
+"y  c #0101FE",
+"u  c #0000EC",
+"i  c #0101FF",
+"p  c #1010F1",
+"a  c #D9D9DF",
+"s  c #EDEDEA",
+"d  c #E7E7E7",
+"f  c #D7D7D7",
+"g  c gray91",
+"h  c gray92",
+"j  c #DDDDDD",
+"k  c gainsboro",
+"l  c #CDCDDC",
+"z  c #0C0CF3",
+"x  c #0101FE",
+"c  c #0000EC",
+"v  c #0202FE",
+"b  c #1010F0",
+"n  c #D6D6DD",
+"m  c #E9E9E7",
+"M  c #E4E4E4",
+"N  c #D5D5D5",
+"B  c gray90",
+"V  c #E7E7E7",
+"C  c #DADADA",
+"Z  c gainsboro",
+"A  c #D3D3DA",
+"S  c #7272D7",
+"D  c #6E6EE3",
+"F  c #7979DF",
+"G  c #3131D6",
+"H  c #0000ED",
+"J  c #0000EF",
+"K  c #0F0FE0",
+"L  c #C7C7CD",
+"P  c #D9D9D7",
+"I  c #D3D3D4",
+"U  c #C5C5C5",
+"Y  c #D5D5D5",
+"T  c gray84",
+"R  c gray80",
+"E  c gainsboro",
+"W  c #DCDCDB",
+"Q  c #EBEBDB",
+"!  c #F5F5E7",
+"~  c #FFFFE1",
+"^  c #6B6BE1",
+"/  c #1010F1",
+"(  c #D5D5DD",
+")  c #E9E9E8",
+"_  c #E6E6E7",
+"`  c #D8D8D8",
+"'  c #E9E9E9",
+"]  c #ECECEC",
+"[  c gainsboro",
+"{  c gray86",
+"}  c #DBDBDF",
+"|  c #E3E3EB",
+" . c #F5F5E6",
+".. c #6464E3",
+"X. c #1010F1",
+"o. c #DCDCDF",
+"O. c #F1F1EB",
+"+. c #DCDCDB",
+"@. c #CACACB",
+"#. c #DADADA",
+"$. c gray85",
+"%. c #D7D7D7",
+"&. c gray87",
+"*. c #DADADA",
+"=. c #D2D2D2",
+"-. c #D9D9DD",
+";. c #EAEAD9",
+":. c #6060D7",
+">. c #0000F4",
+",. c #0000F5",
+"<. c #0E0EE6",
+"1. c #BEBED5",
+"2. c #CCCCDC",
+"3. c #C8C8CE",
+"4. c #E1E1E0",
+"5. c #E0E0E1",
+"6. c #D2D2D2",
+"7. c #C3C3C3",
+"8. c gray87",
+"9. c #DADADA",
+"0. c gray83",
+"q. c #DBDBDF",
+"w. c #ECECDA",
+"e. c #6060D8",
+"r. c #0000F6",
+"t. c #0303F7",
+"y. c #0000E9",
+"u. c #0909EA",
+"i. c #0000F5",
+"p. c #8B8BDC",
+"a. c #F4F4E9",
+"s. c #E3E3EA",
+"d. c #DADADF",
+"f. c #D2D2D3",
+"g. c #DDDDDD",
+"h. c gray86",
+"j. c gray87",
+"k. c #E7E7EB",
+"l. c #F8F8E6",
+"z. c #6767E3",
+"x. c #0808FF",
+"c. c #0404F3",
+"v. c #0606F5",
+"b. c #9595DC",
+"n. c #FFFFE2",
+"m. c #F5F5E3",
+"M. c #EDEDD7",
+"N. c #DEDED6",
+"B. c #DDDDDF",
+"V. c gray86",
+"C. c gray86",
+"Z. c #E3E3E8",
+"A. c #F5F5E2",
+"S. c #6464E1",
+"D. c #0404FF",
+"F. c #0000F3",
+"G. c #0101F4",
+"H. c #2323DB",
+"J. c #4040E0",
+"K. c #3B3BE8",
+"L. c #3737E0",
+"P. c #A3A3CD",
+"I. c #E5E5DE",
+"U. c #DADADA",
+"Y. c #CDCDCD",
+"T. c #D6D6D7",
+"R. c #DCDCD4",
+"E. c #9797CB",
+"W. c #6E6EE0",
+"Q. c #7878E2",
+"!. c #7070D5",
+"~. c #7070D6",
+"^. c #7777E3",
+"/. c #6C6CDD",
+"(. c #5E5ED1",
+"). c #6868E4",
+"_. c #6363E6",
+"`. c #8484C8",
+"'. c #E0E0D9",
+"]. c gray86",
+"[. c #E9E9E8",
+"{. c #E4E4E5",
+"}. c #DDDDD5",
+"|. c #F7F7E4",
+" X c #F9F9E7",
+".X c #EBEBD9",
+"XX c #ECECDB",
+"oX c #F9F9E6",
+"OX c #F7F7E4",
+"+X c #E8E8D5",
+"@X c #FAFAE4",
+"#X c #FDFDE6",
+"$X c #E7E7DC",
+"%X c #DBDBDD",
+"&X c gray86",
+"*X c gray87",
+"=X c gray92",
+"-X c #E8E8E7",
+";X c #D6D6D8",
+":X c #E4E4E9",
+">X c #E7E7EB",
+",X c #DADADE",
+"<X c #DBDBDF",
+"1X c #E7E7EB",
+"2X c #E4E4E7",
+"3X c #D4D4D7",
+"4X c #E5E5E9",
+"5X c #E7E7EB",
+"6X c #DADADD",
+"7X c #DDDDDC",
+"8X c #DDDDDD",
+"9X c gray80",
+"0X c gray86",
+"qX c #DDDDDD",
+"wX c gray82",
+"eX c LightGray",
+"rX c #DDDDDD",
+"tX c #DADADA",
+"yX c #CDCDCD",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #D2D2D2",
+"aX c #DDDDDD",
+"sX c gainsboro",
+"dX c gainsboro",
+"fX c gainsboro",
+"gX c gainsboro",
+"hX c gainsboro",
+"jX c gainsboro",
+"kX c gainsboro",
+"lX c gainsboro",
+"zX c gainsboro",
+"xX c gainsboro",
+"cX c #DDDDDD",
+"vX c gray90",
+"bX c white",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+". > , < 1 2 3 4 5 6 7 8 9 0 q w ",
+"e r t y u i t p a s d f g h j k ",
+"l z t x c v t b n m M N B V C Z ",
+"A S D F G H J K L P I U Y T R E ",
+"W Q ! ~ ^ t t / ( ) _ ` ' ] [ E ",
+"{ } |  ...t t X.o.O.+.@.#.$.%.&.",
+"*.=.-.;.:.>.,.<.1.2.3.4.5.6.7.8.",
+"9.0.q.w.e.r.t.y.u.i.p.a.s.d.f.g.",
+"h.j.k.l.z.t x.c.v.t b.n.m.M.N.B.",
+"V.C.Z.A.S.t D.F.G.t H.J.K.L.P.I.",
+"U.Y.T.R.E.W.Q.!.~.^./.(.)._.`.'.",
+"].9 [.{.}.|. X.XXXoXOX+X@X#X$X%X",
+"&X*X=X-X;X:X>X,X<X1X2X3X4X5X6X7X",
+"; q 8XC 9X0XqXwXeXrXtXyXuXiXpXaX",
+": w sXZ dXfXgXhXjXgXkXlXzXxXcXvX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 234 2 ",
+"   c #1313BC",
+".  c #595999",
+"X  c #0B0BCE",
+"o  c #0D0DCC",
+"O  c #0E0ECD",
+"+  c #1010CB",
+"@  c #0000D1",
+"#  c #0000D3",
+"$  c #0101D3",
+"%  c #0000D4",
+"&  c #0202D7",
+"*  c #0F0FD1",
+"=  c #0D0DD2",
+"-  c #0E0ED2",
+";  c #0101D8",
+":  c #0000D9",
+">  c #0000DA",
+",  c #0000DB",
+"<  c #0404DF",
+"1  c #1111D1",
+"2  c #1616DD",
+"3  c #3131CC",
+"4  c #2121D0",
+"5  c #3131D7",
+"6  c #3131D8",
+"7  c #3434DA",
+"8  c #0000E4",
+"9  c #0101E4",
+"0  c #0000E5",
+"q  c #0101E5",
+"w  c #0000E6",
+"e  c #0D0DE3",
+"r  c #0F0FE2",
+"t  c #0F0FE3",
+"y  c #0D0DE4",
+"u  c #0000E9",
+"i  c #0101E9",
+"p  c #0202E9",
+"a  c #0000EA",
+"s  c #0101EA",
+"d  c #0000EB",
+"f  c #0101EB",
+"g  c #0202EA",
+"h  c #0000EC",
+"j  c #0000EE",
+"k  c #0101EE",
+"l  c #0000EF",
+"z  c #0101EF",
+"x  c #0C0CE9",
+"c  c #0D0DE9",
+"v  c #1212E1",
+"b  c #1010E3",
+"n  c #1212E2",
+"m  c #1414E3",
+"M  c #1616E3",
+"N  c #1010E4",
+"B  c #1212E6",
+"V  c #1313E6",
+"C  c #1212E7",
+"Z  c #1515E4",
+"A  c #1616E4",
+"S  c #1515E7",
+"D  c #0000F0",
+"F  c #0000F1",
+"G  c #0000F5",
+"H  c #0000F8",
+"J  c #0000F9",
+"K  c #0303FB",
+"L  c #0000FD",
+"P  c #0101FD",
+"I  c #0303FC",
+"U  c #0202FD",
+"Y  c #0303FD",
+"T  c #0000FE",
+"R  c #0101FE",
+"E  c blue",
+"W  c #0101FF",
+"Q  c #0202FF",
+"!  c #5D5DCC",
+"~  c #8989B1",
+"^  c #9C9CBD",
+"/  c #ACACAC",
+"(  c #AFAFBA",
+")  c #AEAEBB",
+"_  c #AFAFBB",
+"`  c #B8B8B9",
+"'  c #B9B9B9",
+"]  c gray73",
+"[  c #BBBBBB",
+"{  c #BCBCBC",
+"}  c gray74",
+"|  c gray",
+" . c gray75",
+".. c #C2C2BF",
+"X. c #9797CB",
+"o. c #9797CC",
+"O. c #9898CF",
+"+. c #9797D1",
+"@. c #B3B3C0",
+"#. c #B2B2C1",
+"$. c #B4B4C1",
+"%. c #BABAC1",
+"&. c #BEBECF",
+"*. c #C0C0C0",
+"=. c #C1C1C0",
+"-. c #C1C1C1",
+";. c #C3C3C0",
+":. c #C3C3C3",
+">. c #C5C5C3",
+",. c #C3C3C6",
+"<. c gray77",
+"1. c #C5C5C5",
+"2. c #C6C6C4",
+"3. c #C6C6C6",
+"4. c gray78",
+"5. c #C8C8C5",
+"6. c #CACAC5",
+"7. c #C9C9C6",
+"8. c #C8C8C8",
+"9. c gray79",
+"0. c #CBCBC9",
+"q. c #CBCBCB",
+"w. c gray80",
+"e. c #CCCCCD",
+"r. c #CDCDCD",
+"t. c #CDCDCE",
+"y. c #CECECE",
+"u. c #CECECF",
+"i. c gray81",
+"p. c #D3D3C8",
+"a. c #D2D2CA",
+"s. c #C1C1D0",
+"d. c #C2C2D0",
+"f. c #C2C2D1",
+"g. c #C1C1D3",
+"h. c #C6C6D0",
+"j. c #C7C7D0",
+"k. c #C6C6D1",
+"l. c #C6C6D2",
+"z. c #C2C2D4",
+"x. c #C6C6D4",
+"c. c #C6C6D5",
+"v. c #D0D0D0",
+"b. c gray82",
+"n. c #D2D2D0",
+"m. c #D2D2D2",
+"M. c #D2D2D3",
+"N. c LightGray",
+"B. c #D5D5D2",
+"V. c #D6D6D2",
+"C. c #D3D3D4",
+"Z. c gray83",
+"A. c #D5D5D4",
+"S. c #D4D4D5",
+"D. c #D5D5D5",
+"F. c #D6D6D4",
+"G. c #D7D7D5",
+"H. c gray84",
+"J. c #D7D7D6",
+"K. c #D7D7D7",
+"L. c #D8D8D3",
+"P. c #D8D8D4",
+"I. c #D8D8D5",
+"U. c #D9D9D5",
+"Y. c #D9D9D6",
+"T. c #D7D7D8",
+"R. c #D7D7D9",
+"E. c #D8D8D8",
+"W. c #D8D8D9",
+"Q. c gray85",
+"!. c #DADAD9",
+"~. c #DBDBD9",
+"^. c #D9D9DA",
+"/. c #DADADA",
+"(. c #DCDCD8",
+"). c #DDDDD9",
+"_. c #DFDFD9",
+"`. c #DEDEDA",
+"'. c gainsboro",
+"]. c #DDDDDD",
+"[. c #DEDEDC",
+"{. c #DFDFDC",
+"}. c gray87",
+"|. c #E1E1D7",
+" X c #E9E9DB",
+".X c #EBEBDD",
+"XX c #ECECDC",
+"oX c #ECECDD",
+"OX c #E1E1E1",
+"+X c #E2E2E2",
+"@X c #E3E3E2",
+"#X c gray89",
+"$X c #E2E2E4",
+"%X c #E3E3E4",
+"&X c #E2E2E5",
+"*X c #E3E3E5",
+"=X c #E4E4E4",
+"-X c #E4E4E5",
+";X c gray90",
+":X c #E6E6E6",
+">X c #E7E7E7",
+",X c #E1E1E8",
+"<X c #E5E5E8",
+"1X c #E7E7E8",
+"2X c #E7E7E9",
+"3X c gray91",
+"4X c #E8E8E9",
+"5X c #E9E9E9",
+"6X c #EAEAE9",
+"7X c #E8E8EA",
+"8X c #E9E9EA",
+"9X c #EAEAEA",
+"0X c #EBEBEA",
+"qX c gray92",
+"wX c #EDEDE9",
+"eX c #EDEDEA",
+"rX c #EEEEEA",
+"tX c #EEEEEB",
+"yX c #ECECEC",
+"uX c #EDEDEE",
+"iX c #EEEEEE",
+"pX c #EFEFEE",
+"aX c #EEEEEF",
+"sX c #EFEFEF",
+"dX c #FCFCE1",
+"fX c #F4F4E8",
+"gX c #F5F5E9",
+"hX c #F4F4EB",
+"jX c #F2F2EF",
+"kX c #F3F3EF",
+"lX c #F4F4EF",
+"zX c #FAFAED",
+"xX c gray94",
+"cX c #F3F3F0",
+/* pixels */
+":X:XrXrXtXtXtXtXrXrXrXrXtXtXrXrX3X3XtX9X3X3XtX3XtX9X9X9XtX9X<X:X",
+":X#Xl.l.l.l.l.l.h.l.l.l.l.l.l.l.M.M.a.M.M.M.i.M.M.M.i.M.i.M.:X:X",
+"tXl.& j g g g j & & j q g g j = <.R.C.C.C.E.} >.K.C.C.C.K.} K.3X",
+"tXl.g E E E E E q g E E E E E n E.uX7X9X3XtXM.E.tX3X3X3XtXM.E.3X",
+"rXl.g E P E P E q g E E E E E n K.3X%X:X%X3Xt.K.3X:X:X#X9Xe.R.3X",
+"rXl.g E E E P E q g E E E E E t Y.3X:X:X:X9Xt.K.3X%X:X:XtXt.E.3X",
+"tXl.p E P P P E 8 g E P E P E n K.3X:X:X:X9Xt.K.3X:X:X:X3Xt.E.3X",
+"rXl.q E E E E E q g E E E P E N (.tX3XtX3XxXM.E.xX3XtX3XxXM.E.9X",
+"tXl.= x y y y x X # g q q q g X :.C.i.t.t.B.] :.C.i.t.t.M.} K.3X",
+"tXi.:.E.C.C.M.(.$.: j g g g j = >.E.C.K.C.E.} <.K.K.K.M.Y.} E.3X",
+"9XM.K.tX3XrX3XjXl.g E E E E E N E.tX3X3X3XuXM.E.tX3X3X3XjXt.E.3X",
+"9Xi.C.9X%X:X%XrX&.g E E E E E t K.3X:X:X:X3Xq.K.<X:X:X:X3Xt.R.tX",
+"tXi.M.3X:X:X%XrXf.j E E E P E t K.3X:X:X:XxXM.E.uX3X3X3XtXq.K.3X",
+"9Xi.M.3X=X:X:X3Xs.g E E E P E n B.3X%X3XC.q.] } t.4.q.:.<XM.R.3X",
+"tXC.R.jX3X9X9XjXx.g E E E E E n |.cXrXxX0.B.#X].].].#X] [ q.E.3X",
+"9Xi.%.M.a.i.i.K.) # g q 8 8 q X #.z.&.f.) #X3X3X3X:X9Xe.'./ E.rX",
+"rXt.<.'.K.R.C.(.#.: j g j g D # , D g D 3 .X:X:X:X:XtX<.<Xt.K.3X",
+"9XM.R.tX<X3X3XjXx.g E P E E E q j E E E 7 .X,X:X:X:X3X<.:Xt.R.rX",
+"9XM.M.3X:X:X%XrXf.g E P E P E 8 g E K E 5  X,X%X%X#X<X,.#XM.K.3X",
+"9Xi.B.3X=X:X:XrXf.g E E E E E q j E Y E 7 dXhXgXgXfXzXa.%Xt.E.3X",
+"9Xi.M.3X:X:X#XrXf.g E E E P E 8 g E P E 4 ^ O.X.X.X.O.~ .XM.K.5X",
+"tXM.E.uX3X3X3XcXx.g E E E E E 8 j E E E G @ G E P P E P ! a.K.5X",
+"tXt.} M.t.t.t.B.( 1 N n m n N + 1 N m n Z 2   m m m m Z 9 . |.3X",
+"9XM.<.E.B.K.K.E.:.7.(.Y.Y.Y.(.:.7.(.Y.Y.Y.(.:.7.(.Y.Y.Y.|.%.Y.3X",
+"9XM.K.tX3X3X3XxXC.R.uX3X9X<XxXC.R.uX3X3X3XuXa.R.jX3X3X3XtXM.K.3X",
+"3XM.K.3X<X:X:X3Xi.C.9X:X:X:X3Xt.K.3X:X:X:X3Xt.K.3X:X:X#X9Xt.E.3X",
+"tXi.M.3X:X:X:XtXa.C.3X:X:X:X3Xi.C.3X:X:X:X9Xt.K.3X:X:X:X3Xt.E.3X",
+"9XM.M.3X%X:X:X3Xt.M.3X:X:X%X3Xi.K.3X%X:X%X9Xt.K.3X:X:X#X3Xt.R.rX",
+"3XM.R.tX3X3X3XxXK.R.tX3XrX3XxXM.E.jX3XrX3XxXM.E.uX3XrX3XxXM.K.3X",
+"rXM.} M.t.t.t.M.[ } M.e.t.q.M.] %.M.e.t.q.M.] ..M.e.t.t.M.{ E.3X",
+":X%XR.K.R.R.Y.K.R.K.R.R.K.K.R.R.K.R.K.K.R.R.K.R.K.K.R.K.Y.E.5X:X",
+":X:XtX3X3XtX3X3XtX3X3XtX3X3XtX3X3XrX3X3XtX3X3XtX3X3XtX3X3X3X:X:X"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 208 2 ",
+"   c #40407A",
+".  c #0505A3",
+"X  c #0000AB",
+"o  c #0404BF",
+"O  c #0808BE",
+"+  c #0909BE",
+"@  c #0A0ABF",
+"#  c #1717BB",
+"$  c #1010BD",
+"%  c #5151AB",
+"&  c #5858BB",
+"*  c #0202C1",
+"=  c #0000C3",
+"-  c #0202C2",
+";  c #0404C0",
+":  c #0505C0",
+">  c #0202C4",
+",  c #0000C6",
+"<  c #0808C1",
+"1  c #0000CE",
+"2  c #1010CE",
+"3  c #0505D2",
+"4  c #0000D7",
+"5  c #0505DA",
+"6  c #0505DB",
+"7  c #0606DB",
+"8  c #0000DC",
+"9  c #0101DC",
+"0  c #0000DD",
+"q  c #0101DD",
+"w  c #0202DD",
+"e  c #0303DD",
+"r  c #0000DE",
+"t  c #0000DF",
+"y  c #0101DF",
+"u  c #0202DE",
+"i  c #0202DF",
+"p  c #0505DC",
+"a  c #0505DD",
+"s  c #0808D9",
+"d  c #0909D9",
+"f  c #0808DA",
+"g  c #1515D2",
+"h  c #1515D3",
+"j  c #1616D5",
+"k  c #0000E0",
+"l  c #0000E1",
+"z  c #0000E3",
+"x  c #0505E1",
+"c  c #0606E0",
+"v  c #0707E0",
+"b  c #0404E3",
+"n  c #0505E3",
+"m  c #0000E5",
+"M  c #0202E5",
+"N  c #0000E6",
+"B  c #0000E7",
+"V  c #0808E0",
+"C  c #0808E1",
+"Z  c #0000E8",
+"A  c #0000E9",
+"S  c #0202EA",
+"D  c #0000EE",
+"F  c #0000F4",
+"G  c #0101F4",
+"H  c #0000F8",
+"J  c #0101F8",
+"K  c #0000FC",
+"L  c #0101FC",
+"P  c #0000FD",
+"I  c #0101FD",
+"U  c #0202FC",
+"Y  c #0000FE",
+"T  c #0101FE",
+"R  c blue",
+"E  c #0101FF",
+"W  c #0202FF",
+"Q  c #939393",
+"!  c gray61",
+"~  c #8F8FA1",
+"^  c #A4A4AD",
+"/  c #A9A9AB",
+"(  c #AAAAAA",
+")  c #A8A8AD",
+"_  c #ACACAC",
+"`  c gray68",
+"'  c #ACACAE",
+"]  c #AEAEAE",
+"[  c #AFAFAF",
+"{  c #B0B0AF",
+"}  c #A7A7B1",
+"|  c #ABABB0",
+" . c #ACACB0",
+".. c #AFAFB1",
+"X. c gray69",
+"o. c #B1B1B1",
+"O. c #B3B3B1",
+"+. c #B2B2B2",
+"@. c #B7B7B7",
+"#. c gray74",
+"$. c #BDBDBE",
+"%. c gray",
+"&. c gray75",
+"*. c #CACABE",
+"=. c #ABABC1",
+"-. c #ABABC2",
+";. c #ACACC3",
+":. c #AEAECB",
+">. c #B0B0C9",
+",. c #C1C1C1",
+"<. c gray76",
+"1. c #C3C3C3",
+"2. c #C1C1C7",
+"3. c gray77",
+"4. c #C4C4C5",
+"5. c #C5C5C5",
+"6. c #C6C6C6",
+"7. c #C7C7C6",
+"8. c gray78",
+"9. c #C9C9C5",
+"0. c #C2C2C8",
+"q. c #C5C5C8",
+"w. c #C6C6C8",
+"e. c #C7C7C9",
+"r. c #C7C7CD",
+"t. c #C8C8C8",
+"y. c gray79",
+"u. c #CACAC8",
+"i. c #CACAC9",
+"p. c #C9C9CA",
+"a. c #C8C8CB",
+"s. c #CACACA",
+"d. c #CBCBCA",
+"f. c #CBCBCB",
+"g. c #CCCCCB",
+"h. c #CDCDCB",
+"j. c #CFCFCB",
+"k. c #C8C8CD",
+"l. c gray80",
+"z. c #CDCDCD",
+"x. c #CFCFCC",
+"c. c #CECECD",
+"v. c #CCCCCE",
+"b. c #CCCCCF",
+"n. c #CDCDCF",
+"m. c #CECECE",
+"M. c #CFCFCE",
+"N. c gray81",
+"B. c #D0D0CE",
+"V. c #D5D5CD",
+"C. c #D8D8CE",
+"Z. c #D0D0D0",
+"A. c #D1D1D0",
+"S. c gray82",
+"D. c #D2D2D0",
+"F. c #D1D1D3",
+"G. c #D2D2D2",
+"H. c LightGray",
+"J. c #D2D2D4",
+"K. c #D5D5D5",
+"L. c #D7D7D7",
+"P. c #D9D9D0",
+"I. c #DCDCD1",
+"U. c #DCDCD3",
+"Y. c #D8D8D8",
+"T. c #DADADA",
+"R. c #DFDFDF",
+"E. c #E8E8D9",
+"W. c #E2E2E3",
+"Q. c gray89",
+"!. c #E2E2E4",
+"~. c #E3E3E4",
+"^. c #E3E3E5",
+"/. c #E4E4E4",
+"(. c #E4E4E5",
+"). c gray90",
+"_. c #E6E6E6",
+"`. c #E7E7E7",
+"'. c #E6E6EA",
+"]. c gray91",
+"[. c #E9E9EB",
+"{. c #EAEAEA",
+"}. c gray92",
+"|. c #ECECEB",
+" X c #EDEDEB",
+".X c #EAEAEC",
+"XX c #EBEBEC",
+"oX c #ECECEC",
+"OX c #EDEDEC",
+"+X c gray93",
+"@X c #EEEEED",
+"#X c #EEEEEE",
+"$X c #F6F6E0",
+"%X c #F1F1EB",
+"&X c #F1F1EC",
+"*X c #F2F2EC",
+"=X c gray94",
+"-X c #F1F1F1",
+";X c #F3F3F2",
+":X c #F3F3F3",
+">X c #F5F5F1",
+",X c #F4F4F3",
+"<X c #F5F5F3",
+"1X c #F3F3F5",
+"2X c #F4F4F4",
+"3X c #F5F5F4",
+"4X c gray96",
+"5X c #FAFAF3",
+/* pixels */
+"_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.",
+"_._._._._._.Q._._._._.Q._._._._._.Q._._././._././._._._._.Q._._._._._.~._._._._._././._._._._._.",
+"_._._._.XXoX}.oXoXoX|.}.}.XXXXoXoXXX}.}.|.|.oX|.|.XXXXoXoX|.}.}.XXoXXXXX}.oXoX|.oXoX}.|._._._._.",
+"_._._._.B.j.x.x.x.j.j.j.j.j.x.x.x.x.x.j.B.B.B.B.x.x.k.j.x.k.x.f.x.k.x.j.f.f.x.k.x.x.k.x._._._._.",
+"_._.}.B.$ c f f f f f d V < O f f f f f f d p < ' f.5.5.5.5.q.5.k.' { f.5.5.5.5.5.5.j.` x.XXQ._.",
+"_._.|.j.f R R R R R R R R l i R R R R R R R R p x.<XXXoXoXoXoXoX1Xx.D.<XoXoXoX|.oXXX1Xk.x.XX_._.",
+"_._.|.j.d R U U U R R U R i 8 R U U R U U U R 8 q.XXQ._./._._._.}.5.f.}._._./._._.Q.}.5.k.XX_._.",
+"_.Q.|.B.f R R R R R R R R l i R R R R R R R R i f.oX~._._._._._.oX5.f.oX_._._._._._.XX5.j.XX_._.",
+"_._.}.j.f R U R R R R R R l i R R R R R R R R 8 q.oX~._._._._._.oX5.x.oX_._._._._._.oX9.x.XX~._.",
+"_._.XXj.f R U R R R R R R l 8 R R R R R R R R i f.oX~._._._._._.oXf.k.oX_._._._._._.oX5.k.}._._.",
+"_._.XXx.f R R R R R R R R i i R U R R R R U R i q.oX_._._._._._.oX9.k.oX_._._._._._.oX5.j.XX_._.",
+"_._.oXx.d R U R R U R U R i 8 R U R U R R U R i q.|.~._._.~._.Q.oX5.f.XXQ._./._._._.|.2.x.XX_._.",
+"_._.XXx.f R R R R R R R R l i R R R R R R R R i x.1X}.XX}.}.oX}.-Xx.D.1X}.oXoXoX}.}.-Xf.x.XX_._.",
+"_.Q.XXx.< B i l l i l l B > > Z i i l i l i B -  .x.f.f.f.f.f.f.D.{ o.N.f.f.f.f.f.f.D.' x.oX~._.",
+"_._.}.x.) r.2.0.2.q.0.2.k. .o l 8 i i 8 i 8 l -  .x.5.f.5.f.5.5.k.' o.x.5.5.f.q.9.5.x.) k.oX_._.",
+"_._.}.f.j.1X|.oXoXoXoXoX<XD.p R R R R R R R R l x.1XoXoXoXoXoX|.1Xx.D.1XoXoXoXoXoX|.1Xf.j.|./._.",
+"_._.XXj.5.XX~.~._.~.~.Q.}.f.5 R U R R U U U R 8 5.|.~._._._.Q.Q.XX5.f.|._._._._./.Q.}.5.k.|._._.",
+"_._.XXk.5.oX_._._._._._.|.f.p R U R R R R R R i f.oX~._._._._._.oX5.k.oX/._._._._._.oX5.x.oX_._.",
+"_._.oXx.5.oXQ._._._._.~.|.f.p R R R R R R R R i q.|._._._._._.Q.}.5.f.}.Q._._._./._.oX5.k.oX_._.",
+"_.Q.XXf.f.oX_._._._._._.|.f.p R R R R R R U R i f.|.~._._._._.}.1Xx.D.1X|.oXoXoXoX].oX5.x.XX~._.",
+"_._.}.f.5.oX_._._._._.~.|.f.5 R U R R R R R R i q.oX_._._.}.Y.$.q.( ' 5.1.1.1.1.$.E.-X2.j.}._._.",
+"_._.oXf.5.}._._._.~._.~.}.f.5 R U R U R R U R i q.|.~._.Q.oX$.$.L.D.D.D.N.N.x.L.^ ! }.9.f.XX~._.",
+"_._.oXx.x.1X}.}.oX}.XX}.1XD.5 R R R R R R R R i x.1XoXoXoX1X5.Y.oX}.}.}.XX}.}.=Xq.f.@.$.x.XX_._.",
+"_._.oXk. .x.5.f.f.f.5.f.x.o.o B 8 i i i i 8 l -  .N.q.q.q.x.( H.}.~._._.~._._.oX$.Y._.Q x.XX_._.",
+"_._.XXx.' B.f.f.f.q.f.9.x.o.; B 8 i i i i i l - - B 8 i 5 l # U.'._._._._._._.oX>.D.1X1.f.|._._.",
+"_./.XXj.k.<X}.}.}.}.}.}.1XD.p R R R R R R R R i i R R R R R g U.}.~._._._._._.oX*.H.-X5.x.}./._.",
+"_./.|.k.5.oXQ._._._._.~.}.f.5 R U U R R R U R i i R U R U R g U.}._._._._._._.oX*.N.-X5.k.|./._.",
+"_._.|.x.5.oXQ._._._._.~.oXf.5 R R R R R R R R i i R R R R R j C.'._._._._._._.XX$.D.-X5.x.oX_._.",
+"_._.XXx.5.oX}._._._._.~.|.f.5 R R R R R R U R i i R U R U R g I.'.Q.~.~.~.~.Q.XX$.D.-X5.k.|._._.",
+"_._.XXk.5.oX_._._._._.~.oXj.p R U R R R R R R i i R R R U R j E.<X%X%X*X*X*X%X5X9.J.-X5.x.oX_._.",
+"_._.oXx.5.oX_._._._._.~.oXj.5 R R R R R R R R i i R R R R R 2 ^ :.=.;.;.;.;.;.>.~ V.1X2.f.}._._.",
+"_.~.XXx.5.}.Q.Q._._.~.Q.}.f.5 R U U R R R U R 8 8 R U R U R G X i G Z Z Z Z Z Z B % $Xf.f.}._._.",
+"_._.}.f.j.1X}.oXoXoXoXoX1XD.p R R R R R R R R i i R R R R R R U 1 F R R R R R R R G & *.x.oX_._.",
+"_._.XXx.' x.5.5.q.f.5.5.x.o.O l 5 5 5 p p 5 n ; ; c 5 p 5 p 5 c 3 . 5 p 5 5 p p 5 V 4   B.XX_._.",
+"_._.XXx.' B.f.f.j.f.f.f.D.o.o.D.f.f.f.j.j.f.B.o.o.D.f.f.f.f.f.f.J. .O.D.f.f.f.f.f.f.D.} j.oX_._.",
+"_._.oXk.f.-X}.}.XXXXoX}.1XN.x.<X}.oX}.oXXX}.-XB.x.-X}.|.|.|.}.}.-Xx.D.-X|.|.|.oXoX|.<Xj.k.}.~._.",
+"_._.XXx.2.|./._._.Q._.Q.XXf.5.XXQ.~.~.~.~.Q.}.f.f.}.Q.~.~.~.~.Q.oXq.f.}.~.~.~._._.~.oX5.j.oX_._.",
+"_./.XXj.5.oX_._._._._._.XXf.q.oX_._._._._._.}.5.f.XX_._._._._._.oXf.f.XX_._._._._._.oX5.k.|._._.",
+"_./.}.k.9.oX'._._._._._.XXf.9.oX_._._._._._.}.f.q.|._._._._._._.oXq.x.XX_._._._._._.oX9.x.|._._.",
+"_._.|.x.5.oX_._._._._._.XXf.f.oX~._._._._._.}.f.f.}._._._._._._.oX9.f.XX~._._._._.~.oX5.k.|./._.",
+"_._.XXx.5.XX_._._._._.Q.}.f.5.oX_._._._._._.oXf.f.|._.'._._._._.oX5.f.XX_._._._._._.|.5.x.oX_._.",
+"_._.oXk.5.}.Q._.Q._._._.}.f.5.oX_._._.Q._.Q.oXq.5.}./._._./._./.oX5.f.}.~._._._._.~.|.2.k.|._._.",
+"_._.oXx.k.<XXXoXoXoXoX}.-XD.x.1XoXoXoXoXoXoX1Xx.B.1XoXoX|.oXoXoX1Xx.D.1XXXoXoXoXXXXX1Xj.x.|._._.",
+"_.Q.oXx.) j.5.5.5.5.f.5.x.{ ` k.5.5.q.5.5.5.j.' ' j.5.5.9.5.5.2.f.' ' x.5.5.5.5.5.5.j.) x.|./._.",
+"_._._._.x.k.x.x.j.k.j.f.k.x.x.k.x.k.j.x.k.x.k.x.x.k.x.x.x.k.j.x.x.x.k.x.x.k.j.x.k.x.k.x.~._._._.",
+"_._._._.}.}.XXoXoXXXXX}.|.oXoXoX|.|.XXoX|.oXoX}.XXXXXXXX}.}.XXXXXXXXoXXX|.|.XXoX|.oXoX}.'._._._.",
+"_._._._._._.Q._._._./._._._._._._././._._._._.Q._.~._._.Q._._._.~._._._._././._._._._._._._._._.",
+"_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/cube-web.png b/icons/cube-web.png
new file mode 100644 (file)
index 0000000..c52dd4a
Binary files /dev/null and b/icons/cube-web.png differ
diff --git a/icons/cube.ico b/icons/cube.ico
new file mode 100644 (file)
index 0000000..1e306b2
Binary files /dev/null and b/icons/cube.ico differ
diff --git a/icons/cube.rc b/icons/cube.rc
new file mode 100644 (file)
index 0000000..d911fac
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "cube.ico"
diff --git a/icons/dominosa-16d24.png b/icons/dominosa-16d24.png
new file mode 100644 (file)
index 0000000..71e478d
Binary files /dev/null and b/icons/dominosa-16d24.png differ
diff --git a/icons/dominosa-16d4.png b/icons/dominosa-16d4.png
new file mode 100644 (file)
index 0000000..dbe1765
Binary files /dev/null and b/icons/dominosa-16d4.png differ
diff --git a/icons/dominosa-16d8.png b/icons/dominosa-16d8.png
new file mode 100644 (file)
index 0000000..71e478d
Binary files /dev/null and b/icons/dominosa-16d8.png differ
diff --git a/icons/dominosa-32d24.png b/icons/dominosa-32d24.png
new file mode 100644 (file)
index 0000000..cbc8c2f
Binary files /dev/null and b/icons/dominosa-32d24.png differ
diff --git a/icons/dominosa-32d4.png b/icons/dominosa-32d4.png
new file mode 100644 (file)
index 0000000..a31dbf3
Binary files /dev/null and b/icons/dominosa-32d4.png differ
diff --git a/icons/dominosa-32d8.png b/icons/dominosa-32d8.png
new file mode 100644 (file)
index 0000000..cbc8c2f
Binary files /dev/null and b/icons/dominosa-32d8.png differ
diff --git a/icons/dominosa-48d24.png b/icons/dominosa-48d24.png
new file mode 100644 (file)
index 0000000..565b320
Binary files /dev/null and b/icons/dominosa-48d24.png differ
diff --git a/icons/dominosa-48d4.png b/icons/dominosa-48d4.png
new file mode 100644 (file)
index 0000000..866ec3c
Binary files /dev/null and b/icons/dominosa-48d4.png differ
diff --git a/icons/dominosa-48d8.png b/icons/dominosa-48d8.png
new file mode 100644 (file)
index 0000000..565b320
Binary files /dev/null and b/icons/dominosa-48d8.png differ
diff --git a/icons/dominosa-base.png b/icons/dominosa-base.png
new file mode 100644 (file)
index 0000000..46f1243
Binary files /dev/null and b/icons/dominosa-base.png differ
diff --git a/icons/dominosa-ibase.png b/icons/dominosa-ibase.png
new file mode 100644 (file)
index 0000000..ba9a81b
Binary files /dev/null and b/icons/dominosa-ibase.png differ
diff --git a/icons/dominosa-ibase4.png b/icons/dominosa-ibase4.png
new file mode 100644 (file)
index 0000000..39615bf
Binary files /dev/null and b/icons/dominosa-ibase4.png differ
diff --git a/icons/dominosa-icon.c b/icons/dominosa-icon.c
new file mode 100644 (file)
index 0000000..cea9566
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"zXxXfXhXjXkXgXxXvXgXhXjXjXfXzXxX",
+"NX..y d p i q ' 2.8 g u d s Z pX",
+"VXk G h   3 7.n A [ ~   + ] 4 0X",
+"BXN 2 7   % w m E , e   & B i wX",
+"cX;X(.`.`._.~.*X3X!.'.^.;.Y e.lX",
+"jXVX%XqXGXmX$XnXCX5XeXqX& V 7 qX",
+"kXnXi.W.CX4X,.sXVXI.T.1X> s.t 8X",
+"lXlXzXzXlXxXvXkXlXgXNX-Xo   2 qX",
+"lXlXzXzXlXjXkXzXlXhXNX-XO   1 qX",
+"jXnXi.Q.CXuXi.sXCXR.W.5X- 9.r 8X",
+"lXSX$XqXBXpX/.jXmX@X,X2Xo f 0 0X",
+"gX{.'.'.eXrXjXtXtXaXdXeXI.n.T.lX",
+"wX: 5 $ A.CXoXjXvX1X<XnXBXwXZXlX",
+"rX# =.n n.hX&.fXZXK.T.CXsXs.pXxX",
+"rXn a t /.VXaXkXxXyXsXzXkXrXjXzX",
+"lXjXgXjXcXlXxXlXkXvXxXlXlXvXzXlX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"lXlXjXjXjXjXjXjXjXjXjXjXjXjXjXjXkXhXjXjXjXjXjXjXjXjXjXjXjXhXlXlX",
+"lXkXmXBXMXNXMXMXMXMXMXMXNXNXNXNXvXVXMXNXNXMXMXMXMXMXNXNXMXVXzXlX",
+"jXNX~.c n z n m m m n m n n h v.0XS n n z m m m m m x n l %.xXlX",
+"gXFX&.  @ &             O @   L P.  X O %           & O   ; eXvX",
+"gXDX=.  < /.d   O o +   j.i.  R U.  : T.$.  O o O   f.>.  2 eXvX",
+"gXFX&.    j.V   X X   v ;XV.  U Y.  l @XZ.=   . o   Q q.  < eXvX",
+"gXFX*.  4 F.|   @ + . < O.4.  U I.  % ,.<.O O O +   3.c.o : eXvX",
+"gXDX,.  O                 o   R Q.  X                 .   1 yXcX",
+"kXvX6Xa.u.a.p.i.i.i.i.p.s.s.e.#XkXx.y.s.a.i.u.a.b.v.n.M.k.{.bXkX",
+"lXkXvXFXDXGXDXFXFXFXFXFXDXFXGXmXzXDXFXJXFXDXHXmX6.} O. .[ h.cXlX",
+"lXlXkXfXxXpXlXhXgXgXgXgXlXdXgXjXlXhXgXwXjXdXmX(.  X   .   : eXvX",
+"lXlXjXMX%X_ M.NXjXlXhXFXe.i.FXhXlXzXjX9.2.bXBX`.  X j.5.  , eXvX",
+"lXlXhXFXl.7.-.xXkXjXNX@XM &.BXjXlXjXNXA.Y cXVX'.  8 OXF.1 % rXvX",
+"lXlXkXnX1X .J.NXjXkXvX8Xu.7.nXkXkXcXyX9.t.zXVX`.  . <.h.# * rXvX",
+"lXlXlXkXbXbXmXlXlXlXkXbXAXNXzXlXlXlXlXhXMXjXVX`.  . X O   ; eXvX",
+"lXlXlXlXkXkXkXlXlXlXlXkXhXjXlXlXlXlXlXzXjXhXCX`.  X X o   ; eXvX",
+"lXlXlXlXkXkXkXlXlXlXlXlXlXjXlXlXlXlXlXzXjXhXCX`.  X . .   ; eXvX",
+"lXlXlXkXbXbXmXlXlXlXlXlXjXmXlXlXlXlXlXhXmXjXVX`.  X   +   ; eXvX",
+"lXlXkXnX1X..J.NXjXkXcXiX1.x.BXjXlXzXgXe.t.vXBX`.  o K.%.  : eXvX",
+"lXlXhXFXl.7.-.xXkXlXkXBXa.[ ZXjXlXjXBXA.Y vXVX`.  + 9.J.@ = rXvX",
+"lXlXjXMX%X_ M.NXjXkXvX8X-.r.MXjXkXxXyX6.<.lXBX`.  & O.F.% ; rXvX",
+"lXlXhXfXxXpXlXhXjXxXvXzXiXNXvXxXzXvXcXiXmXcXAX`.  . o X   : rXvX",
+"lXzXDXFXDXGXDXFXmXaXqXeXyXwXqXuXfXqXeXyXwXqXuXiX#.T E ! U r.cXkX",
+"xXsXg.y.i.a.a.t.,XdX<X3X<X1X1X0XaX1X3X1X<X2X6XxXSXAXZXZXSXZXlXlX",
+"vXeX;   .   o   _ FXxXcXAXCXvXvXzXbXnXBXDXbXvXkXhXgXbXcXgXhXlXlX",
+"vXeX< X   2./   ^ AXsXDXC.M.CXhXkXxXuXy.k.vXjXlXkXmXy.K.VXjXlXlX",
+"vXeX>   h -X3.  / ZXcX3XF <.ZXhXlXkXnX~.#.mXkXlXjXAXH.f.HXgXlXlX",
+"vXeX1   m W.l.  / ZXvX=X| X.mXkXkXxXaXZ j.nXkXlXjXBXe.] cXlXlXlX",
+"vXeX;   . . +   Q SXfXmXmXfXxXlXlXzXgX7X5XkXlXlXlXlX7X4XhXzXlXlX",
+"cXuXG c N M m l D.BXjXkXkXzXlXlXlXlXzXnXbXlXlXlXlXlXbXnXzXlXlXlX",
+"lXzXMXMXMXNXMXNXNXkXlXlXlXkXlXlXlXlXlXkXkXlXlXlXlXlXkXkXlXlXlXlX",
+"lXlXjXjXjXjXjXjXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX",
+"lXlXlXlXjXkXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXkXkXlXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXlXlXlXlX",
+"lXlXlXkXmXmXzXxXzXzXzXzXzXzXzXzXzXzXzXzXxXzXmXnXzXBXzXxXzXzXzXzXzXzXzXzXzXzXzXzXxXzXcXNXlXlXlXlX",
+"lXlXjXmX$Xb y p s a i i i i i i i i i s a t n =XcX{ w p p s a i i i i i i i p d p i t n.NXjXlXlX",
+"lXlXgXFX;.  O                             O   e.>X  .                             X   s xXlXlXlX",
+"lXlXgXFX=.  O & [ V   o X X X X X X O ^ 9 .   q.;X  O   : | C   o X X X o   z ..,     p zXlXlXlX",
+"lXlXgXFX=.  . & /./.  X         o   ( UXR     q.;X  X   !.(.K   .       X   I kXA     i xXlXlXlX",
+"lXlXgXFX*.  #   W U.  o       .   p n.~.]     q.;X    6 hXn.c.            X   /.S     i zXlXlXlX",
+"lXlXgXFX=.  O   s.1X5   .     o   I |.jXU.    q.;X    # &Xt.:XO   .     .   u wX2.    i xXlXlXlX",
+"lXlXgXFX=.  . < r.l.H   o . . . . .   { l     q.;X  O   z g.l   X . . . o   E l.0.=   a zXlXlXlX",
+"lXlXgXFX*.  O                             O   q.;X  X                             X   i zXlXlXlX",
+"lXlXjXNX(.2 % * ; : = & & & & & & & & - = $ 3 {.jXV O * = ; = & & & & # # # % = * $ . 5.NXjXlXlX",
+"lXlXlXkXmXpX7X9X9X9X9X9X9X9X9X9X9X9X9X9X9X7XaXnXcXlX7X9X9X9X9X9X9X9X8XaXfXdXfXfXfXdXjXSXlXlXlXlX",
+"lXlXlXlXjXxXbXbXvXcXbXbXbXbXbXbXbXbXbXcXvXbXxXkXkXlXbXbXvXcXvXbXbXvXVXD.U W W Q Q E R !.mXjXlXlX",
+"lXlXlXlXlXkXkXhXbXMXhXkXkXkXkXkXkXkXjXmXxXjXkXlXlXlXkXjXMXBXlXjXjXcXwX,   .       X   k vXkXlXlX",
+"lXlXlXlXlXlXkXMX<X$XMXkXlXlXlXlXlXkXbX*XyXxXlXlXlXlXlXxX#X'.jXzXjXbX9X= . O . b v O   p zXlXlXlX",
+"lXlXlXlXlXjXNXXXC B J.ZXhXlXlXlXhXAX).  T.ZXhXlXlXlXzXgXc.F o.ZXgXbX9X&     1.XXo.X   p xXlXlXlX",
+"lXlXlXlXlXhXJX2.w.Y.! GXhXlXlXkXvX0X2.J L.SXhXlXlXlXjXmXeXD 3.AXgXbX9X&     5XQ.u.$   i zXlXlXlX",
+"lXlXlXlXlXhXFXj.~ =.%.GXhXlXlXhXZXL.M e ' NXjXlXlXlXzXfX{.| D BXhXbX9X&     $X6.3Xa   p zXlXlXlX",
+"lXlXlXlXlXlXzXhX2.o.wXvXkXlXlXlXzXdX0X3.Y.NXjXlXlXkXxXaX4.X.Q.mXhXbX9X&     x K.O.    i zXlXlXlX",
+"lXlXlXlXlXlXlXxXAXSXvXkXlXlXlXlXlXxXnXZXNXkXlXlXlXlXlXxXVXZXBXkXkXbX9X&   .       X   i zXlXlXlX",
+"lXlXlXlXlXlXlXkXhXhXkXlXlXlXlXlXlXlXkXhXjXlXlXlXlXlXlXlXjXhXjXlXkXbX9X&   . X o o X   i zXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXkXbX9X&   .       X   i zXlXlXlX",
+"lXlXlXlXlXlXlXlXkXkXlXlXlXlXlXlXlXlXkXkXlXlXlXlXlXlXlXlXkXkXlXlXkXbX9X&   . . . . X   i zXlXlXlX",
+"lXlXlXlXlXlXlXjXxXcXjXlXlXlXlXlXlXlXbXvXkXlXlXlXlXlXlXlXvXbXkXlXkXbX9X&   .       X   i zXlXlXlX",
+"lXlXlXlXlXlXkXnXdXuXMXkXlXlXlXlXlXzX6XwXMXkXlXlXlXlXlXxXqX6XmXlXkXbX9X&     # q 5 .   i zXlXlXlX",
+"lXlXlXlXlXkXnX1XP Z [.BXjXlXlXkXcXwX6.B m.ZXhXlXlXlXzXhXa.G 5.CXhXbX9X&     V.$X#.    i zXlXlXlX",
+"lXlXlXlXlXhXHX5.,.B./ GXhXlXlXlXjXnX$Xl v.SXhXlXlXlXkXbX7XH ;.SXgXbX9X&     m.OXo.    i zXlXlXlX",
+"lXlXlXlXlXhXGXr.o.p.[ GXhXlXlXlXlXgXoXS &.FXhXlXlXlXlXkX-X' P VXhXbX9X&   o r J gX1   p zXlXlXlX",
+"lXlXlXlXlXkXvXeX` U -XmXjXlXlXkXnX,X+.~ I.BXjXlXlXkXcXuX:.^ l.MXhXbX9X*     1.).q.    p xXlXlXlX",
+"lXlXlXlXlXlXkXvXnXbXnXkXlXlXlXkXkXzXfXlXNXjXkXkXlXkXkXzXhXhXBXkXjXvX9X& . O o #   +   i zXlXlXlX",
+"lXlXlXkXgXhXhXfXfXgXfXhXjXlXxXnXnXbXmXbXvXnXnXcXzXnXnXnXnXnXvXnXbXnXdXp   X       o   K MXkXlXlX",
+"lXlXkXcXDXSXSXSXSXSXSXDXNXzXuX:X<X,X,X,X,X<X:XrXgX>X<X<X,X,X,X<X>X7XmX,Xv.n.n.n.n.b.M.wXvXkXlXlX",
+"lXkXvXwXN.C.C.V.V.C.C.m.[.mXyX;X>X>X>X>X>X>X-XrXgX;X>X>X>X>X>X>X;X7XzXbXFXDXDXDXDXDXDXcXkXlXlXlX",
+"lXjXBX X  .         .     `.ZXvXnXnXbXvXnXnXmXcXzXnXnXnXbXbXvXnXnXvXlXkXgXgXgXfXgXgXgXkXlXlXlXlX",
+"lXjXBX.X  + o O X   o #   V.SXfXkXjXxXNXlXkXkXkXlXkXkXlXcXxXNXjXkXkXlXlXlXlXcXbXxXlXlXlXlXlXlXlX",
+"lXjXBX X  . o   D 3X0     C.SXhXjXmX5Xj `.BXjXlXlXkXxXdX;.K S.NXjXlXlXlXjXNXC.x %XMXjXlXlXlXlXlX",
+"lXjXBX X  X   $ l.rXg     V.SXgXkXbXi.t E.SXhXlXlXlXzXpXjXu.H AXjXlXlXlXkXzXuXM ~.CXjXlXlXlXlXlX",
+"lXjXBX X  +   <.~.7X..    V.SXdXZXY.L M <.VXjXlXlXlXjXNXOXP ,XmXjXlXlXlXlXjXHXP '.AXjXlXlXlXlXlX",
+"lXjXBX X  o   l =.tX}     C.SXfXbX,XM.z 5.BXjXlXlXkXzXjXf h h.cXkXlXlXlXjXNXD.6 ) dXxXkXlXlXlXlX",
+"lXjXBX.X  + O .   : O #   V.SXhXkXbXJXgXcXxXlXlXlXlXlXjXrX3X4XzXlXlXlXlXlXxX0X6X4XhXzXlXlXlXlXlX",
+"lXjXBX X  .           X   T.ZXhXlXkXgXzXlXlXlXlXlXlXlXlXvXnXbXlXlXlXlXlXlXkXvXnXnXzXlXlXlXlXlXlX",
+"lXkXnX3X$.=.=.*.*.=.-.@.v.zXlXlXlXlXlXkXlXlXlXlXlXlXlXlXkXkXkXlXlXlXlXlXlXlXkXkXkXlXlXlXlXlXlXlX",
+"lXlXkXcXGXFXFXFXFXFXFXGXAXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX",
+"lXlXlXkXgXgXgXgXgXgXgXgXhXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/dominosa-web.png b/icons/dominosa-web.png
new file mode 100644 (file)
index 0000000..00fee90
Binary files /dev/null and b/icons/dominosa-web.png differ
diff --git a/icons/dominosa.ico b/icons/dominosa.ico
new file mode 100644 (file)
index 0000000..3cc7d74
Binary files /dev/null and b/icons/dominosa.ico differ
diff --git a/icons/dominosa.rc b/icons/dominosa.rc
new file mode 100644 (file)
index 0000000..fda910b
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "dominosa.ico"
diff --git a/icons/fifteen-16d24.png b/icons/fifteen-16d24.png
new file mode 100644 (file)
index 0000000..88d068f
Binary files /dev/null and b/icons/fifteen-16d24.png differ
diff --git a/icons/fifteen-16d4.png b/icons/fifteen-16d4.png
new file mode 100644 (file)
index 0000000..40a5aaa
Binary files /dev/null and b/icons/fifteen-16d4.png differ
diff --git a/icons/fifteen-16d8.png b/icons/fifteen-16d8.png
new file mode 100644 (file)
index 0000000..88d068f
Binary files /dev/null and b/icons/fifteen-16d8.png differ
diff --git a/icons/fifteen-32d24.png b/icons/fifteen-32d24.png
new file mode 100644 (file)
index 0000000..12eae23
Binary files /dev/null and b/icons/fifteen-32d24.png differ
diff --git a/icons/fifteen-32d4.png b/icons/fifteen-32d4.png
new file mode 100644 (file)
index 0000000..659378d
Binary files /dev/null and b/icons/fifteen-32d4.png differ
diff --git a/icons/fifteen-32d8.png b/icons/fifteen-32d8.png
new file mode 100644 (file)
index 0000000..12eae23
Binary files /dev/null and b/icons/fifteen-32d8.png differ
diff --git a/icons/fifteen-48d24.png b/icons/fifteen-48d24.png
new file mode 100644 (file)
index 0000000..231343f
Binary files /dev/null and b/icons/fifteen-48d24.png differ
diff --git a/icons/fifteen-48d4.png b/icons/fifteen-48d4.png
new file mode 100644 (file)
index 0000000..9b5d632
Binary files /dev/null and b/icons/fifteen-48d4.png differ
diff --git a/icons/fifteen-48d8.png b/icons/fifteen-48d8.png
new file mode 100644 (file)
index 0000000..231343f
Binary files /dev/null and b/icons/fifteen-48d8.png differ
diff --git a/icons/fifteen-base.png b/icons/fifteen-base.png
new file mode 100644 (file)
index 0000000..4685e06
Binary files /dev/null and b/icons/fifteen-base.png differ
diff --git a/icons/fifteen-ibase.png b/icons/fifteen-ibase.png
new file mode 100644 (file)
index 0000000..3de6ce0
Binary files /dev/null and b/icons/fifteen-ibase.png differ
diff --git a/icons/fifteen-ibase4.png b/icons/fifteen-ibase4.png
new file mode 100644 (file)
index 0000000..7be2b9d
Binary files /dev/null and b/icons/fifteen-ibase4.png differ
diff --git a/icons/fifteen-icon.c b/icons/fifteen-icon.c
new file mode 100644 (file)
index 0000000..0297c9e
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qX0XqXqXqXqXqXqXtXuXyXyXyXyXyXqX",
+"6X2XeXqXqXqXqXeXjXaXpXaXiXdXwX7X",
+"5X1XeXqXqXqX0XrXsX7XuXwXuXqX,X5X",
+"6X2XeXqXqXqXqXrXsXeXW.>XE.qX2X6X",
+"6X<XqX9X9X9X9XwXaXpXs.p.T 3X4X5X",
+"5X7XsXiXiXiXiXsXdXeX(.{.}.7X3X5X",
+"6XyXaXuXuXyXpXtXyX0XpXiXiXrX1X5X",
+"7XeX0XrXwXyXeX4XqX7X5X6X5X8X2X7X",
+"6XwXpXY.{.M.>X9XyXyXrXrXeXuX8X7X",
+"6XqXgXx.v.$.{.rXeX0XtXyXuXqX<X5X",
+"6XwXtX#X X@X0X7XrXtXI.E.z.tX2X5X",
+"6XrXwXyXiXuXeX6XwXdXi.j...<X5X5X",
+"7X4X<X>X>X>X,X,XuXeXoX@X%XwX2X6X",
+"5X,X0X8X8X9X8XwXsX8XyXtXrXwX<X5X",
+"6X0XfXaXaXaXaXfXaX7X8X7X7X9X5X9X",
+"qXtXuXyXyXyXyXyXtXtXtXtXtXtXyXwX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0X9X0X9X9X9X9X9X9X9X9X0X9X9XqXqX",
+"qXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXeXuXuXuXuXuXuXuXuXuXuXuXuXuXwXqX",
+"wX6X$XeX0XqXqXqXqXqXqXqXqXqXqX0XMXmXvXvXvXvXvXvXvXvXvXvXmXpX8XwX",
+"eX5X#XrX0XqXqXqXqXqXqXqXqXqXqX0XnXqX8X9X9X9X9X9X9X9X9X8XqXOX5XeX",
+"eX5X#XeX0XqXqXqXqXqXqXqXqXqXqX0XnXrXqXwXqXqXqXwXqXqXwXqXrX$X5XeX",
+"eX5X#XeX0XqXqXqXqXqXqXqXqXqXqX0XnXeX0XqXqXqXqXqX0XqXqX0XeX#X5XeX",
+"eX5X#XeX0XqXqXqXqXqXqXqXqXqXqX0XnXeX0XqX0X0XwX0XiXwXqX0XeX#X5XeX",
+"eX5X#XeX0XqXqXqXqXqXqXqXqXqXqX0XnXeX9XaXG.z }.bX| { fX8XeX#X5XeX",
+"eX5X#XeX0XqXqXqXqXqXqXqXqXqXqX0XnXeX0X0XuXK |.'.H ] gX7XrX#X5XeX",
+"eX5X#XrXqXwXwXwXwXwXwXwXwXwXwXqXnXeX0XwX4Xv J.-.n p >XeXeX#X5XeX",
+"wX5X@X0X8X8X8X8X8X8X8X8X8X8X8X7XbXeX9XpXU.) 9.7XP.r.eX0XeX#X5XeX",
+"eX4X=XlXhXhXhXhXhXhXhXhXhXhXhXhXNXwXqX0XuXkXdXeXaXgXqX0XrX#X5XeX",
+"eX2X7XMXfXjXhXhXhXhXhXhXhXhXlXrXhXtX0XqX0X7X9XqX9X8XqX0XeX#X5XeX",
+"eX2X7XsX5X8X8X8X8X8X8X8X8X7XqX&XiXuXqXwXwXwXwXwXwXwXwXwXtX$X5XeX",
+"eX2X7XgX9XwXqX0XqXwX0X0XwXqXtX;XpXqX5X6X6X6X6X6X6X6X6X5X8XXX5XeX",
+"eX2X7XfX8XqXeXsXrXqXdXuX0XqXrX;XeX7X1X2X2X2X2X2X2X2X2X2X2X>X9XwX",
+"eX2X7XfX8XeX4X~.>X9XR.oXrX0XrX-XsXcXhXjXjXjXjXjXjXjXjXjXzX9X6XwX",
+"eX2X7XfX7XtX;Xh t.7X:.j .XuXeX;XpXeX7X8X8X8X8X8X8X8X8X7X0XoX5XeX",
+"eX2X7XfX8X7XmXu.w.DXJ.g XXuXeX;XpXuX0XwXqX0XqXqX0X0XwXqXrX$X5XeX",
+"eX2X7XfX7XeX6XG Q |.0.a E.aXwX;XpXyX0X0XtXaXqXrXdXpXqXqXeX#X5XeX",
+"eX2X7XfX7XtX;Xb.B..Xn.Q.rX0XrX;XpXyX9XrX*X/.9X1XQ._.wX0XeX#X5XeX",
+"eX2X7XfX8XqXrXhXgXuXjXaXqXqXrX;XpXyX8XiXI.7 @Xk.w x.uX9XeX#X5XeX",
+"eX2X7XfX8XqX0X8X8X0X8X9XqX0XrX-XpXyX0X8XvX^ XX`.@.' 6XwXeX#X5XeX",
+"eX2X7XhXqXrXeXeXeXeXeXeXeXeXuX:XpXyX9XyX{.e y._.9.g 1XeXeX#X5XeX",
+"eX2X8XyX:X1X1X1X1X1X1X1X1X<X4X+XpXyX9XyX].z.K.XXg.+XyX9XrX#X5XeX",
+"eX5X=X<X%X&X&X&X&X&X&X&X&X&X*X%XzXrX0X0XiXjXdXuXkXuX0XqXeX#X5XeX",
+"eX5X@XyXrXrXrXrXrXrXrXrXrXrXrXrXmXeX0XqX9X8X9X0X8X9XqX0XeX#X5XeX",
+"eX5X$XrX0XqXqXqXqXqXqXqXqXqXqX0XnXyXeXrXrXrXrXrXrXrXrXeXuX%X5XeX",
+"eX5X+XqX8X9X9X9X9X9X9X9X9X9X9X8XcX1X>X>X>X>X>X>X>X>X>X>X<X|.5XeX",
+"eX5X3XMXvXvXvXvXvXvXvXvXvXvXvXbXmXrXeXrXrXrXrXrXrXrXrXrXrXrXqXqX",
+"qX0XrXuXuXuXuXuXuXuXuXuXuXuXuXuXyXaXaXaXaXaXaXaXaXaXaXaXaXpXwXqX",
+"qXqX0X9X0X9X9X9X9X9X9X9X9X9X9X0X0X9X9X9X9X9X9X9X9X9X9X9X9X9XqXqX"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXqXqXqXqXqX",
+"qXqXqXwXeXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX9X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8XqXqXqXqX",
+"qXqXwX6X3XwXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XsXlXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXlXgXqXqXqXqX",
+"qX0XtX*XoXtX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XSXVXnXmXmXmXmXmXmXmXmXmXmXmXmXmXmXmXNX9X8XwXqXqX",
+"qX0XrX-X+XtX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XAXwX6X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8X5X_.0XqXqXqX",
+"qX0XrX=XOXtX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XAXuXqXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwX0X{.0XqXqXqX",
+"qX0XrX=XOXtX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XAXyX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXwX9X[.0XqXqXqX",
+"qX0XrX=XOXtX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XAXyX0XqXqXqXqX0XqXqXqXqXqXqXqXqXqXwX9X[.0XqXqXqX",
+"qX0XrX=XOXtX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XAXyX0XqXqXqXqXeXwXqXqX0XqXwXqXqXqXwX9X[.0XqXqXqX",
+"qX0XrX=XOXtX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XAXyX0XqXqXqXeX7X9XqX0XrXwX8XqXqXqXwX9X[.0XqXqXqX",
+"qX0XrX=XOXtX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XAXyX0XqX0XuX,.- :.sXrX*X3 } dX9XqXwX9X[.0XqXqXqX",
+"qX0XrX=XOXtX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XAXyX0XqXqX0X=XZ ( gXiX[ ; T fX9XqXwX9X[.0XqXqXqX",
+"qX0XrX=XOXtX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XAXyX0XqXqX8XbXQ ^ VXd.;.:.H xX8XqXwX9X[.0XqXqXqX",
+"qX0XrX=XOXtX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XAXyX0XqXqX9XfXI ! MXI p e $ T.pX9XwX9X[.0XqXqXqX",
+"qX0XtX=X+XyXqXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXqXAXyX0XqX9XpX*., , <.=X!.T M 4XwX0XwX9X[.0XqXqXqX",
+"qX0XrX-XoXqX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X6XAXyX0XqXqXwX;X-X=X;XiXhX9X6XuX0XqXwX9X[.0XqXqXqX",
+"qX0XtX*X*XbXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXxXlXFXyX0XqXqXqXtXtXtXtX9X8XwXeX0XqXqXwX9X[.0XqXqXqX",
+"qX0XtX%X8XHXcXnXbXbXbXbXbXbXbXbXbXbXbXbXbXbXMXtXmXiX9XqXqXqX0X0X0X0XqXqX0X0XqXqXqXwX9X[.0XqXqXqX",
+"qX0XtX$X9XzX3X8X7X7X7X7X7X7X7X7X7X7X7X7X7X6XqX].zXpX9XqXqXqXqXqXqXqXqXqXqXqXqXqXqXwX9X[.0XqXqXqX",
+"qX0XtX$X9XbX7XwXwXwXwXwXwXwXwXwXwXwXwXwXwXqXtX.XxXiX9X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX8X[.0XqXqXqX",
+"qX0XtX$X9XvX7XwXqXqXqXqXqXqXqXqXqXqXqXqXqX0XtX XxXfXrXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXrX}.0XqXqXqX",
+"qX0XtX$X9XvX7XwXqXqXqX0X0XqXqX0X0XqXqXqXqX0XtX XjX:X.XOXOXOXOXOXOXOXOXOXOXOXOXOXOXOXXX(.qXqXqXqX",
+"qX0XtX$X9XvX7XwXqXqXqXrXeXqXqXeXtXqX0XqXqX0XrX.XdXgXiXpXpXpXpXpXpXpXpXpXpXpXpXpXpXiXaXtX0XqXqXqX",
+"qX0XtX$X9XvX7XwXqXqXqX2X3XqXwX3X-XrXyX0XqX0XtX XcXbXhXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkX-X8XwXqXqX",
+"qX0XtX$X9XvX7XwX9XaXD.5 v 0X,XU f v OXyX0X0XtX XxXyX6X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X5X`.0XqXqXqX",
+"qX0XtX$X9XvX7XwX0XqX7X0.e 8X6X%XT.$ I.sX9X0XtX XxXpX0XwXqXqXqXqXqXqXqXqXqXqXqXqXqXwX9X{.0XqXqXqX",
+"qX0XtX$X9XvX7XwXqX8XzXM.e 7XkXE.w d *XtX0X0XtX XxXpX9XqXqXqXqXqXqXqXqXqXqXqXqXqXqXwX9X[.0XqXqXqX",
+"qX0XtX$X9XvX7XwXqX9XaXd.9 4X>X.X X% i.jX8X0XtX XxXpX9XqXqXqX0X8X0XqX0X9X8X9XqXqXqXwX9X[.0XqXqXqX",
+"qX0XtX$X9XvX7XwX9XsXZ.0 3 P /.n j G #XtX0X0XtX XxXpX9XqXqX0XuXgXuX0XrXfXjXdXqXqXqXwX9X[.0XqXqXqX",
+"qX0XtX$X9XvX7XwXqXwX6X<X4X,XwX6X>XuXyX0XqX0XtX XxXpX9XqX0XeXXXF..XyX>XJ.b.P.wXqXqXwX9X[.0XqXqXqX",
+"qX0XtX$X9XvX7XwXqXqXwXrXeXrXqXeXrX0X0XqXqX0XtX XxXpX9XqX0XyX<.X [ mXV., Q &.wXqXqXwX9X[.0XqXqXqX",
+"qX0XtX$X9XvX7XwXqXqXqX0X0X0XqXqX0XqXqXqXqX0XtX XxXpX9XqXqX8XgXQ ! NXN.1 { I.uX0XqXwX9X[.0XqXqXqX",
+"qX0XtX$X9XvX7XwXqXqXqXqXqXqXqXqXqXqXqXqXqX0XtX XxXpX9XqXqX8XnX! ] BX@XL.<.@ OXuX9XwX9X[.0XqXqXqX",
+"qX0XtX$X9XvX6XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0XrX|.xXpX9XqX0XwXOXv N ;XY.K.s.O oXiX9XwX9X[.0XqXqXqX",
+"qX0XtX%X9XnXqXyXtXtXtXtXtXtXtXtXtXtXtXtXtXrXpXXXxXpX9XqX9XpX<.V M w.(.H Z N.uX0XqXwX9X[.0XqXqXqX",
+"qX0XtX%X9XyX X@X+X+X+X+X+X+X+X+X+X+X+X+X+X+X#X/.cXpX9XqXqX0XsXhXjXpXuXjXjXsXqXqXqXwX9X[.0XqXqXqX",
+"qX0XtX=X$X3X&X=X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X=XCXuX0XqXqXqX9X8X8X9X0X8X8X9XqXqXqXwX9X[.0XqXqXqX",
+"qX0XrX-XoXuXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXeXSXyX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXwX9X[.0XqXqXqX",
+"qX0XtX=XOXtX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX9XAXyX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXwX9X[.0XqXqXqX",
+"qX0XrX=XOXtX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XAXyX9XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX9X[.0XqXqXqX",
+"qX0XrX-X+XrX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX9XAXiXqXeXwXwXwXwXwXwXwXwXwXwXwXwXwXeX0X[.0XqXqXqX",
+"qX0XtX=XoXuXwXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXmX#X}. X X X X X X X X X X X X X X X}.[.qXqXqXqX",
+"qXqXrX:XwXHXAXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXDXAXmXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMXMXNXmXqXqXqXqX",
+"qXqXqXqXrXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXeXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXeXqXqXqXqX",
+"qXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/fifteen-web.png b/icons/fifteen-web.png
new file mode 100644 (file)
index 0000000..49306d5
Binary files /dev/null and b/icons/fifteen-web.png differ
diff --git a/icons/fifteen.ico b/icons/fifteen.ico
new file mode 100644 (file)
index 0000000..2b7733e
Binary files /dev/null and b/icons/fifteen.ico differ
diff --git a/icons/fifteen.rc b/icons/fifteen.rc
new file mode 100644 (file)
index 0000000..2e92829
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "fifteen.ico"
diff --git a/icons/filling-16d24.png b/icons/filling-16d24.png
new file mode 100644 (file)
index 0000000..cb429bf
Binary files /dev/null and b/icons/filling-16d24.png differ
diff --git a/icons/filling-16d4.png b/icons/filling-16d4.png
new file mode 100644 (file)
index 0000000..d452613
Binary files /dev/null and b/icons/filling-16d4.png differ
diff --git a/icons/filling-16d8.png b/icons/filling-16d8.png
new file mode 100644 (file)
index 0000000..5627a09
Binary files /dev/null and b/icons/filling-16d8.png differ
diff --git a/icons/filling-32d24.png b/icons/filling-32d24.png
new file mode 100644 (file)
index 0000000..e495387
Binary files /dev/null and b/icons/filling-32d24.png differ
diff --git a/icons/filling-32d4.png b/icons/filling-32d4.png
new file mode 100644 (file)
index 0000000..1b41d00
Binary files /dev/null and b/icons/filling-32d4.png differ
diff --git a/icons/filling-32d8.png b/icons/filling-32d8.png
new file mode 100644 (file)
index 0000000..89feec4
Binary files /dev/null and b/icons/filling-32d8.png differ
diff --git a/icons/filling-48d24.png b/icons/filling-48d24.png
new file mode 100644 (file)
index 0000000..34b4e36
Binary files /dev/null and b/icons/filling-48d24.png differ
diff --git a/icons/filling-48d4.png b/icons/filling-48d4.png
new file mode 100644 (file)
index 0000000..4564da7
Binary files /dev/null and b/icons/filling-48d4.png differ
diff --git a/icons/filling-48d8.png b/icons/filling-48d8.png
new file mode 100644 (file)
index 0000000..5d30e31
Binary files /dev/null and b/icons/filling-48d8.png differ
diff --git a/icons/filling-base.png b/icons/filling-base.png
new file mode 100644 (file)
index 0000000..e5ee0ed
Binary files /dev/null and b/icons/filling-base.png differ
diff --git a/icons/filling-ibase.png b/icons/filling-ibase.png
new file mode 100644 (file)
index 0000000..79091a9
Binary files /dev/null and b/icons/filling-ibase.png differ
diff --git a/icons/filling-ibase4.png b/icons/filling-ibase4.png
new file mode 100644 (file)
index 0000000..e2693b3
Binary files /dev/null and b/icons/filling-ibase4.png differ
diff --git a/icons/filling-icon.c b/icons/filling-icon.c
new file mode 100644 (file)
index 0000000..53019f9
--- /dev/null
@@ -0,0 +1,527 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c #E2E2E2",
+".  c #DADADA",
+"X  c #DDDDDD",
+"o  c #DDDDDD",
+"O  c gainsboro",
+"+  c #DDDDDD",
+"@  c #DFDFDF",
+"#  c gray84",
+"$  c gray79",
+"%  c #CBCBCB",
+"&  c #CBCBCB",
+"*  c #CECECE",
+"=  c gray81",
+"-  c #CDCDCD",
+";  c #D7D7D7",
+":  c #E7E7E7",
+">  c #C5C5C5",
+",  c #A5A5A5",
+"<  c #E1E1E1",
+"1  c #D2D2D2",
+"2  c #BCBCBC",
+"3  c gray82",
+"4  c #D7D7D7",
+"5  c gray71",
+"6  c #9F9E9F",
+"7  c #B5B1B5",
+"8  c gray60",
+"9  c #767676",
+"0  c #A2A2A2",
+"q  c #9A9A9A",
+"w  c #868686",
+"e  c gray90",
+"r  c gray75",
+"t  c gray",
+"y  c gray64",
+"u  c #BCBCBC",
+"i  c #DADADA",
+"p  c #E7E7E7",
+"a  c #ECECEC",
+"s  c #DAD8DA",
+"d  c #DDE2DD",
+"f  c #90CE90",
+"g  c #CDD3CD",
+"h  c #ABA9AB",
+"j  c #ACACAC",
+"k  c #B7B7B7",
+"l  c gray63",
+"z  c gray88",
+"x  c #C1C1C1",
+"c  c gray72",
+"v  c gray73",
+"b  c gray78",
+"n  c #D5D5D5",
+"m  c gray90",
+"M  c #EAEAEA",
+"N  c #D4D3D4",
+"B  c #D7D9D7",
+"V  c #A8D2A8",
+"C  c #C5CAC5",
+"Z  c #A3A1A3",
+"A  c #B2B3B2",
+"S  c #B2B2B2",
+"D  c #9D9D9D",
+"F  c gray88",
+"G  c #C3C3C3",
+"H  c gray62",
+"J  c gray91",
+"K  c gray83",
+"L  c #B6B6B6",
+"P  c #CECECE",
+"I  c gray82",
+"U  c #BCBCBC",
+"Y  c #C7C6C7",
+"T  c #E8DCE8",
+"R  c #C3C1C3",
+"E  c gray49",
+"W  c gray62",
+"Q  c gray59",
+"!  c #888888",
+"~  c #E6E6E6",
+"^  c #C1C1C1",
+"/  c gray71",
+"(  c gray77",
+")  c gray79",
+"_  c #D0D0D0",
+"`  c gray89",
+"'  c #E7E7E7",
+"]  c gray82",
+"[  c #D6D8D6",
+"{  c #B0D1B0",
+"}  c #D8DBD8",
+"|  c #D0CFD0",
+" . c #E1E1E1",
+".. c #DFDFDF",
+"X. c #CDCDCD",
+"o. c gray90",
+"O. c gray75",
+"+. c #C3C3C3",
+"@. c #9F9F9F",
+"#. c gray75",
+"$. c #DFDFDF",
+"%. c #E7E7E7",
+"&. c gray93",
+"*. c #D8D7D8",
+"=. c #D8DDD8",
+"-. c #7DC17D",
+";. c #D5DCD5",
+":. c #DEDCDE",
+">. c #F3F4F3",
+",. c gray95",
+"<. c #D5D5D5",
+"1. c #E4E4E4",
+"2. c gray77",
+"3. c #8E8E8E",
+"4. c gray77",
+"5. c gray70",
+"6. c gray68",
+"7. c #D7D7D7",
+"8. c #D8D8D8",
+"9. c #C3C3C3",
+"0. c #CECDCE",
+"q. c #E0DEE0",
+"w. c #CECECE",
+"e. c #A7A7A7",
+"r. c #B9B9B9",
+"t. c #B4B4B4",
+"y. c #AEAEAE",
+"u. c #E6E6E6",
+"i. c gray77",
+"p. c #888888",
+"a. c #A9A9A9",
+"s. c gray64",
+"d. c gray53",
+"f. c gainsboro",
+"g. c gray86",
+"h. c #C6C6C6",
+"j. c gray81",
+"k. c gray84",
+"l. c gray77",
+"z. c #838383",
+"x. c #A9A9A9",
+"c. c gray65",
+"v. c gray53",
+"b. c #E4E4E4",
+"n. c #C0C0C0",
+"m. c #B2B2B2",
+"M. c gray63",
+"N. c gray72",
+"B. c #A5A5A5",
+"V. c #ECECEC",
+"C. c #EFEFEF",
+"Z. c gray86",
+"A. c #D8D8D8",
+"S. c #797979",
+"D. c gray78",
+"F. c #AFAFAF",
+"G. c #A7A7A7",
+"H. c #B2B3B2",
+"J. c #A5A5A5",
+"K. c #DFDFDF",
+"L. c #C3C3C3",
+"P. c #9A9A9A",
+"I. c #B2B2B2",
+"U. c #AEAFAE",
+"Y. c #919091",
+"T. c #D9DAD9",
+"R. c gray86",
+"E. c gray78",
+"W. c #CECECE",
+"Q. c #C1C1C1",
+"!. c gray75",
+"~. c gray58",
+"^. c #B4B4B4",
+"/. c #AFAFAF",
+"(. c #939393",
+"). c #E1E1E1",
+"_. c #C6C6C6",
+"`. c #747474",
+"'. c #A49FA4",
+"]. c #969496",
+"[. c #7B7C7B",
+"{. c #9B989B",
+"}. c #A09BA0",
+"|. c #898989",
+" X c gray57",
+".X c gray67",
+"XX c #898989",
+"oX c #6A6A6A",
+"OX c #A09EA0",
+"+X c #969396",
+"@X c #8B8B8B",
+"#X c #E6E5E6",
+"$X c #C1C2C1",
+"%X c #ADA8AD",
+"&X c #9EC89E",
+"*X c #AFC6AF",
+"=X c #CDC4CD",
+"-X c #B6CAB6",
+";X c #95C195",
+":X c #CAC5CA",
+">X c #C8C9C8",
+",X c #8E8E8E",
+"<X c #B2B3B2",
+"1X c #A7A2A7",
+"2X c #ACCDAC",
+"3X c #A7C5A7",
+"4X c #CDC7CD",
+"5X c #E3E4E3",
+"6X c #C1C2C1",
+"7X c #AAA6AA",
+"8X c #A0C9A0",
+"9X c #B1C7B1",
+"0X c #C8C0C8",
+"qX c #B0C5B0",
+"wX c #95BD95",
+"eX c #C7C2C7",
+"rX c gray78",
+"tX c gray58",
+"yX c gray70",
+"uX c #A29DA2",
+"iX c #ABC9AB",
+"pX c #A7C1A7",
+"aX c #C7C2C7",
+"sX c #E3E4E3",
+"dX c #CACACA",
+"fX c #7D7E7D",
+"gX c #A49EA4",
+"hX c #969396",
+"jX c #929492",
+"kX c #C4C1C4",
+"lX c #CAC5CA",
+"zX c gray64",
+"xX c #8E8E8E",
+"cX c gray65",
+"vX c #888888",
+"bX c #8D8D8D",
+"nX c #CAC7CA",
+"mX c #C1BEC1",
+"MX c #A5A6A5",
+"NX c gray89",
+"BX c gray90",
+"VX c #DAD9DA",
+"CX c #D5D6D5",
+"ZX c #D6D7D6",
+"AX c #DAD9DA",
+"SX c #E0E1E0",
+"DX c #DFE1DF",
+"FX c #DDDCDD",
+"GX c gray84",
+"HX c #D5D5D5",
+"JX c #D7D7D7",
+"KX c #DFDFDF",
+"LX c #E0E1E0",
+"PX c gray88",
+"IX c #DDDCDD",
+"UX c gray90",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+"> , < 1 2 3 4 5 6 7 8 9 0 q w e ",
+"r t y u i p a s d f g h j k l z ",
+"x c v b n m M N B V C Z A S D F ",
+"G H J K L P I U Y T R E W Q ! ~ ",
+"^ / ( ) _ ` ' ] [ { } |  ...X.o.",
+"O.+.@.#.$.%.&.*.=.-.;.:.>.,.<.1.",
+"2.3.4.5.6.7.8.9.0.q.w.e.r.t.y.u.",
+"i.p.a.s.d.f.g.h.j.k.l.z.x.c.v.b.",
+"n.m.M.N.B.V.C.Z.A.S.D.F.G.H.J.K.",
+"L.P.I.U.Y.T.R.E.W.Q.!.~.^./.(.).",
+"_.`.'.].[.{.}.|. X.XXXoXOX+X@X#X",
+"$X%X&X*X=X-X;X:X>X,X<X1X2X3X4X5X",
+"6X7X8X9X0XqXwXeXrXtXyXuXiXpXaXsX",
+"dXfXgXhXjXkXlXzXxXcXvXbXnXmXMXNX",
+"BXVXCXZXAXSXDXFXGXHXJXKXLXPXIXUX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 69 1 ",
+"  c #2B2B2B",
+". c gray14",
+"X c gray21",
+"o c gray23",
+"O c #444444",
+"+ c #4C4C4C",
+"@ c #545454",
+"# c #5B5B5B",
+"$ c #646464",
+"% c #6C6C6C",
+"& c #747474",
+"* c #7C7C7C",
+"= c #2C962C",
+"- c #2B982B",
+"; c #319A31",
+": c #44A144",
+"> c #55AC55",
+", c #5AA75A",
+"< c #5BAB5B",
+"1 c #64AB64",
+"2 c #6AAD6A",
+"3 c #60B060",
+"4 c #74AF74",
+"5 c #75B975",
+"6 c #7AB27A",
+"7 c #7BBA7B",
+"8 c #848484",
+"9 c #8D8D8D",
+"0 c #949494",
+"q c #9B9B9B",
+"w c #81BD81",
+"e c #8FB78F",
+"r c #96BD96",
+"t c #9CBD9C",
+"y c #A4A4A4",
+"u c #ACACAC",
+"i c #AEB0AE",
+"p c #B5B5B5",
+"a c #B6B8B6",
+"s c #BCBCBC",
+"d c #96C596",
+"f c #99C099",
+"g c #A3C4A3",
+"h c #A7CCA7",
+"j c #A8C3A8",
+"k c #B1C8B1",
+"l c #BBC3BB",
+"z c #BBCABB",
+"x c #C3BEC3",
+"c c #C3C4C3",
+"v c #C5CDC5",
+"b c #CCCCCC",
+"n c #C7D0C7",
+"m c #CDD2CD",
+"M c #D2CCD2",
+"N c #D4D3D4",
+"B c #D5DCD5",
+"V c #DBD6DB",
+"C c #DBDBDB",
+"Z c #DCE3DC",
+"A c #E0D7E0",
+"S c #E1DBE1",
+"D c #E4E4E4",
+"F c #E6EAE6",
+"G c #EAE7EA",
+"H c #EBEBEB",
+"J c #F1EEF1",
+"K c #F3F3F3",
+"L c #FCFCFC",
+/* pixels */
+"DGGDFDGFGFFDDGGHHHHHHHHGGHGGHGDD",
+"DDNDDDDDSCDDDDDbMNNNNNNCCBCCBZFG",
+"Ka#cpppaqyappps$@####@.@@@@#o*KD",
+"Kp%LDKHHbbKFGFHlDHJHHC#NNCNCq&KD",
+"Kp&KJ9aKcbGDDDHaCHhdGB#Nb&uDq&LD",
+"Kp%LaXqLcbHDDGHaCD:3ZC@mC%qD0&KS",
+"Kp%Lp+9KxbHDDDGaCG5>ZC@Mb@&D0&LD",
+"Kp%LKKGKbmKHHGKaDJGFJC#DCbbGy*KZ",
+"Ja$DmNNCpaCNNNNubNNNNbOqqqqy%&KD",
+"Ja#bssscyucsclcqacscca%&&&&*$qJD",
+"Ka&LHKGKbNKHHHKxDJKGHGcLLKKLDvHD",
+"Ka%KH$uLcbGDDDGaCH77GDpDDDDDMsHD",
+"Kp%Lu 9LcbHDFDHaCD:>BDpGGGSJNcHD",
+"Kp%Kc*qKsbHDDDGpCHd7ZDpDSSSSbsHD",
+"Kp*LLLLLNNKGHHKcDJKKHGcKLKJLDcHD",
+"Hso9***8%yvxcccqaccscx&*8848%qKD",
+"KsOq000q@9CmNbNybmNNNcO9000q$&KD",
+"Ka%HMcNH*yLGGGKxSKDbJC#DClNHy&KD",
+"Ka$ClOaD&qKDDDHaCG#&GC@bN@qD0&LD",
+"Ka$CN@yF&qKDDFHaZD++NC#mC$8G0&KD",
+"Ja$Ss&yD&qKDDDGaCHayGN@Mx40Cq&KD",
+"Ka%DNDCD*yLGJHKsDKKLKS#CVDCDq*KD",
+"Jc #@@@#oO$##$#+####$#.#@@@#o$KD",
+"Ka#caxxsyycacas0pascau+sxxxsuuHF",
+"Kp$DVgzCpaCNfmCubCbqCc@VMekAcpHD",
+"Kp$Sl;rAupCt-lCycB%oVl@NM2,AapJD",
+"Ka$Dr;4AppV6-tCybc#Xcc@Nb1<CapJD",
+"Kp$DVvvCpaNNzbVybCVaCb@NbivNlaHD",
+"Ja#cpssxyibbbbNqpsaxsi@bbMbbpuHD",
+"Jvo$#@##O8iyyyi#+####@+uyuyi8&KD",
+"DDGHHKHHGDGHHGHDHHGHHHFGGGGHGDDD",
+"DGDDDDDDGDFDDDDGDDFDDDDFDDDDFGDD"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 79 1 ",
+"  c #0C0C0C",
+". c #151515",
+"X c #1B1B1B",
+"o c #242424",
+"O c #2D2D2D",
+"+ c #323232",
+"@ c #3D3D3D",
+"# c #424242",
+"$ c #4B4B4B",
+"% c #535353",
+"& c #5D5D5D",
+"* c #646464",
+"= c #6B6B6B",
+"- c #747474",
+"; c #797979",
+": c #0A8A0A",
+"> c #128F12",
+", c #199219",
+"< c #269526",
+"1 c #2C992C",
+"2 c #349C34",
+"3 c #3B9D3B",
+"4 c #3BA13B",
+"5 c #44A344",
+"6 c #4AA44A",
+"7 c #4EA94E",
+"8 c #53A553",
+"9 c #51AA51",
+"0 c #59AE59",
+"q c #66AC66",
+"w c #6DAE6D",
+"e c #6DB56D",
+"r c #73AF73",
+"t c #74B074",
+"y c #76B876",
+"u c #7BB37B",
+"i c #848484",
+"p c #8A8A8A",
+"a c #949494",
+"s c #9B9B9B",
+"d c #85B685",
+"f c #84BE84",
+"g c #8CB98C",
+"h c #90BA90",
+"j c #9FBF9F",
+"k c #A4A4A4",
+"l c #A7A8A7",
+"z c #ABABAB",
+"x c #B4B4B4",
+"c c #B8B7B8",
+"v c #BCBCBC",
+"b c #95C695",
+"n c #9BC89B",
+"m c #A6C1A6",
+"M c #A3CBA3",
+"N c #ABC3AB",
+"B c #AFD0AF",
+"V c #B5C6B5",
+"C c #B9C7B9",
+"Z c #BCC8BC",
+"A c #B4D2B4",
+"S c #C3C3C3",
+"D c #CCCCCC",
+"F c #D1CFD1",
+"G c #D4D4D4",
+"H c #D7D8D7",
+"J c #DAD2DA",
+"K c #DADADA",
+"L c #DBE1DB",
+"P c #E7DDE7",
+"I c #E8DDE8",
+"U c #E5E5E5",
+"Y c #E7E9E7",
+"T c #E9E6E9",
+"R c #ECECEC",
+"E c #F2EBF2",
+"W c #F2F2F2",
+"Q c #FDF6FD",
+"! c #FBFBFB",
+/* pixels */
+"UUTUUUUUUUUUUYUTUUUUUUUUUUUYUUUYUYUYUUYUUUYUYUUY",
+"UUUUUYUYUUYUTUYUUYUYYUYUUYUUTUTUUUUUUTUYTUUUUUTU",
+"YUUURUUUUUUUUUYUUUUUUUURUUUUUUUUURUUUUUUUUYUUTUY",
+"UTYUGRERERRRRYTRRRERERRGURRRRRRRYGRERWRRRWYTYUUU",
+"YURSollkkkkkzpizkklkkkzOX++OOOO+O +++@+++@o-WUUT",
+"UYRSOLHHKGHHUczUHKKKHGLazvccccxZaollkskksx$=WUUU",
+"UUES+RYTU!RTRSvWYYYYYTElUWRWQQE!DOKKHTUHKR==!UUU",
+"YURS+YUTUiFYRZcWUUUUTURlHYUHbMURSOGDD;iGDK*=!UUU",
+"UUWSOYUWa xWRScRUUUTUURkKYE03MRRvOGDG=+GDL*=!UUU",
+"UURS+UEc%#aWRvcEUUYUUURlHRR1e5LWSOGDKv$KDP*=!UUT",
+"UUES+TRS=X-RRScEUUUUTURlHYEe97UWvOGFG*.sGK*=!UYU",
+"UYRS+YUY!DUYRZcWUUUUUURkHYUUBLTRvOGDDkszDU*=!LUU",
+"YUWS+RYYURYTWScWUYYYYTWlKRYYERYWSOLKHPUUGR==!UUU",
+"UURSOKKKKKKKUxxUKKKKKKUsDKKKKKHUcolllkklkx$=WUUY",
+"UURSollklkkkliilkllklkl;slkkklklao++++++++X;WUTU",
+"UUWS+RRRYRRRWDv!YRERRRWzKWRRRRRRUzWRRRRRR!SvWUUU",
+"YURSOUUUYEUURvcRUUUUUUYkGYUTUUUUKkYUUUUUURvcWUUU",
+"UUES+YUED+vRRZvWUUUUUURlKYRA0bTTKkRUUUUUURvvRUUU",
+"UUWSOYUYioxWRScRUUUUUURlHYE55nTTKkYUUUUTURZvWUUY",
+"YURS+YWl@O;WRvcEUUUUUURkHYT2y2LYKkRUUTUUUEvvWUUU",
+"UURS+TYGx$aWRSxWUUUUUURlHYRM7fTUKkRUUUUUURvcWUUU",
+"UURS+YUURRYURcxWPUUUUURlGTURUYUYKkUUUULPPRvcRUYU",
+"UUWS+!!!!!!W!FS!RRRERR!zUWWREREWUz!!!!!!W!GSRUUU",
+"YYRSX=-====--&iScvZvvcSixvcvvvvZx%--==-==;%aWYYU",
+"UURD.*&**&*&=O&DcvvcvcSizSvvvvvSs.**&&*&&=o*WUTU",
+"UUWSOYKUYYUKW-=!RRWRWR!zUWRE!WR!S+RUUYTUK!-=!UUU",
+"TURSODDDzxDSK**!UUUUUURkGYUYvSURZOFDDlxDDK&=!UUY",
+"UURSOGDG%+GDU==!LUUUUUEkGYWi#sYRvOGFF%+GDU*=!UUU",
+"YURSOGDGc#KDP=*!UUUUUURkHYRO%;URSOGDKx#KDL*=!KUT",
+"UURSODDGioxGL=*!UUUUUURlKYW$=+KWvOGDGioxDU*=!UYU",
+"TURSODGD;&aGP*=!UTUUUURlGYRD-xYEvOGGD;&sGP*=!UUY",
+"UURSOGGDKLHDU**!LUUUUURkKYYRWRURvOGDFKLKSK*=!UUU",
+"UURSOHGGGGGFR==!TRRRERWlUWRRYYR!SOKGGFGGGT==!UUU",
+"YURD O+OOOOO+..@+++++++oO+++++++O +O+OOOO+ #EUUU",
+"UURSozllllllxppzllklllz;slllkklzpozllllllzpaRUUU",
+"UUWSOKHKHIKHPxzUHHKTKGUsDKKGUUKLx+KGHPIKHUxxWUUU",
+"YURSOGDFDrCFGzkGDFxtFDGaSGDGiaGGlOGDDurZDGzzWUUY",
+"UUWSOGDJd:jGGzlHFF5<FDKaSFKxX*PGzOGFDg<dHHzzRUUU",
+"TURSOFGm53dJGzlGJr72ZFGaSGD$$%GGzOGDGV1dJGlzWUUY",
+"UURSoGGNq,qJHzlHFh8>mGGaSGS;++DHzOGFCw2uJKzzEUUU",
+"YUWSOGDFPVDDGllHDJGVGDJaSGDKDvGGzOGFDmNGDHlzEUUU",
+"UUESOKKGGJKGUxzKGDFJGFHsDKKGKKGUxOHGGJJGGKzxWUUU",
+"UURSolkkkkkklpsDSSSSSZDisllkkkkliOSSSSSSSDsaWUYU",
+"YURD O++++OO+.$saaaaaasoo+O+OO++oXaaaaaaas$@WUUU",
+"UYUUGRRYRRRYEKKEYYRRRYRGURYRRRRRYGRYYRRYRRKKYUUT",
+"UUUURUUUUUUUUYYUUUUUUUURUUUUUUUUYRUUUUUUUUYYUUUU",
+"UUUYUUUUTUUYYUUYUTUYUUUUUUTUUUTUTUUUUUTUUTUUUYYU",
+"YTUUTUYUYUTUUUUUYUUUTUUYUTUUUYUUUUUYYUUUUUYUUUTU"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/filling-web.png b/icons/filling-web.png
new file mode 100644 (file)
index 0000000..bf413f9
Binary files /dev/null and b/icons/filling-web.png differ
diff --git a/icons/filling.ico b/icons/filling.ico
new file mode 100644 (file)
index 0000000..9534dfc
Binary files /dev/null and b/icons/filling.ico differ
diff --git a/icons/filling.rc b/icons/filling.rc
new file mode 100644 (file)
index 0000000..095a2ae
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "filling.ico"
diff --git a/icons/flip-16d24.png b/icons/flip-16d24.png
new file mode 100644 (file)
index 0000000..a0f9366
Binary files /dev/null and b/icons/flip-16d24.png differ
diff --git a/icons/flip-16d4.png b/icons/flip-16d4.png
new file mode 100644 (file)
index 0000000..8f6f09e
Binary files /dev/null and b/icons/flip-16d4.png differ
diff --git a/icons/flip-16d8.png b/icons/flip-16d8.png
new file mode 100644 (file)
index 0000000..a0f9366
Binary files /dev/null and b/icons/flip-16d8.png differ
diff --git a/icons/flip-32d24.png b/icons/flip-32d24.png
new file mode 100644 (file)
index 0000000..b87f342
Binary files /dev/null and b/icons/flip-32d24.png differ
diff --git a/icons/flip-32d4.png b/icons/flip-32d4.png
new file mode 100644 (file)
index 0000000..d5857bf
Binary files /dev/null and b/icons/flip-32d4.png differ
diff --git a/icons/flip-32d8.png b/icons/flip-32d8.png
new file mode 100644 (file)
index 0000000..b87f342
Binary files /dev/null and b/icons/flip-32d8.png differ
diff --git a/icons/flip-48d24.png b/icons/flip-48d24.png
new file mode 100644 (file)
index 0000000..516ad55
Binary files /dev/null and b/icons/flip-48d24.png differ
diff --git a/icons/flip-48d4.png b/icons/flip-48d4.png
new file mode 100644 (file)
index 0000000..401171d
Binary files /dev/null and b/icons/flip-48d4.png differ
diff --git a/icons/flip-48d8.png b/icons/flip-48d8.png
new file mode 100644 (file)
index 0000000..516ad55
Binary files /dev/null and b/icons/flip-48d8.png differ
diff --git a/icons/flip-base.png b/icons/flip-base.png
new file mode 100644 (file)
index 0000000..1b4a61b
Binary files /dev/null and b/icons/flip-base.png differ
diff --git a/icons/flip-ibase.png b/icons/flip-ibase.png
new file mode 100644 (file)
index 0000000..6fd18c0
Binary files /dev/null and b/icons/flip-ibase.png differ
diff --git a/icons/flip-ibase4.png b/icons/flip-ibase4.png
new file mode 100644 (file)
index 0000000..b3d5538
Binary files /dev/null and b/icons/flip-ibase4.png differ
diff --git a/icons/flip-icon.c b/icons/flip-icon.c
new file mode 100644 (file)
index 0000000..1d572aa
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"A.N.N.N.M.Z.L.L.~.Y.F.U.P.I.P.D.",
+"N.] ~ ( Y d.nXiX`.5.7XUXHXJXVXP.",
+"N.~ / O.G g.gX7.E <.DXUXzXKXHXP.",
+"N.( O.e.P n.R.` O.[.FXJX>XAXGXP.",
+"M.Y H Y V 0.%...U.zXVXUXJXUXGXI.",
+"Z.f.s.p.y.l._.jXSX3X0XCXFXFX7XF.",
+"L.cXBXAXPXhXNX,Xd.X.3XlX[.1.5.Y.",
+"L.pXpXrXBXdX:X&.~ d.SXY.o.L _.~.",
+"J.dXMX8XsXcXg.~ &.,XkX+.] 3.aXL.",
+"H.mXIXMXAX0X..g.;XNXQ.[ S.wXdXJ.",
+"C.p.u.s.i.V.0XcXgXiX,XvXJXZXzXL.",
+"M.T J Y M i.AXdXZXCXvXUXHXUXGXI.",
+"N.( O.e.Y s.MX8XyXzXbXLX>XAXHXP.",
+"N.~ / O.J u.LXmXdXhXNXUXxXKXHXP.",
+"N.] ~ ( T p.MXfXsXaXzXJXJXJXVXP.",
+"A.N.N.N.M.C.H.J.L.K.L.I.P.I.P.D."
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"S.S.F.F.F.F.F.F.F.F.F.A.Z.Z.Z.Z.Z.Z.V.C.S.Z.Z.Z.Z.Z.Z.Z.Z.Z.S.S.",
+"S.A.M.M.M.M.M.M.M.M.M.G.P.L.L.K.J.K.W.E.D.I.I.I.I.I.I.I.I.I.D.S.",
+"F.M.( ! ~ ~ ^ ~ ~ / Y |.bXfXfXlXmXkX$X0.J.UXJXKXKXJXKXKXLXFXI.Z.",
+"F.M.! R W E T E W Q L .XBXlXVXuXW.1.U Q 2XUXUXUXUXUXUXUXUXKXI.Z.",
+"F.M.~ W E Q { ~ R ! P  XNXdXb.+.W P K k.zXJXUXUXHXMXKXUXUXKXI.Z.",
+"F.M.~ E Q  .=.o.! Q P }.GX`.L #.=.' T *XjXJXUXLXkXyXZXUXUXKXI.Z.",
+"F.M.^ T { =.D.1.| W P |.ZXq.{ z.z.{ 4.xXpXKXUXbX7XC.CXUXUXKXI.Z.",
+"F.M.~ E ~ o.1.#.^ Q L @X8XE ] <.>.U Q.VXuXLXUXHXfX7XZXUXUXKXI.Z.",
+"F.M.~ W R ! | ^ R ! K *XD.J Y Q ] q.aXxXpXLXUXUXFXbXJXUXUXKXI.Z.",
+"F.M./ Q ! Q W Q ! ! T )...D ..n.<XmXxXkXpXLXUXUXUXUXUXUXUXJXI.Z.",
+"F.M.Y L P P P P P I Y q.:.E.tXmXxXsXfXbXdXHXPXLXLXKXJXJXUXKXI.Z.",
+"A.G.|..X X XXXXX}._.!.'.iXgXtX0XtXgXpX(.U.dXpXpXuXpXjXzX3XK.S.S.",
+"Z.P.bXBXBXNXvXkXcXPXvXrXbXjXmXVXaX/.3.T /.bXkXxXVXcX*Xk.Q 0.E.C.",
+"Z.L.fXlXsXyXsXSXUXIXrXeXlXxX1XM...K S 2.iXfXxXaX!.5.T J U $XW.V.",
+"Z.L.jXjXgXAXcXCXUXNXtXtXmX1X! ( } / K ^.gXsXmXq.U { ` I 1.kXK.Z.",
+"Z.K.jXdXjXfX/.qXVXhXdXwXVXm.( a.u.} ..pXtXxX1X] >.z.[ G Q.mXJ.Z.",
+"Z.L.gXdXVXpX/.tXxXaXhXyXpX..} u.a.( m.VX0XmXn.Q <.x._ ` pXkXK.Z.",
+"Z.P.iXcXUXSXcXCXlXfXgXgX^.K / } ( ! <XmXtXyX..Y ] [ K n.BXfXL.Z.",
+"Z.P.eXHXUXGXgXyXpXlXdXiX2.D K  .n.<XxXjXgX!.G K W w.'.gXxXgXL.Z.",
+"A.H.lXUXnXkXcXNXBXMXAX).Y 2.~.pXVXmXlXnXuX#._ m.<XbXBXzXzXjXL.Z.",
+"S.A.~._.[.XXXX X X XoXF.).iXgXyXwXtXeXwXXXK.0XzXhXiXuXpXaXyXK.Z.",
+"F.M.Y P I P P P P I S oXAXdXgXhXdXyXyXkX5XPXUXJXKXKXLXLXPXGXI.Z.",
+"F.M.^ W ! Q W Q ! ~ I  XMXlXgXaXhXBXUXCXqXPXUXUXUXUXUXUXUXKXI.Z.",
+"F.M.~ W R ! | ^ R ! P  XBXpXlXcXBXUXUXfXyXPXUXUXFXbXJXUXUXKXI.Z.",
+"F.M.~ E ~ o.1.#.^ Q P  XNXyXCXtXqXCXSXiXsXLXUXHXfX7XZXUXUXKXI.Z.",
+"F.M.^ T { =.D.1.| W P XXcXfXcX(./.cXdXgXaXKXUXbX7XC.CXUXUXKXI.Z.",
+"F.M.~ E Q  .=.o.! Q P XXjXDXSXpXfXAXiXzXpXLXUXLXkXyXZXUXUXKXI.Z.",
+"F.M.~ W E Q { ~ R ! I [.vXUXUXVXlXgXdXxXpXLXUXUXHXMXKXUXUXKXI.Z.",
+"F.M.! R W E T E W W P _.PXKXvXfXsXjXxXzXaXLXUXUXUXUXUXUXUXKXI.Z.",
+"F.M.( ! ~ ~ ^ ~ ~ ^ Y ~.cXeXiXgXjXjXgXjXyXGXLXKXKXJXKXKXLXFXI.Z.",
+"S.A.M.M.M.M.M.M.M.M.M.A.G.P.P.L.K.L.L.L.K.I.I.I.I.I.I.I.I.I.D.S.",
+"S.S.F.F.F.F.F.F.F.F.F.S.A.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.S.S."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.",
+"S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.A.S.D.S.S.S.S.S.S.S.S.S.S.S.S.D.D.D.D.D.D.D.D.D.D.D.D.D.S.S.S.S.",
+"S.S.S.S.F.F.F.F.F.F.F.F.F.F.F.F.F.A.Z.Z.Z.Z.Z.Z.Z.Z.Z.C.V.C.S.C.C.C.C.C.C.C.C.C.C.C.C.C.S.S.S.S.",
+"S.S.S.A.m.n.m.m.m.m.m.m.m.m.m.m.n.H.I.P.P.P.P.P.P.L.K.I.!.T.S.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.D.S.S.S.",
+"S.S.F.m.^ Q ! ! ! ! ! ! ! ! ! ~ Y oXnXgXjXjXjXgXgXxXmXfX X6.S.UXLXLXPXPXPXPXPXPXPXLXPXJXY.C.D.S.",
+"S.S.F.n.Q E W E E W W W E E W Q I OXNXkXzXkXzXMXNXqXL.=.P / =XPXUXUXUXUXUXUXUXUXUXUXUXPXY.C.D.S.",
+"S.S.F.m.! W W W W E T E W W W Q U oXMXjXkXMXlX+Xs.` K Y K z.aXGXUXUXUXUXUXUXUXUXUXIXUXLXY.C.D.S.",
+"S.S.F.m.! E W W W (  .) W W W Q I OXMXjXxX(.,.] ^ E ~ ! R *XpXGXUXUXIXUXDXcXFXUXUXUXUXPXY.C.D.S.",
+"S.S.F.m.! E W W I O.| +.U E W Q I OXmXcX2XP R +.@.) T I 1.cXwXHXUXUXIXUXgXbXhXUXIXUXUXPXY.C.D.S.",
+"S.S.F.m.! W E ( O.2.3.3.O.) E Q I OXnXmXM.) :.5.4.*...K Q.VX0XJXUXUXSXjX5X2XpXUXIXUXUXPXY.C.D.S.",
+"S.S.F.m.! W T  .| 3.'.7.{ X.T ! I oXBXuXo.#.' K.K.' #. .yXbXqXJXUXUXzXmX>X0.5XUXPXUXUXPXY.C.D.S.",
+"S.S.F.m.! W E ) +.3.7.3.+._ E Q I .XFX~.L o.*.8.8.;.` b.NXlXwXJXUXUXAXhX4X;XiXUXIXUXUXPXY.C.D.S.",
+"S.S.F.m.! E W W U O.{ +.U E W Q I oXBX2.P T _ +.O.Q L <XbXzXwXJXUXUXIXUXgXmXhXUXIXUXUXPXY.C.D.S.",
+"S.S.F.m.! E W W E ) X._ E Q W Q P &X3XR Q ~ W ) ] %.R.zXkXxXwXJXUXUXIXUXAXzXDXUXUXUXUXPXY.C.D.S.",
+"S.S.F.m.! W W W W E T E W W W Q P =XB.J R K ^ q.[.gXMXlXkXxXwXHXUXUXUXUXUXUXUXUXUXUXUXLXY.C.D.S.",
+"S.S.F.m.~ Q Q Q Q Q ! Q Q Q Q Q E /.| J @.C.4XmXBXxXlXzXzXxXwXJXUXUXUXUXUXUXUXUXUXUXUXLXY.C.D.S.",
+"S.A.F.n.Y I U I I I I I I I Y Y W r.<.Q.rXcXlXsXsXdXdXaXdXvXrXAXKXHXJXJXJXJXJXHXGXGXIXPXY.C.D.S.",
+"S.S.A.H.oXOXoXOXOXoXoXoX@X@X|.).T.`.eXuX0X6X7X8X7X7XqXiX0XE.G.rXwXwXwXwXwXqX0XwXpXaX-XS.S.S.S.S.",
+"S.D.Z.I.nXNXMXMXMXNXVXNXlXaXgXJXsX5XMXlXxXxXzXxXNXVXpX~.3.Q R.vXxXxXxXzXlXvXVXvX=Xx.( 5.T.C.S.S.",
+"S.S.Z.P.gXkXjXkXzXfXeX9XdXZXUXLX5X8XxXkXkXzXMXcX:Xv.} P D 2.0XdXzXkXkXbXNXuX~.2.E K P |.!.V.S.S.",
+"S.S.Z.P.jXlXzXhXqXyXcXPXUXIXUXxX0XqXxXkXxXsX_.8.Q J T ^ P !.iXaXzXlXzX<Xn...K P Q T *.dXI.C.S.S.",
+"S.S.Z.P.jXzXlX0XFXbXdXxXUXIXUXtXaX9XxXzXsX;.P X.%./ W T } iXqXdXkXMXE.L ` #.X.E ~ K K.MXK.Z.S.S.",
+"S.S.Z.P.jXcXiXgXIXyXCXuXSXUXBXeXhX8XzXMX).P +.O.X.o./ J c.VX7XdXxXhX&.W ;.] @.R E ` 0XxXL.Z.S.S.",
+"S.S.Z.P.jXxXrXjXlX2Xm.>XkXMXfXdXgX8XxXcX7.X.O.M.M.X.%.W ;XNX7XsXBX{.] O.8.K.,.T L d.MXhXP.Z.S.S.",
+"S.S.Z.P.kXfXsXBXjX2Xm.>XzXjXtXxXdX7XNX;XQ %.X.M.M.O.X.7.xXxX8XsXMXw.) +.7.K.,.U E @XMXgXP.Z.S.S.",
+"S.S.Z.P.zXeXmXUXDXuXCXyXPXjXuXvXdX7XVXc.J / o.X.O.@.P ).MXzX7XlX5X^ W _ *.] %.H >.lXzXjXP.Z.S.S.",
+"S.S.Z.I.hXeXIXIXUXcXdXvXHX0XlXxXdXqXiX} T E / %.X.P -.sXzXxX6XvXA.K ~ T o.#._ U (.MXkXjXP.Z.S.S.",
+"S.S.Z.Y.tXkXUXIXUXPXbXuX0XgXzXzXaXiX!.P ^ T J W 6.(.aXxXkXxX0XtX#.R Q P L X.m.1XxXkXzXjXP.Z.S.S.",
+"S.S.Z.U.8XHXUXSXfX0XwXdXzXkXjXkXsX0X2.D L { x.-XxXNXzXkXkXlXuX^.K L E 3.^.iXNXbXkXkXlXjXP.Z.S.S.",
+"S.S.A.F.gXJXhXpXkXMXVXNXMXMXMXMXVXE.W 1.Q.uXVXNXxXzXxXxXxXMXeX=._ c.-XvXVXvXlXzXxXxXcXlXI.Z.S.S.",
+"S.S.S.A.Q.(.}.@X@XoXoXoXOXOXoXoX+XA.E.9XiXwX7X7X8X8X9XqX9X4X{.Z.:XaXpXwX0XqXwXwXwXwXeXqXL.Z.S.S.",
+"S.S.F.m.T Y Y I I I I I I I U Y G +XVXsXaXdXdXdXgXhXaX0X6XuX$XKXIXGXGXHXJXJXJXJXJXHXJXFXY.C.D.S.",
+"S.S.F.m.~ W Q Q Q Q ! Q Q Q Q ! Y oXMXkXzXzXvXxXdXrXyXvXUXCX<XKXUXUXUXUXUXUXUXUXUXUXUXPXY.C.D.S.",
+"S.S.F.m.! W W W W E T E W W W Q U oXMXjXzXlXuXtXgXCXUXUXUXuX8XJXUXUXUXUXUXUXUXUXUXUXUXLXY.C.D.S.",
+"S.S.F.m.! E W W E ) X._ E Q W Q I OXMXkXgX0XkXkXNXIXIXUXZXeXtXHXUXUXIXUXAXzXDXUXUXUXUXPXY.C.D.S.",
+"S.S.F.m.! E W W U O.{ +.U E W Q I OXMXzXqXAXDXzXkXZXUXUXdXsXrXHXUXUXIXUXgXmXhXUXIXUXUXPXY.C.D.S.",
+"S.S.F.m.! W E ) +.3.7.3.+._ E Q I oXNXfXyXvXyX:X>XuXcXLXqXcXwXJXUXUXAXhX4X;XiXUXIXUXUXPXY.C.D.S.",
+"S.S.F.m.! W T  .| 3.'.7.{ X.T ! I oXVXeXcXdXCXm.m.CXdXxXtXbXwXJXUXUXzXmX>X0.5XUXPXUXUXPXY.C.D.S.",
+"S.S.F.m.! W E ( O.2.3.3.O.) E Q I oXNX9XPXbXuX2X2XyXnXyXgXcXwXJXUXUXSXjX5X2XpXUXIXUXUXPXY.C.D.S.",
+"S.S.F.m.! E W W I O.| +.U E W Q I @XkXsXUXUXZXjXlXFXZXqXxXzXwXJXUXUXIXUXgXbXhXUXIXUXUXPXY.C.D.S.",
+"S.S.F.m.! E W W W (  .) W W W Q I @XpXZXUXIXUXVXlXhX9XhXlXxXwXJXUXUXIXUXDXcXFXUXUXUXUXPXY.C.D.S.",
+"S.S.F.m.! W W W W E T E W W W Q Y |.fXUXUXIXBXdXrXiXlXzXkXxXwXHXUXUXUXUXUXUXUXUXUXIXUXLXY.C.D.S.",
+"S.S.F.n.Q E W E E W W W E E W W Y (.HXLXzXrXeXfXxXcXzXlXlXcXeXHXUXUXUXUXUXUXUXUXUXUXUXPXY.C.D.S.",
+"S.S.F.m.^ Q ! ! ! ! ! ! ! ! ! ~ T W.jX8XtXhXzXkXjXjXjXjXjXlXqXFXIXLXPXPXPXPXPXPXPXLXPXJXY.C.D.S.",
+"S.S.S.A.m.n.m.m.m.m.m.m.m.m.m.m.m.A.F.U.Y.I.P.P.P.P.P.P.P.I.L.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.D.S.S.S.",
+"S.S.S.S.F.F.F.F.F.F.F.F.F.F.F.F.F.S.A.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.C.C.C.C.C.C.C.C.C.C.C.C.C.S.S.S.S.",
+"S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.D.D.D.D.D.D.D.D.D.D.D.D.D.S.S.S.S.",
+"S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/flip-web.png b/icons/flip-web.png
new file mode 100644 (file)
index 0000000..c9836bb
Binary files /dev/null and b/icons/flip-web.png differ
diff --git a/icons/flip.ico b/icons/flip.ico
new file mode 100644 (file)
index 0000000..9b6b1c4
Binary files /dev/null and b/icons/flip.ico differ
diff --git a/icons/flip.rc b/icons/flip.rc
new file mode 100644 (file)
index 0000000..003643c
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "flip.ico"
diff --git a/icons/flood-16d24.png b/icons/flood-16d24.png
new file mode 100644 (file)
index 0000000..63025bd
Binary files /dev/null and b/icons/flood-16d24.png differ
diff --git a/icons/flood-16d4.png b/icons/flood-16d4.png
new file mode 100644 (file)
index 0000000..f95cb62
Binary files /dev/null and b/icons/flood-16d4.png differ
diff --git a/icons/flood-16d8.png b/icons/flood-16d8.png
new file mode 100644 (file)
index 0000000..dc7d4ac
Binary files /dev/null and b/icons/flood-16d8.png differ
diff --git a/icons/flood-32d24.png b/icons/flood-32d24.png
new file mode 100644 (file)
index 0000000..c8ca42d
Binary files /dev/null and b/icons/flood-32d24.png differ
diff --git a/icons/flood-32d4.png b/icons/flood-32d4.png
new file mode 100644 (file)
index 0000000..14fb3b3
Binary files /dev/null and b/icons/flood-32d4.png differ
diff --git a/icons/flood-32d8.png b/icons/flood-32d8.png
new file mode 100644 (file)
index 0000000..ad2d213
Binary files /dev/null and b/icons/flood-32d8.png differ
diff --git a/icons/flood-48d24.png b/icons/flood-48d24.png
new file mode 100644 (file)
index 0000000..4725c48
Binary files /dev/null and b/icons/flood-48d24.png differ
diff --git a/icons/flood-48d4.png b/icons/flood-48d4.png
new file mode 100644 (file)
index 0000000..f0fb909
Binary files /dev/null and b/icons/flood-48d4.png differ
diff --git a/icons/flood-48d8.png b/icons/flood-48d8.png
new file mode 100644 (file)
index 0000000..3d951c3
Binary files /dev/null and b/icons/flood-48d8.png differ
diff --git a/icons/flood-base.png b/icons/flood-base.png
new file mode 100644 (file)
index 0000000..02a6e76
Binary files /dev/null and b/icons/flood-base.png differ
diff --git a/icons/flood-ibase.png b/icons/flood-ibase.png
new file mode 100644 (file)
index 0000000..02a6e76
Binary files /dev/null and b/icons/flood-ibase.png differ
diff --git a/icons/flood-ibase4.png b/icons/flood-ibase4.png
new file mode 100644 (file)
index 0000000..f3ca3a9
Binary files /dev/null and b/icons/flood-ibase4.png differ
diff --git a/icons/flood-icon.c b/icons/flood-icon.c
new file mode 100644 (file)
index 0000000..ca42a1d
--- /dev/null
@@ -0,0 +1,719 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 240 2 ",
+"   c #D5D5D5",
+".  c #D0CFC9",
+"X  c #CFCEC4",
+"o  c #CFCEC5",
+"O  c #CFCEC5",
+"+  c #CFCEC5",
+"@  c #CFCEC5",
+"#  c #CFCEC5",
+"$  c #CFCEC5",
+"%  c #D0CEC4",
+"&  c #C9CCCF",
+"*  c #C3CBD2",
+"=  c #CCCAD2",
+"-  c #D3C3D2",
+";  c #D2C9D2",
+":  c #D5D6D5",
+">  c #5663BC",
+",  c #4153DA",
+"<  c #4657D4",
+"1  c #4557D6",
+"2  c #4657D4",
+"3  c #4958D1",
+"4  c #4857D2",
+"5  c #4758D4",
+"6  c #3B53DA",
+"7  c #9B694A",
+"8  c #E9781D",
+"9  c #739029",
+"0  c #0DDB1D",
+"q  c #47C046",
+"w  c #D8CFD8",
+"e  c #CFCEC5",
+"r  c #4254D5",
+"t  c #2945FF",
+"y  c #2F49FD",
+"u  c #2F49FF",
+"i  c #2C49FF",
+"p  c #1E45FF",
+"a  c #2145FF",
+"s  c #314BFE",
+"d  c #2043FF",
+"f  c #AE6836",
+"g  c #FF8000",
+"h  c #74A005",
+"j  c green",
+"k  c #2DDC29",
+"l  c #D9CBD9",
+"z  c #4657D4",
+"x  c #2F49FF",
+"c  c #364DF7",
+"v  c #334DFF",
+"b  c #4349C8",
+"n  c #8D585A",
+"m  c #7D536A",
+"M  c #3549EB",
+"N  c #2F4BFF",
+"B  c #5E4E92",
+"V  c #885471",
+"C  c #476277",
+"Z  c #0C8870",
+"A  c #3E877B",
+"S  c #D7D2D3",
+"D  c #4557D5",
+"F  c #2F49FF",
+"G  c #334DFA",
+"H  c #2149FF",
+"J  c #504EA9",
+"K  c #FF8E00",
+"L  c #E37F0B",
+"P  c #3447E2",
+"I  c #334DFF",
+"U  c #2B4AFD",
+"Y  c #2349FF",
+"T  c #2D4AFE",
+"R  c #283FFF",
+"E  c #4A5ADE",
+"W  c #D6D5CB",
+"Q  c #4349C8",
+"!  c #544EAE",
+"~  c #654474",
+"^  c #E05300",
+"/  c #C34D0D",
+"(  c #3345E1",
+")  c #324DFF",
+"_  c #364BF7",
+"`  c #354EFF",
+"'  c #4041CB",
+"]  c #522E9F",
+"[  c #65509F",
+"{  c #D4D6D0",
+"}  c #4858D2",
+"|  c #1F45FF",
+" . c #895964",
+".. c #FF8E00",
+"X. c #D95505",
+"o. c #F80000",
+"O. c #E20407",
+"+. c #3445E2",
+"@. c #3350FF",
+"#. c #364CF9",
+"$. c #2454FF",
+"%. c #7B2677",
+"&. c red",
+"*. c #DB2A2D",
+"=. c #CBD9D9",
+"-. c #CFCEC5",
+";. c #4858D2",
+":. c #2146FF",
+">. c #7D536A",
+",. c #F37E00",
+"<. c #C34D0C",
+"1. c #E90000",
+"2. c #D30807",
+"3. c #323CCC",
+"4. c #3045ED",
+"5. c #3642DE",
+"6. c #2948F2",
+"7. c #71246C",
+"8. c #F10000",
+"9. c #C6302F",
+"0. c #CDD8D8",
+"q. c #4557D5",
+"w. c #2E49FF",
+"e. c #3549E9",
+"r. c #2D46EE",
+"t. c #524698",
+"y. c #F07300",
+"u. c #D1650B",
+"i. c #6F0695",
+"p. c #6902B1",
+"a. c #AA0828",
+"s. c #FB0000",
+"d. c #6B5C08",
+"f. c #00F500",
+"g. c #32C62C",
+"h. c #D8CDD8",
+"j. c #4557D5",
+"k. c #2E49FF",
+"l. c #364EFA",
+"z. c #2A4CFF",
+"x. c #564DA9",
+"c. c #FF8400",
+"v. c #E57408",
+"b. c #7E0497",
+"n. c #7800B4",
+"m. c #C00423",
+"M. c #756404",
+"N. c #2DDA29",
+"B. c #CFCEC5",
+"V. c #4559D3",
+"C. c #2D4CFF",
+"Z. c #344DF9",
+"A. c #324CFF",
+"S. c #3949DF",
+"D. c #5B4F9F",
+"F. c #544CA7",
+"G. c #3B35C8",
+"H. c #3A29D4",
+"J. c #31782E",
+"K. c #3BB400",
+"L. c #297544",
+"P. c #1861B0",
+"I. c #41759B",
+"U. c #D7D3D0",
+"Y. c #CFCFC5",
+"T. c #484ED5",
+"R. c #323BFF",
+"E. c #3649FD",
+"W. c #344DFF",
+"Q. c #2F4BFF",
+"!. c #1C3EFF",
+"~. c #2041FF",
+"^. c #3054FE",
+"/. c #3243FF",
+"(. c #0BB63A",
+"). c #198A67",
+"_. c #3824FF",
+"`. c #5155DA",
+"'. c #D6D6CB",
+"]. c #D1CBCC",
+"[. c #348078",
+"{. c #118B6D",
+"}. c #285FB3",
+"|. c #3347FF",
+" X c #3F54CD",
+".X c #818A6A",
+"XX c #737D79",
+"oX c #354CEB",
+"OX c #3044FF",
+"+X c #4E7D37",
+"@X c #71AE00",
+"#X c #3A8132",
+"$X c #0B8579",
+"%X c #3C8B79",
+"&X c #D7D2D3",
+"*X c #D2C5D2",
+"=X c #22D325",
+"-X c #188673",
+";X c #2733FF",
+":X c #5166A5",
+">X c yellow",
+",X c #E3E40A",
+"<X c #3247E1",
+"1X c #1D42FF",
+"2X c #AE5E34",
+"3X c #FF6F00",
+"4X c #749905",
+"5X c #2DDC29",
+"6X c #D2C9D2",
+"7X c #45BF49",
+"8X c #21E81A",
+"9X c #3D897D",
+"0X c #4A52F6",
+"qX c #6573A0",
+"wX c #E1E121",
+"eX c #C7C834",
+"rX c #505FC9",
+"tX c #435BE7",
+"yX c #A3734E",
+"uX c #F08421",
+"iX c #7A992E",
+"pX c #15E326",
+"aX c #4EC74E",
+"sX c #D8CFD8",
+"dX c #D8CFD8",
+"fX c #D9CADA",
+"gX c #D7D2D3",
+"hX c #D6D6CA",
+"jX c #D4D3D0",
+"kX c #CBCBD9",
+"lX c #CDCDD8",
+"zX c #D6D5CD",
+"xX c #D7D5CB",
+"cX c #D0D3D6",
+"vX c #CAD2D9",
+"bX c #D3D0D8",
+"nX c #DACAD9",
+"mX c #D8CFD8",
+"MX c #D5D6D5",
+"NX c white",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+". > , < 1 2 3 4 5 6 7 8 9 0 q w ",
+"e r t y u i p a s d f g h j k l ",
+"o z x c v b n m M N B V C Z A S ",
+"O D F G H J K L P I U Y T R E W ",
+"+ 2 i Q ! ~ ^ / ( ) _ ` ' ] [ { ",
+"@ } |  ...X.o.O.+.@.#.$.%.&.*.=.",
+"-.;.:.>.,.<.1.2.3.4.5.6.7.8.9.0.",
+"O q.w.e.r.t.y.u.i.p.a.s.d.f.g.h.",
+"O j.k.l.z.x.c.v.b.n.m.&.M.j N.l ",
+"B.V.C.Z.A.S.D.F.G.H.J.K.L.P.I.U.",
+"Y.T.R.E.W.Q.!.~.^./.(.j )._.`.'.",
+"].[.{.}.|. X.XXXoXOX+X@X#X$X%X&X",
+"*X=Xj -X;X:X>X,X<X1X2X3X4Xj 5Xl ",
+"6X7X8X9X0XqXwXeXrXtXyXuXiXpXaXsX",
+": dXfXgXhXjXkXlXzXxXcXvXbXnXmXMX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 173 2 ",
+"   c #3B253C",
+".  c #6E291C",
+"X  c #6F003A",
+"o  c #574600",
+"O  c #645601",
+"+  c #5F1A58",
+"@  c #6F0D4D",
+"#  c #771B55",
+"$  c #603E46",
+"%  c #58007B",
+"&  c #0F6342",
+"*  c #0C7A51",
+"=  c #147263",
+"-  c #146663",
+";  c #5F505D",
+":  c #6A4855",
+">  c #744C55",
+",  c #784D54",
+"<  c #70474C",
+"1  c #5F6858",
+"2  c #737B55",
+"3  c #564165",
+"4  c #684964",
+"5  c #654563",
+"6  c #774E68",
+"7  c #4A7B68",
+"8  c #71636F",
+"9  c #777B68",
+"0  c #B60000",
+"q  c #A70105",
+"w  c #992300",
+"e  c #B62B01",
+"r  c #BE2A00",
+"t  c #C80207",
+"y  c #D30101",
+"u  c #DB0000",
+"i  c #E00000",
+"p  c #FE0101",
+"a  c #F60505",
+"s  c #AF5900",
+"d  c #B55902",
+"f  c #966030",
+"g  c #A56B31",
+"h  c #B27431",
+"j  c #CE6B03",
+"k  c #C56707",
+"l  c #D36B00",
+"z  c #DC6D02",
+"x  c #D16700",
+"c  c #D27100",
+"v  c #DF7300",
+"b  c #E06C00",
+"n  c #E06600",
+"m  c #E97200",
+"M  c #F67E07",
+"N  c #FB7D03",
+"B  c #860146",
+"V  c #A34242",
+"C  c #B54243",
+"Z  c #B77E43",
+"A  c #A87242",
+"S  c #05A204",
+"D  c #02A00C",
+"F  c #328C32",
+"G  c #2FA830",
+"H  c #31A331",
+"J  c #3BB63B",
+"K  c #26A226",
+"L  c #04C302",
+"P  c #03CA01",
+"I  c #09C804",
+"U  c #05C709",
+"Y  c #01D304",
+"T  c #01DD01",
+"R  c #00E401",
+"E  c #06F706",
+"W  c #01FE01",
+"Q  c #118258",
+"!  c #449E44",
+"~  c #42A342",
+"^  c #43B543",
+"/  c #42BB42",
+"(  c #619661",
+")  c #72A772",
+"_  c #A7A804",
+"`  c #BCBC3B",
+"'  c #F78604",
+"]  c #FE8302",
+"[  c #FF8A00",
+"{  c #D3D302",
+"}  c #C5C60A",
+"|  c #FEFE02",
+" . c #F6F708",
+".. c #A2A242",
+"X. c #B7B743",
+"o. c #3A198E",
+"O. c #1E38BB",
+"+. c #2335B0",
+"@. c #441A9A",
+"#. c #6B0093",
+"$. c #6E009A",
+"%. c #64009E",
+"&. c #433D8C",
+"*. c #4115A4",
+"=. c #7F01AF",
+"-. c #7B01BD",
+";. c #444B96",
+":. c #5E6388",
+">. c #414DA4",
+",. c #4752A3",
+"<. c #4853A3",
+"1. c #4151AB",
+"2. c #575DA8",
+"3. c #555EA3",
+"4. c #575FBA",
+"5. c #5A66B5",
+"6. c #5766BA",
+"7. c #2E3FC8",
+"8. c #2C3CC6",
+"9. c #293FD4",
+"0. c #2F3EDE",
+"q. c #243ADB",
+"w. c #1C39F0",
+"e. c #2434E3",
+"r. c #263DE0",
+"t. c #2E3DE0",
+"y. c #2F3DEB",
+"u. c #283BFF",
+"i. c #7E00C6",
+"p. c #2844C6",
+"a. c #2D42DB",
+"s. c #2941D8",
+"d. c #1944FF",
+"f. c #2643E0",
+"g. c #2C45EB",
+"h. c #2446FF",
+"j. c #2D47FF",
+"k. c #2649FF",
+"l. c #2B4AFF",
+"z. c #3149F6",
+"x. c #3443FF",
+"c. c #3840FE",
+"v. c #344DFE",
+"b. c #384DF8",
+"n. c #2652FF",
+"m. c #2C51FE",
+"M. c #3651FE",
+"N. c #3850FC",
+"B. c #3450F6",
+"V. c #8600AB",
+"C. c #8600B7",
+"Z. c #8A00C1",
+"A. c #D6D4C7",
+"S. c #D6D5CC",
+"D. c #D7CFD7",
+"F. c #DAC7DA",
+"G. c #D9CAD9",
+"H. c #C7D0DB",
+"J. c #C9D1DA",
+"K. c #D3D4D3",
+"L. c #D9D6D4",
+"P. c #D4D9D4",
+"I. c #D5D5D9",
+"U. c #DDDDDE",
+"Y. c #E0DED2",
+"T. c #E3DBDE",
+"R. c #DCE2DE",
+"E. c #E1E0D4",
+"W. c #D2D2E4",
+"Q. c #D2DBE4",
+"!. c #E4D3E4",
+"~. c #E1D8E1",
+"^. c #D3E4E4",
+/* pixels */
+"K.K.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.P.K.L.L.L.P.L.P.P.L.K.K.",
+"K.I.S.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.S.J.J.H.J.G.F.F.F.I.K.L.",
+"I.S.:.>.<.,.,.,.<.,.,.,.,.<.,.,.,.,.<.1.3 h g g f F G H K ( ~.K.",
+"I.A.,.h.j.j.x.j.j.j.j.j.j.j.j.j.j.j.j.h.4 ] N ] b P W W W ^ !.K.",
+"I.A.<.j.N.v.v.v.v.v.v.v.v.b.b.b.v.v.b.l.4 N M ] z I W E W ^ !.K.",
+"I.A.<.j.v.v.v.v.v.v.v.v.M.v.v.b.v.v.v.k.4 [ ' [ b P W E W ^ !.K.",
+"I.A.,.j.v.v.v.v.v.v.v.a.7.7.p.p.z.v.v.l.3 x k j d D Y U P ~ ~.K.",
+"I.A.,.j.v.j.v.v.v.v.k.: m z m d 9.v.v.v.g.q.f.r.r.0.t.0.e.2.L.K.",
+"I.A.,.j.v.v.j.v.v.v.k.> [ ] [ l 9.v.v.v.v.v.M.v.v.M.M.M.l.5.Y.K.",
+"I.A.<.j.v.v.v.v.v.b.l.> ] ' N x 9.v.v.v.v.v.v.v.v.v.b.b.h.5.L.D.",
+"I.A.,.j.v.v.v.h.h.l.d.: [ ' [ c 9.v.v.v.v.v.v.v.v.l.n.n.d.6.E.P.",
+"I.A.<.j.b.v.s.: , , : . r e r w 9.v.v.v.v.v.v.v.g.+ # # @ 6 R.K.",
+"I.A.<.j.b.v.7.v [ ] [ e p p p y 9.M.v.v.v.v.v.v.f.t p a p C ^.K.",
+"I.A.<.j.v.M.7.z ] N ' e p p p y 9.v.j.v.v.v.x.v.f.t p a p C ^.S.",
+"I.A.,.j.v.M.p.m [ ] [ e p p p y s.M.v.M.v.M.v.M.f.t p p p C ^.D.",
+"I.A.,.j.z.M.7.d z x c w y y y 0 +.a.9.9.9.9.s.a.O.q i y y V ^.K.",
+"I.A.<.j.v.l.z.9.9.s.q.$ z x z s % $.#.%.X u y u 0 S R Y Y ~ !.S.",
+"I.A.<.j.v.v.v.v.M.M.h.> [ ' [ l $.C.C.Z.B p p p i I W W W ^ ~.K.",
+"I.A.,.j.v.v.v.v.v.v.k.> ] M ] j %.=.=.i.B p a p u I W E W ^ !.K.",
+"I.A.,.j.v.v.v.v.v.v.h.> [ ] [ l #.C.V.-.B p p p i P W E W ^ W.K.",
+"I.A.,.j.v.v.v.v.v.v.l.&.< > , : o.@.@.*.  O O O o & Q * * 7 T.S.",
+"I.A.,.j.v.v.j.v.v.v.v.j.h.k.k.l.m.M.B.x.= W W W T 8.c.x.u.4.Y.K.",
+"I.A.<.j.v.v.j.v.v.v.v.v.v.b.v.v.v.v.v.u.= W E W T p.M.B.l.5.Y.K.",
+"I.A.<.j.M.M.M.v.v.v.v.v.b.v.b.v.v.v.v.x.= W W W T p.M.N.l.5.L.D.",
+"I.S.;.e.f.t.t.v.v.v.v.g.q.r.r.r.v.v.v.x.- R T R S +.y.t.e.2.E.K.",
+"P.D.F P U Y D t.M.z.k.1 { } { _ 9.v.z.l.3 l k j s S Y U P ! !.K.",
+"P.F.H W W W U 0.M.v.u.2 | | | { 9.v.v.k.4 [ ] ] m Y W W W ^ !.K.",
+"P.G.H W E W U t.M.N.d.2 |  .| { s.M.b.l.4 [ ' ] v P W E W ^ !.K.",
+"P.F.H W E W U q.j.j.u.2 | | | { q.j.z.u.4 N N ] n P W E W ^ !.K.",
+"K.D.( J ^ / ! 2.5.5.4.9 ` X.X...3.5.6.6.8 h Z Z A ! / ^ J ) U.K.",
+"K.K.T.!.!.W.!.R.L.Y.Y.U.W.W.W.W.Y.Y.P.L.T.Q.Q.Q.Q.!.!.!.!.~.K.K.",
+"I.K.K.S.K.K.S.K.K.K.I.K.S.K.K.K.K.P.K.P.K.S.K.K.S.P.K.K.K.K.K.K."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 183 2 ",
+"   c #1E331B",
+".  c #6C1502",
+"X  c #77010F",
+"o  c #5D072B",
+"O  c #6D113B",
+"+  c #70153E",
+"@  c #593734",
+"#  c #6A3930",
+"$  c #531A0D",
+"%  c #214803",
+"&  c #127412",
+"*  c #316900",
+"=  c #347100",
+"-  c #0A7932",
+";  c #0B7731",
+":  c #2A792C",
+">  c #0D5632",
+",  c #7A4300",
+"<  c #54433D",
+"1  c #6D423A",
+"2  c #65423B",
+"3  c #744532",
+"4  c #744639",
+"5  c #654B2C",
+"6  c #6D733C",
+"7  c #626738",
+"8  c #1E2374",
+"9  c #383868",
+"0  c #52007A",
+"q  c #483969",
+"w  c #0A415C",
+"e  c #17536C",
+"r  c #52556A",
+"t  c #9A1D00",
+"y  c #950400",
+"u  c #A70900",
+"i  c #A80401",
+"p  c #B30202",
+"a  c #BE0100",
+"s  c #A21D00",
+"d  c #830123",
+"f  c #DC0000",
+"g  c #D70101",
+"h  c #E10000",
+"j  c #ED0000",
+"k  c #FE0101",
+"l  c #934901",
+"z  c #9D5000",
+"x  c #A75C01",
+"c  c #AA5C02",
+"v  c #B25A03",
+"b  c #B75B02",
+"n  c #A86001",
+"m  c #85582B",
+"M  c #CA6900",
+"N  c #D16701",
+"B  c #D96D00",
+"V  c #DB7400",
+"C  c #E16101",
+"Z  c #EC6E01",
+"A  c #F26700",
+"S  c #FC7E01",
+"D  c #FE7400",
+"F  c #877774",
+"G  c #9A7070",
+"H  c #08AA01",
+"J  c #02AA08",
+"K  c #01A602",
+"L  c #01BA01",
+"P  c #07B500",
+"I  c #2D842D",
+"U  c #01C200",
+"Y  c #00CD00",
+"T  c #00DC01",
+"R  c #01E301",
+"E  c #00EE00",
+"W  c #03F601",
+"Q  c #02FE01",
+"!  c #07FF07",
+"~  c #708E70",
+"^  c #709570",
+"/  c #709A70",
+"(  c #6B956C",
+")  c #9C9B03",
+"_  c #B2B205",
+"`  c #A6A603",
+"'  c #F48301",
+"]  c #FE8401",
+"[  c #FF8B01",
+"{  c #F68B00",
+"}  c #DEDC02",
+"|  c #E0DF00",
+" . c #EDEC01",
+".. c #FDFD02",
+"X. c #888875",
+"o. c #9A8570",
+"O. c #9A9A70",
+"+. c #9C916E",
+"@. c #2A1C8D",
+"#. c #162A98",
+"$. c #2E208D",
+"%. c #302A8D",
+"&. c #223AA7",
+"*. c #2933A8",
+"=. c #243BAA",
+"-. c #2838A8",
+";. c #2535B2",
+":. c #2437BA",
+">. c #2838BB",
+",. c #1A34A9",
+"<. c #5F008F",
+"1. c #6A008D",
+"2. c #60009C",
+"3. c #720191",
+"4. c #6A00A6",
+"5. c #7F00A4",
+"6. c #7F00B1",
+"7. c #7000B7",
+"8. c #3D4683",
+"9. c #374385",
+"0. c #747B86",
+"q. c #787C9A",
+"w. c #767A97",
+"e. c #1724C9",
+"r. c #1E39D5",
+"t. c #1E3BDD",
+"y. c #1E34DD",
+"u. c #2B34D5",
+"i. c #223CDC",
+"p. c #2B39D7",
+"a. c #283CC9",
+"s. c #1239EA",
+"d. c #133AFA",
+"f. c #122CF7",
+"g. c #233BED",
+"h. c #2B35E5",
+"j. c #233EFE",
+"k. c #343BFF",
+"l. c #3133E4",
+"z. c #7501C0",
+"x. c #1E42DC",
+"c. c #2243DD",
+"v. c #1C40FF",
+"b. c #2446FF",
+"n. c #244DFF",
+"m. c #2D49FF",
+"M. c #2943FC",
+"N. c #3149F5",
+"B. c #3544FF",
+"V. c #334CFE",
+"C. c #394DFE",
+"Z. c #3047F1",
+"A. c #3551FF",
+"S. c #3952FF",
+"D. c #254AF7",
+"F. c #8501A7",
+"G. c #8201B4",
+"H. c #8602BB",
+"J. c #8C03C2",
+"K. c #818F81",
+"L. c #ABB2AB",
+"P. c #D2D0C5",
+"I. c #D2D1CC",
+"U. c #C4CDD5",
+"Y. c #CACFD5",
+"T. c #D5C5D5",
+"R. c #D2CFD2",
+"E. c #D4D4D4",
+"W. c #D9D7D5",
+"Q. c #D5D9D5",
+"!. c #D6D6D9",
+"~. c #CED1D2",
+"^. c #E7E6DF",
+"/. c #DFDFEA",
+"(. c #E9DFE9",
+"). c #E1DFE1",
+"_. c #DFE4EA",
+"`. c #E7E6E1",
+"'. c #E8E7E2",
+"]. c #E1E3E9",
+"[. c #E9E0E9",
+"{. c #E1E9E9",
+"}. c #E5E9E7",
+/* pixels */
+"E.E.E.E.!.E.W.E.E.Q.E.E.!.E.!.E.Q.E.E.E.E.E.E.E.E.E.W.E.E.E.!.E.E.E.!.E.E.E.Q.E.E.E.E.E.!.E.E.E.",
+"E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.W.E.!.E.E.E.!.E.E.E.!.E.E.W.E.E.E.E.E.E.!.E.E.E.!.E.W.E.E.Q.E.",
+"E.!.E.W.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.W.W.W.W.W.W.W.Q.Q.Q.E.Q.!.W.E.E.E.",
+"E.E.E.E.I.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.P.~.U.U.U.U.U.Y.T.T.T.T.T.T.E.E.E.E.E.",
+"E.E.!.I.r 9.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.8.9.< m m m m m 5 : I I I I & K.(.E.W.E.",
+"E.E.!.P.8.b.m.V.m.m.m.m.m.m.m.m.m.m.m.m.m.m.m.V.m.m.m.m.V.v.3 ] S S S ] c T Q Q Q ! W / (.E.E.E.",
+"E.W.!.P.8.m.C.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.S.b.3 ] S S S ] x T Q Q Q ! E / (.~.E.E.",
+"E.E.W.P.8.m.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.b.3 ] S ] S ] c T Q Q Q Q E / (.~.E.E.",
+"!.E.!.P.8.m.V.V.V.V.V.V.V.V.V.V.V.V.N.A.V.V.V.V.V.V.V.V.V.b.3 ] S S S ] x T Q Q Q ! R / (.~.!.E.",
+"E.E.!.P.8.m.V.V.V.V.V.V.V.V.V.V.V.A.S.A.V.S.V.C.V.V.V.V.V.b.3 [ ] ] ' [ n T Q Q Q Q W / (.E.E.W.",
+"!.E.!.P.8.m.V.V.V.V.V.V.V.m.V.V.V.a.:.:.:.:.:.:.N.V.V.V.V.b.@ M b b b M , K L L L L K ~ [.~.E.E.",
+"E.E.!.P.8.V.V.V.m.V.V.V.V.V.V.C.b.@ C N N N V l i.S.V.V.V.V.i.r.r.r.r.r.i.u.u.u.u.p.e.w.'.I.E.E.",
+"W.E.!.P.8.m.V.V.V.V.V.V.V.V.V.C.b.1 [ ] ] ] [ v i.V.V.V.V.V.V.S.V.C.S.V.V.S.S.V.S.S.D.w.^.~.E.E.",
+"E.E.!.P.8.m.V.V.V.V.V.V.V.V.V.C.b.1 ] ' S S ] v t.V.V.V.V.V.V.V.V.V.V.V.V.V.V.N.V.V.g.q.^.~.E.E.",
+"E.E.!.P.8.m.V.V.V.V.V.V.V.V.V.C.b.1 ] S S S ] c t.C.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.S.g.q.`.E.E.E.",
+"E.!.!.P.8.m.V.V.V.V.V.V.V.V.V.C.b.1 ] S ] S ] v t.S.V.V.V.V.V.V.V.V.V.V.V.V.C.C.C.C.g.w.`.E.E.E.",
+"E.E.!.P.8.m.V.V.V.V.S.b.b.b.b.M.v.2 ] ' ' ' ] n t.S.V.V.V.V.V.V.V.V.V.V.V.n.n.n.n.n.v.w.`.E.E.E.",
+"E.E.!.P.8.m.S.V.V.S.a.@ 1 1 1 1 2 $ t t t t s . i.S.V.V.V.V.V.V.V.V.V.S.>.o + O O + O r }.I.E.E.",
+"E.E.!.P.8.m.V.V.V.V.:.N [ ] ] ] { t k k k k k p x.V.V.V.V.V.V.V.V.V.V.A.-.h k k k k k G _.E.E.E.",
+"!.E.!.P.8.m.V.V.V.S.:.N ] S ] S ' t k k k k k p x.S.V.V.V.m.V.V.N.m.V.A.*.f k k k k j G {.E.W.E.",
+"E.E.!.P.8.m.V.V.m.S.:.N ] ] S S ' t k k k k k p x.C.V.V.V.V.V.V.V.V.V.A.*.h k k k k j G }.Q.!.E.",
+"E.E.!.P.8.m.V.V.N.S.:.N ] ] S S ' t k k k k k p x.C.V.m.V.V.N.V.V.V.N.V.*.f k k k k j G {.E.E.E.",
+"E.!.!.P.8.m.V.V.m.S.:.N [ ] ] ] { t k k k k k p x.S.V.S.A.S.V.S.S.S.V.S.*.h k k k k j G {.I.E.E.",
+"E.E.!.P.8.m.V.A.N.S.:.l b v v v c . a p p p a X #.;.;.;.;.;.;.;.;.;.-.>.8 y p p u p u F {.E.E.E.",
+"Q.E.!.P.8.m.V.V.V.V.N.t.t.t.t.i.s.@ V M M M V l 0 3.1.1.1.1.X h g g g h y U R T T R Y ^ [.~.E.E.",
+"E.E.!.P.8.m.V.V.V.V.V.S.S.S.C.S.n.1 ] ] [ ] [ v 4.J.H.H.H.z.d k k k k k u R Q Q Q ! E / [.E.!.E.",
+"!.E.!.P.8.m.V.V.m.V.V.V.V.V.m.C.b.1 ] S ] S ] v 2.H.6.6.G.7.d k k k k k u R Q Q Q Q E / [.I.E.W.",
+"E.W.!.P.8.m.V.V.V.V.V.V.V.V.V.V.b.1 ] S ] S ] v 2.G.6.6.G.7.d k k k k k u R Q Q Q ! E / [.~.E.E.",
+"W.E.!.P.8.m.V.V.V.V.V.V.V.V.V.V.b.1 ] ' ] S ] v 2.H.6.6.H.7.d k k k k k u R ! Q Q ! E / (.~.E.E.",
+"E.E.!.P.8.m.V.V.V.V.V.V.V.V.V.S.b.1 ] S S ] ] v <.G.5.5.F.4.d k k k k k u R Q Q Q Q W / (.~.E.E.",
+"E.E.!.P.8.m.V.V.V.m.V.V.V.V.V.V.A.%.q q q q q 9 $.$.$.$.$.@.  = * * * = % w e e e e w 0.'.E.E.E.",
+"!.E.!.P.8.m.V.V.V.V.V.V.V.V.V.m.A.V.m.m.n.m.m.A.n.A.A.A.A.B.- Q Q Q Q Q J l.C.B.B.B.g.w.`.E.E.E.",
+"E.W.!.P.8.m.V.V.V.V.V.V.V.V.V.V.V.V.N.V.C.N.N.V.V.V.V.V.A.k.- Q Q Q W Q J p.A.N.A.A.g.q.^.E.E.E.",
+"E.E.!.P.8.m.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.V.k.- Q Q Q Q Q J l.A.A.V.S.g.q.^.E.E.E.",
+"E.E.!.P.8.m.V.N.V.m.N.V.V.V.V.m.V.V.V.N.V.N.V.V.V.V.V.V.A.k.- Q W Q W Q J l.S.N.m.S.s.q.^.E.E.E.",
+"!.E.!.P.8.V.S.V.V.S.S.V.V.V.V.V.V.V.A.S.S.A.A.A.V.V.m.V.A.k.- Q Q Q Q Q J h.A.V.S.S.g.q.^.E.E.W.",
+"E.E.!.I.9 ,.=.=.&.&.&.Z.V.V.V.V.V.>.-.-.-.-.-.-.N.V.V.V.A.B.> P H H H P & #.=.=.=.=.#.0.`.E.E.E.",
+"E.Q.Q.T.: R T R T R K u.A.V.m.S.j.7  .}  .|  .) y.S.m.V.V.b.# A B C C A l U R T T R Y ^ [.~.E.E.",
+"E.!.Q.T.I Q Q Q Q Q L u.V.V.V.S.j.6 .........._ y.S.V.V.V.b.3 [ S ] ] [ x T ! Q Q ! E / [.~.E.E.",
+"W.E.Q.T.I Q Q Q Q Q L u.A.V.V.S.j.7 .........._ y.S.V.V.C.b.3 ] S S S ] x T Q Q Q ! E / [.E.E.E.",
+"E.E.Q.T.I Q Q Q Q Q L u.S.N.V.S.j.6 .........._ y.S.V.V.S.b.3 ] S S ] ] x T Q Q Q Q E / [.~.E.E.",
+"E.E.Q.T.I Q ! ! Q Q L u.S.S.S.S.j.6 .........._ i.S.C.V.S.n.3 ] ] ] ] ] n T ! Q ! ! E / [.E.E.E.",
+"Q.E.Q.T.: Q E E R Q P e.M.g.g.g.f.7 .. . . ...` e.M.g.g.g.d.# D Z Z Z S z Y Q R E W T ^ ].E.E.E.",
+"E.E.E.R.K.( / / / / ~ w.w.q.q.q.w.X.O.O.O.O.O.X.w.w.q.q.q.w.F o.o.o.o.o.F ^ / / / / ( L.).E.E.E.",
+"W.E.E.E.].(.(.[.[.[.[.`.^.^.^.`.^.].)././.)./.].^.^.^.^.`.^.]._._._._._.].[.[.[.(.(.[.).E.E.W.E.",
+"E.!.E.E.E.I.I.~.~.~.E.E.~.E.~.~.E.E.E.E.E.E.I.E.~.E.~.~.E.E.E.I.E.R.I.E.I.E.E.~.~.~.E.E.E.E.E.E.",
+"E.E.E.E.Q.E.W.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.W.E.E.E.E.W.E.E.Q.!.E.E.E.E.E.E.E.E.E.E.W.E.E.E.E.",
+"E.W.E.!.E.E.E.E.E.E.E.E.W.E.E.E.E.E.!.E.E.E.!.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.W.E.E.E.E.!.E.E.E.W."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/flood-web.png b/icons/flood-web.png
new file mode 100644 (file)
index 0000000..8a45e1e
Binary files /dev/null and b/icons/flood-web.png differ
diff --git a/icons/flood.ico b/icons/flood.ico
new file mode 100644 (file)
index 0000000..eeeca52
Binary files /dev/null and b/icons/flood.ico differ
diff --git a/icons/flood.rc b/icons/flood.rc
new file mode 100644 (file)
index 0000000..e4dbf2d
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "flood.ico"
diff --git a/icons/galaxies-16d24.png b/icons/galaxies-16d24.png
new file mode 100644 (file)
index 0000000..91b8124
Binary files /dev/null and b/icons/galaxies-16d24.png differ
diff --git a/icons/galaxies-16d4.png b/icons/galaxies-16d4.png
new file mode 100644 (file)
index 0000000..384138a
Binary files /dev/null and b/icons/galaxies-16d4.png differ
diff --git a/icons/galaxies-16d8.png b/icons/galaxies-16d8.png
new file mode 100644 (file)
index 0000000..80b16d3
Binary files /dev/null and b/icons/galaxies-16d8.png differ
diff --git a/icons/galaxies-32d24.png b/icons/galaxies-32d24.png
new file mode 100644 (file)
index 0000000..6dcdbd8
Binary files /dev/null and b/icons/galaxies-32d24.png differ
diff --git a/icons/galaxies-32d4.png b/icons/galaxies-32d4.png
new file mode 100644 (file)
index 0000000..61bcdaf
Binary files /dev/null and b/icons/galaxies-32d4.png differ
diff --git a/icons/galaxies-32d8.png b/icons/galaxies-32d8.png
new file mode 100644 (file)
index 0000000..6dcdbd8
Binary files /dev/null and b/icons/galaxies-32d8.png differ
diff --git a/icons/galaxies-48d24.png b/icons/galaxies-48d24.png
new file mode 100644 (file)
index 0000000..3361ab4
Binary files /dev/null and b/icons/galaxies-48d24.png differ
diff --git a/icons/galaxies-48d4.png b/icons/galaxies-48d4.png
new file mode 100644 (file)
index 0000000..105c8aa
Binary files /dev/null and b/icons/galaxies-48d4.png differ
diff --git a/icons/galaxies-48d8.png b/icons/galaxies-48d8.png
new file mode 100644 (file)
index 0000000..3361ab4
Binary files /dev/null and b/icons/galaxies-48d8.png differ
diff --git a/icons/galaxies-base.png b/icons/galaxies-base.png
new file mode 100644 (file)
index 0000000..672ad8b
Binary files /dev/null and b/icons/galaxies-base.png differ
diff --git a/icons/galaxies-ibase.png b/icons/galaxies-ibase.png
new file mode 100644 (file)
index 0000000..d6426f6
Binary files /dev/null and b/icons/galaxies-ibase.png differ
diff --git a/icons/galaxies-ibase4.png b/icons/galaxies-ibase4.png
new file mode 100644 (file)
index 0000000..321ff85
Binary files /dev/null and b/icons/galaxies-ibase4.png differ
diff --git a/icons/galaxies-icon.c b/icons/galaxies-icon.c
new file mode 100644 (file)
index 0000000..f1a8be8
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"9X|.'.].].].].{.'.`.`.`.`._..X9X",
+"|.f.~.Y.I.Y.~.u.'.>X$X@X=X%Xc.qX",
+"'.^.cXiXyXpXzXE.zXUXKXGXUXIX/.eX",
+"].Y.iX7X4X7XuXK.jXUXGXSXkXnX~.wX",
+"].I.yX4X2X5XeXQ.B.R.M.|.vXaX).5X",
+"].T.sX9X5X0X0X9X9XiX}.+XCXMXAXeX",
+"].R.sX9XrXpXpXtX0XpX|.#XUXIXCXeX",
+"].I.yX7XY.P.T.H.1XrX.Xm.+X[.).0X",
+"].Y.sX3XF.wXtXE.+XuX7X+XOX Xn.tX",
+"].E.uX2XI.nXFX/.$XqX0XiXjXdXT.tX",
+"{.H.sX:XZ.6X8XY.{.iX>X.X}.'.x.rX",
+"{.A.cX2Xe.R.E.I.*XbX(.C.;XOX X0X",
+"].E.0X<XS.dXpXyX8X6X}.#XUXIXCXeX",
+"].T.gX6XM.0X8X6X9XsX|.@XUXLXVXeX",
+"|.E.rX7Xb.m.C.l.:XwX%Xb.R.G.W.iX",
+"9X9XqXqXtXqXwX5X9XqXeXwX8X8X3XqX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXwXsXfXfXfXfXfXfXfXfXfXfXfXfXsXfXgXfXfXfXfXfXfXfXfXfXgXdXaXwXqX",
+"wX8X).T.E.E.E.E.E.E.E.E.E.E.E.).T.U.Y.Y.Y.Y.T.U.Y.Y.Y.U.!._.9XwX",
+"sX).b 2.*.-.-.-.%.*.-.-.-.=.;.l 8.u.t.t.y.e.7.y.t.t.r.j.T  .pX0X",
+"fXR.2.SXfXjXjXlXpXdXkXjXjXjXzX+.BXUXIXUXUXKXVXUXUXUXKXUXF.L.xX7X",
+"fXE.*.fX5X8X8X9X1X4X9X8X8X7X0X .mXUXKXKXLXFXbXPXKXKXFXUXA.J.zX7X",
+"fXE.-.jX8XqXqXwX4X7XwXqXqXqXeX..VXUXIXUXUXKXNXUXIXUXKXUXF.L.xX7X",
+"fXE.-.jX8XqX0XwX4X7XwXqXqX0XeX..mXUXJXKXLXFXnXUXLXBXDXUXD.J.zX7X",
+"fXE.-.lX9XwXwXrX5X8XeXwXwXwXrXX.VXUXIXUXUXKXCXUX>X4X$XUXJ.L.xX7X",
+"fXE.%.pX1X4X4X5X,X1X5X4X4X3X0XW i.n.x.x.v.s.|.uXwXUXzXrXF.| sX0X",
+"fXE.*.dX4X7X7X8X1X3X8X7X7X6X0XQ.M.V.V.B.G.7.3.MX1XUXaX9XjX'.wXqX",
+"fXE.-.kX9XwXwXeX5X8XeXwXwXwXwX0XhXhXhXgXnX+X6.UX7X;X1XLXFXBXrX0X",
+"fXE.-.jX8XqXqXwX4X7XwXqXqXqXqX1X8X9X9X8XiX/.4.UXKXIXIXUXAXmXrX0X",
+"fXE.-.jX8XqXqXwX4X7XwXqXqXqXqX2X0XqXqX0XaX_.4.UXJXUXPXUXSXBXrX0X",
+"fXE.-.jX8XqXqXwX3X6XwX0XqXqXqX1X0XqXqX0XaX_.4.UXKXIXPXUXZXNXrX0X",
+"fXE.-.kX8XwXqXwX9XqXrXeXeXeXrX8XqXwXwX0XaX_.4.UXLXUXUXUXDXVXrX0X",
+"fXE.$.uX,X2X<XeXz.R O.X.O...} ` ,X3X2X1X7X|.G &.@.#.@.*.^ *.wXqX",
+"fXE.=.jX7X0X7XkX5./.UXbXkXSXDXo.-XrX0X0XqX9X-X-X-X-X&X0X7.D.lX8X",
+"fXE.-.kX8XqX8XlX5.+XLX-X4X8XUX$.-XtXqXqXwX9X5XyXtXtXwXvXs.Y.zX7X",
+"fXE.-.jX7XqX7XlX4.+XeXBXUX2XNX=.=XrX0X0XqX9X2XwX0XqX7XkXu.U.zX7X",
+"fXE.-.jXwXeXwXlX4.+XrXxXUX:XCX*.*XiXrXtXrX8X2XqX0X0X7XjXy.I.zX7X",
+"fXE.=.zX|.'.{.xX5.oXUX4X5XsXUX#.,X2X`.'.4XwX8XsXaXaXuXNXg.Y.zX7X",
+"fXR.>.3X-XUX1X<X0.S.cXtXwXaXiX{ %X|.DXmX'.7X].)._.)./.+X=.c.jX8X",
+"fXR.;.+XaXUXlXOX0.D ;.+.#.@.o.;.@X#XUXUXoX(.D 9.3.4.4.6.*.0.qXqX",
+"fXR.:.pX).yX`.uX9.P.NXsXfXfXgXeXrX[.4X-X%X{.3.UXLXUXUXUXDXVXrX0X",
+"fXE.=.zX2XoX<XcX5.C.dX6X8X8X9X,X0XeX$X&XfX).3.UXGXLXKXIXVXmXrX0X",
+"fXE.-.jX9XuX0XkX6.A.hX9XqXqXwX2X0XqXyXrXpX_.4.UXLXUXUXUXSXBXrX0X",
+"fXE.-.jX7X0X7XkX6.V.sX6X8X8X8X<X0XqX0X9XaX_.3.UXGXKXKXIXVXNXrX0X",
+"fXE.;.lX9XwX9XzX8.T.ZXhXkXkXlXtXwXwXwXqXsX`.5.UXLXUXUXUXDXVXrX0X",
+"fXE.&.aX2X5X2XsX5.` k.u.i.p.y.j.4X5X5X4XwX`.T Y.D.F.F.J.M.8XiX9X",
+"sX/.5.pX3X6X5XqX{.h.z.l.l.l.l.R :X8X5X6X7X1Xb.g.j.j.g.M.( U.jX8X",
+"qX0X0XwXwXwXwXqXyXjXjXjXjXjXkXtXqXwXwXwXwXeXgXkXkXkXjXlXsXwXqXqX",
+"qXqXwXqXqXqXqXqX0X8X8X8X8X8X8XqXqXqXqXqXqXqX8X8X8X8X8X8X0XqXqXqX"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqXqXqXqX",
+"qXqXqXwXiXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXiXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXiXaXwXqXqXqX",
+"qXqXwX8X|.).).).).).).).).).).).).).).).).).).|.(./././././././.(.(./././././././.^.}.`.5XwXqXqX",
+"qX0XiX|.- z z z z z z z z k k z z z z z z z l * b V B B B B B B M b V B B B B B N A > g =XtX0XqX",
+"qX0XaX).x fXyXuXuXuXuXuXpX8X0XpXuXuXuXuXyXpXqXk xXUXIXUXUXUXUXUXSXnXUXIXUXUXUXUXLXUXP .XvX7XqXqX",
+"qX0XaX).z yX9X0X0X0X0X0XwX2X3XwX0X0X0X0X0XwX4Xj zXUXPXIXIXIXIXUXAXvXUXPXIXIXIXIXKXUXP .XvX7XqXqX",
+"qX0XaX).z uX0XqXqXqXqX0XeX2X4XwXqXqXqXqX0XeX5Xj xXUXIXUXUXUXIXUXAXbXUXIXUXUXUXUXLXUXP .XvX7XqXqX",
+"qX0XaX).z uX0XqXqXqXqXqXeX2X4XeXqXqXqXqXqXeX5Xj xXUXIXUXUXUXUXUXSXbXUXIXUXUXUXUXLXUXP .XvX7XqXqX",
+"qX0XaX).z uX0XqXqXqXqXqXeX2X4XeXqXqXqXqXqXeX5Xj xXUXIXUXUXUXUXUXSXbXUXIXPXIXIXIXLXUXP .XvX7XqXqX",
+"qX0XaX).z uX0XqXqXqXqXqXeX2X4XeXqXqXqXqXqXeX5Xj xXUXIXUXUXUXUXUXSXbXUXPXUXUXUXIXKXUXP .XvX7XqXqX",
+"qX0XaX).z uX0X0XqXqXqX0XwX2X4XwX0XqXqXqX0XeX5Xj jXUXJXKXKXKXJXPXBXxXUXUX8X'.'.tXUXUXP }.cX7XqXqX",
+"qX0XaX).z pXwXeXeXeXeXwXtX4X6XtXeXeXeXeXwXtX7Xz xXUXIXUXUXUXUXUXDXnXUX9X].KXFX/.iXUXI XXvX7XqXqX",
+"qX0XaX).k 8X2X2X2X2X2X2X4X-X:X4X2X2X2X2X2X4X,Xy #.5.2.2.2.2.2.4.=.P.LXW.SXUXUXnX!.UXJ Y 6XeX0XqX",
+"qX0XaX).k 0X3X4X4X4X4X4X6X:X>X5X4X4X4X4X4X4X4Xp.:.,.,.,.,.,.:.9.Z { UXQ.CXUXUXxX).UXT.p.2XrX0XqX",
+"qX0XaX).z pXwXwXeXeXeXwXtX4X5XrXwXeXeXeXeXwXeXqXxXcXcXcXcXcXlXKXM.{ UXeX/.VXmXQ.kXUXbXHXiX0XqXqX",
+"qX0XaX).z uX0XqXqXqXqX0XeX2X4XwX0XqXqXqXqXqXqX-X7X8X8X8X8X8X5XgXi.{ UXIXpX}. XhXUXUXlXAXiX0XqXqX",
+"qX0XaX).z uX0XqXqXqXqXqXeX2X4XeXqXqXqXqXqXqXqX>X0XqXqXqXqXqX8XlXs.{ UXJXUXUXUXIXPXUXxXGXiX9XqXqX",
+"qX0XaX).z uX0XqXqXqXqXqXeX2X4XeXqXqXqXqXqXqXqX>X0XqXqXqXqXqX8XlXs.{ UXKXIXPXPXIXIXUXxXGXiX9XqXqX",
+"qX0XaX).z uX0XqXqXqXqXqXeX2X4XeXqXqXqXqXqXqXqX>X0XqXqXqXqXqX8XlXs.{ UXKXUXUXUXUXIXUXxXGXiX9XqXqX",
+"qX0XaX).z uX0XqXqXqXqXqXeX2X4XwX0XqXqXqXqX0XqX>X0XqXqXqXqXqX8XlXs.{ UXJXIXIXIXIXIXUXxXFXiX0XqXqX",
+"qX0XaX).z uX0XqXqXqXqXqXeX3X6XtXeXeXeXeXeXeXeX,X0XqXqXqXqXqX8XlXs.} UXKXUXUXUXUXIXUXcXGXiX9XqXqX",
+"qX0XaX).z uXqXqXqXqXqXqXeX2X,X6X5X5X5X5X5X5X5X;XqXwXqXqXqXqX9XzXs.] UXSXHXHXHXHXGXLXkXCXuX0XqXqX",
+"qX0XaX_.j 4X:X>X>X>X>X-XwX2.6 x j h g h j k f s +X1X:X>X>X>X;X0Xc.: n l z z z z z c t l %XyX0XqX",
+"qX0XaX).z yX0X0X0X0X0X7XxX{ e.PXhXnXZXVXzXvXhXj $XyX0X0X0X0X0XwX2XXX%X#X$X$X$X#X+X2Xb !.kX8XqXqX",
+"qX0XaX).z uX0XqXqXqXqX7XcX{ l.UXPXCX8XsXIXUXHXx $XyX0XqXqXqXqXwX7X5XiXyXyXyXyXyXrXxXZ OXcX7XqXqX",
+"qX0XaX).z uX0XqXqXqXqX7XcX[ h.UXwXQ.wX$X_.UXGXz $XyX0XqXqXqXqXwX6X<XwX0X0X0X0X0X8XgXB oXcX7XqXqX",
+"qX0XaX).z uX0XqXqXqXqX7XcX[ k.UXQ.SXUXUX&X0XUXk $XyX0XqXqXqXqXwX6X1XeXqXqXqXqXqX8XhXB OXcX7XqXqX",
+"qX0XaX).z uX0X0X9X9X0X7XcX[ x.UX^.UXGXUXyX*XUXk #XyX0X0X9X0XqXwX6X1XeXqXqXqXqXqX8XhXB OXcX7XqXqX",
+"qX0XaX).z uX9XrXpXpXuX6XvX[ j.UX/.fXUXUX`.hXUXl $XyXqXpXpXiX0XwX6X1XeXqXqXqXqXqX8XhXB OXcX7XqXqX",
+"qX0XaX).z yXrX,XY.P.OXeXxX[ g.UXbX~.|.~.>XUXSXl #XpX7XW.P.'.tXwX5X>X0X8X8X8X8X8X6XdXB .XcX7XqXqX",
+"qX0XaX).z sX<XD.dXmXW.`.VX] k.UXKXUXUXUXIXUXHXc &XuXS.8XVX XR.aX9XtXxXlXlXlXlXlXhXSXG OXcX7XqXqX",
+"qX0XaX).j pXP.uXUXUXGXD.gX .( '.K.I.W.T.P.T.J.t -X'.*XUXLXUXR.>X#Xs.s.s.s.s.s.s.p.z.y 9.eXqXqXqX",
+"qX0XaX_.h eXD.lXUXPXUXF.eX+.9 ~ P I I I I U L _ 2XR.4XUXHXUX!.:Xz.5 @.[ { { { { { } { { =XtX0XqX",
+"qX0XaX).l hXOXW.IXUX-XI.CX{ e.LXjXxXxXxXxXxXxXwXyX2XH.AXUXyXS.nXd.| UXKXUXUXUXUXIXUXnXHXiX0XqXqX",
+"qX0XaX).z tXyX[.K.Y.R.9XxX| <.jX4X8X8X8X8X7X8X-X9XyX$XH.R.K.3XxXa.[ UXFXKXKXKXKXJXIXkXAXiX0XqXqX",
+"qX0XaX).z uX9XuXqX7XiX8XcX| 2.xX8XqXqXqXqXqXqX>XqX0XyXrX5XuX0XkXs.{ UXKXUXUXUXUXIXUXxXGXiX9XqXqX",
+"qX0XaX).z uX0X0XqXwX0X7XcX| 2.xX8XqXqXqXqXqXqX>X0XqX0XqXwX0X8XlXs.{ UXKXUXUXUXUXIXUXxXGXiX9XqXqX",
+"qX0XaX).z uX0XqXqXqXqX7XcX| 2.xX8XqXqXqXqXqXqX>X0XqXqXqXqXqX8XlXs.{ UXKXUXUXUXUXIXUXxXGXiX9XqXqX",
+"qX0XaX).z uX0XqXqXqXqX7XcX| 2.xX8XqXqXqXqXqXqX>X0XqXqXqXqXqX8XlXs.{ UXKXUXUXUXUXIXUXxXGXiX9XqXqX",
+"qX0XaX).z yX0X0XqXqXqX7XxX| <.kX5X8X8X8X8X8X9X;X0XqXqXqXqXqX8XlXs.[ UXGXLXLXLXLXKXUXkXFXiX9XqXqX",
+"qX0XaX).x pXwXeXeXeXeX9XbX .0.FXsXhXhXhXhXhXhX0XeXeXeXeXeXeX0XxXd.} UXKXUXUXUXUXIXUXbXHXiX0XqXqX",
+"qX0XaX_.j 5X,X,X,X,X,X;XyX+.1 H V C C C C C N K %X2X,X,X,X,X:XeXj.> ! P I I I I I Y F -XsX9XqXqX",
+"qX0XaX_.x eX7X7X8X8X8X7XwX|.A.G.F.F.F.F.F.H.C.y #XwX7X8X8X8X7XqX&XZ.S.A.A.A.A.A.Z.U.a XXzX7XqXqX",
+"qXqXwX6X#XeXwXwXwXwXwXwXwXtXdXgXgXgXgXgXgXgXfX&X9XeXwXwXwXwXwXwXeXsXhXgXgXgXgXgXgXkX:X9XrX0XqXqX",
+"qXqXqXwXyXqXqXqXqXqXqXqXqX0X9X9X9X9X9X9X9X9X9XyXwXqXqXqXqXqXqXqX0X9X9X9X9X9X9X9X9X8XtXwX0XqXqXqX",
+"qXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/galaxies-web.png b/icons/galaxies-web.png
new file mode 100644 (file)
index 0000000..9430cee
Binary files /dev/null and b/icons/galaxies-web.png differ
diff --git a/icons/galaxies.ico b/icons/galaxies.ico
new file mode 100644 (file)
index 0000000..6a961d7
Binary files /dev/null and b/icons/galaxies.ico differ
diff --git a/icons/galaxies.rc b/icons/galaxies.rc
new file mode 100644 (file)
index 0000000..f39a704
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "galaxies.ico"
diff --git a/icons/guess-16d24.png b/icons/guess-16d24.png
new file mode 100644 (file)
index 0000000..30d0b77
Binary files /dev/null and b/icons/guess-16d24.png differ
diff --git a/icons/guess-16d4.png b/icons/guess-16d4.png
new file mode 100644 (file)
index 0000000..90ad211
Binary files /dev/null and b/icons/guess-16d4.png differ
diff --git a/icons/guess-16d8.png b/icons/guess-16d8.png
new file mode 100644 (file)
index 0000000..b900783
Binary files /dev/null and b/icons/guess-16d8.png differ
diff --git a/icons/guess-32d24.png b/icons/guess-32d24.png
new file mode 100644 (file)
index 0000000..7bd5959
Binary files /dev/null and b/icons/guess-32d24.png differ
diff --git a/icons/guess-32d4.png b/icons/guess-32d4.png
new file mode 100644 (file)
index 0000000..6c9604d
Binary files /dev/null and b/icons/guess-32d4.png differ
diff --git a/icons/guess-32d8.png b/icons/guess-32d8.png
new file mode 100644 (file)
index 0000000..adfbb00
Binary files /dev/null and b/icons/guess-32d8.png differ
diff --git a/icons/guess-48d24.png b/icons/guess-48d24.png
new file mode 100644 (file)
index 0000000..48b76f2
Binary files /dev/null and b/icons/guess-48d24.png differ
diff --git a/icons/guess-48d4.png b/icons/guess-48d4.png
new file mode 100644 (file)
index 0000000..e478528
Binary files /dev/null and b/icons/guess-48d4.png differ
diff --git a/icons/guess-48d8.png b/icons/guess-48d8.png
new file mode 100644 (file)
index 0000000..6447329
Binary files /dev/null and b/icons/guess-48d8.png differ
diff --git a/icons/guess-base.png b/icons/guess-base.png
new file mode 100644 (file)
index 0000000..1739dab
Binary files /dev/null and b/icons/guess-base.png differ
diff --git a/icons/guess-ibase.png b/icons/guess-ibase.png
new file mode 100644 (file)
index 0000000..15505b1
Binary files /dev/null and b/icons/guess-ibase.png differ
diff --git a/icons/guess-ibase4.png b/icons/guess-ibase4.png
new file mode 100644 (file)
index 0000000..fa81bb8
Binary files /dev/null and b/icons/guess-ibase4.png differ
diff --git a/icons/guess-icon.c b/icons/guess-icon.c
new file mode 100644 (file)
index 0000000..bb73841
--- /dev/null
@@ -0,0 +1,778 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 252 2 ",
+"   c #D6D5D5",
+".  c #D3DBDB",
+"X  c #CAC4C4",
+"o  c #D2DCDC",
+"O  c #D1D8D8",
+"+  c #CAC5C4",
+"@  c #D5DDE2",
+"#  c #CECDCF",
+"$  c #CCCCCA",
+"%  c #D5D5E3",
+"&  c #CBCBC8",
+"*  c #CFCFD3",
+"=  c #D5D5D9",
+"-  c #D3D3D2",
+";  c gray83",
+":  c #D5D5D5",
+">  c #D3E1E1",
+",  c #D28181",
+"<  c #F00000",
+"1  c #D17071",
+"2  c #D65F5D",
+"3  c #EF0201",
+"4  c #C98E8B",
+"5  c #E3EC34",
+"6  c #EAE61B",
+"7  c #C7C792",
+"8  c #EDEB13",
+"9  c #E0DF37",
+"0  c #C7C7CB",
+"q  c #C5C5C5",
+"w  c #CBCBCA",
+"e  c #D5D5D5",
+"r  c #D1E4E4",
+"t  c #D65D5E",
+"y  c red",
+"u  c #D54646",
+"i  c #DD3736",
+"p  c #C86A5A",
+"a  c #F0FF15",
+"s  c #FBF801",
+"d  c #C6C560",
+"f  c yellow",
+"g  c #F0F015",
+"h  c #BCBBB7",
+"j  c #B0B0B2",
+"k  c #BEBEBD",
+"l  c #D8D8D8",
+"z  c #D8DAD9",
+"x  c #CDC8C8",
+"c  c #9C5B7C",
+"v  c #CCC1C8",
+"b  c #C1BAAE",
+"n  c #967F50",
+"m  c #D1D5E1",
+"M  c #C7AE85",
+"N  c #C6A16B",
+"B  c #CDDCE9",
+"V  c #C59C60",
+"C  c #C9B593",
+"Z  c #C8CED5",
+"A  c #B5B4B2",
+"S  c gray76",
+"D  c #D8D8D8",
+"F  c #E0DED1",
+"G  c #7B87D6",
+"H  c #1642FF",
+"J  c #6A70E0",
+"K  c #3CE72E",
+"L  c green",
+"P  c #72BD65",
+"I  c #FE0919",
+"U  c #F50604",
+"Y  c #C66C6C",
+"T  c #FB0000",
+"R  c #F52122",
+"E  c #989696",
+"W  c #5C5D5D",
+"Q  c #8D8C8C",
+"!  c #DFDFDF",
+"~  c #DFDED2",
+"^  c #8893D7",
+"/  c #1F42FF",
+"(  c #7A7DE2",
+")  c #4CE546",
+"_  c #00FD04",
+"`  c #83C37E",
+"'  c #F3242E",
+"]  c #EC1E18",
+"[  c #C78484",
+"{  c #F11310",
+"}  c #E63332",
+"|  c #C4C5C5",
+" . c #B9BABA",
+".. c #C0C0C0",
+"X. c #D8D8D8",
+"o. c #D6D9DB",
+"O. c #D2C9BC",
+"+. c #B78359",
+"@. c #D1C4B9",
+"#. c #CDBAA9",
+"$. c #B6914A",
+"%. c #D4D6DA",
+"&. c #C97F7F",
+"*. c #C96565",
+"=. c #CDE1E1",
+"-. c #C85A5A",
+";. c #CE8F8F",
+":. c #B9C5C5",
+">. c #ABA8A8",
+",. c #CECECE",
+"<. c gray84",
+"1. c #D1DBE4",
+"2. c #D59358",
+"3. c #FF7200",
+"4. c #D3853F",
+"5. c #DC8330",
+"6. c #FF7700",
+"7. c #C78252",
+"8. c #F10A12",
+"9. c #FC0200",
+"0. c #C45757",
+"q. c #FE0000",
+"w. c #F81919",
+"e. c #958F8F",
+"r. c #7E8080",
+"t. c gray",
+"y. c #D4D9E0",
+"u. c #D6B793",
+"i. c #EE830D",
+"p. c #D7B185",
+"a. c #D1A27D",
+"s. c #E07A23",
+"d. c #CBB8A9",
+"f. c #D95154",
+"g. c #DC3D3D",
+"h. c #CCB0AD",
+"j. c #E73328",
+"k. c #DE5A51",
+"l. c #CFD5D5",
+"z. c #CAC9C9",
+"x. c gray79",
+"c. c #D7D7D7",
+"v. c #DCDBD4",
+"b. c #ACB4D7",
+"n. c #4A60DE",
+"m. c #9BA6E1",
+"M. c #D7DB86",
+"N. c #D4D936",
+"B. c #CCD6BD",
+"V. c #D26167",
+"C. c #D64F4C",
+"Z. c #C6C5CD",
+"A. c #8643B1",
+"S. c #A276C3",
+"D. c #AFB4AF",
+"F. c #7A797A",
+"G. c #A2A2A2",
+"H. c gainsboro",
+"J. c #E2E0D1",
+"K. c #6975D4",
+"L. c #0F2EFF",
+"P. c #4B5BDB",
+"I. c #EAE820",
+"U. c #C7B450",
+"Y. c #EF0014",
+"T. c #FF0400",
+"R. c #A1557F",
+"E. c #7200B7",
+"W. c #7F13AC",
+"Q. c #A7A4A8",
+"!. c #858685",
+"~. c #9D9D9D",
+"^. c #DDDDDD",
+"/. c #DBDBD5",
+"(. c #B6B9D6",
+"). c #5B69CB",
+"_. c #A9ADDE",
+"`. c #DBD296",
+"'. c #CDCB42",
+"]. c #D4D6CD",
+"[. c #CC7174",
+"{. c #CE5B5A",
+"}. c #CDD4D3",
+"|. c #9051A8",
+" X c #A47CB4",
+".X c #DBE0D9",
+"XX c #D2D1D3",
+"oX c #CDCDCD",
+"OX c gray84",
+"+X c #D3D3E1",
+"@X c #D7D685",
+"#X c #FAFA00",
+"$X c #E3D773",
+"%X c #53D46B",
+"&X c #03EC14",
+"*X c #93C894",
+"=X c #E93A45",
+"-X c #E62F28",
+";X c #BB9BAF",
+":X c #8323AF",
+">X c #9C50B9",
+",X c #A3A5A3",
+"<X c #6A6A6A",
+"1X c #979797",
+"2X c gray87",
+"3X c #D1D1E4",
+"4X c #D5D55C",
+"5X c #DED444",
+"6X c #26DC34",
+"7X c #69B858",
+"8X c #FF0316",
+"9X c #FE0400",
+"0X c #A65E87",
+"qX c #6F00B4",
+"wX c #861CB3",
+"eX c #8F8C90",
+"rX c #4E4F4D",
+"tX c #838383",
+"yX c #E1E1E1",
+"uX c #D6D6D9",
+"iX c #CFCFC9",
+"pX c #C3C476",
+"aX c #D4CEC5",
+"sX c #B4CDB8",
+"dX c #7BC378",
+"fX c #D0D9D8",
+"gX c #CA9B9C",
+"hX c #C68B8B",
+"jX c #D4DDDA",
+"kX c #A583B1",
+"lX c #B9A5C1",
+"zX c #CBCEC9",
+"xX c #B2B2B3",
+"cX c #C1C1C1",
+"vX c #D8D8D8",
+"bX c #D5D5D4",
+"nX c #D5D5D8",
+"mX c #CECEDF",
+"MX c #D4D5D8",
+"NX c #DAD4D9",
+"BX c #DFCFDF",
+"VX c #D8D5D6",
+"CX c #D1DCDC",
+"ZX c #D0DDDD",
+"AX c #D7D6D6",
+"SX c #D7DED4",
+"DX c #D6DBD4",
+"FX c #D9D8D9",
+"GX c gray87",
+"HX c #DADADA",
+"JX c gray83",
+"KX c white",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+"> , < 1 2 3 4 5 6 7 8 9 0 q w e ",
+"r t y u i y p a s d f g h j k l ",
+"z x c v b n m M N B V C Z A S D ",
+"F G H J K L P I U Y T R E W Q ! ",
+"~ ^ / ( ) _ ` ' ] [ { } |  ...X.",
+"o.O.+.@.#.$.%.&.*.=.-.;.:.>.,.<.",
+"1.2.3.4.5.6.7.8.9.0.q.w.e.r.t.D ",
+"y.u.i.p.a.s.d.f.g.h.j.k.l.z.x.c.",
+"v.b.n.m.M.N.B.V.C.Z.A.S.D.F.G.H.",
+"J.K.L.P.I.f U.Y.T.R.E.W.Q.!.~.^.",
+"/.(.)._.`.'.].[.{.}.|. X.XXXoXOX",
+"+X@X#X$X%X&X*X=X-X;X:X>X,X<X1X2X",
+"3X4Xf 5X6XL 7X8X9X0XqXwXeXrXtXyX",
+"uXiXpXaXsXdXfXgXhXjXkXlXzXxXcXvX",
+"bXnXmXMXNXBXVXCXZXAXSXDXFXGXHXJX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 200 2 ",
+"   c black",
+".  c #1B1B1B",
+"X  c #252525",
+"o  c #393738",
+"O  c gray35",
+"+  c #696969",
+"@  c #7A7A7A",
+"#  c #DC0506",
+"$  c #DC0E0E",
+"%  c #D61717",
+"&  c #E40202",
+"*  c #EB0000",
+"=  c #E20B09",
+"-  c #F40000",
+";  c #FE0202",
+":  c #E81212",
+">  c #E50D15",
+",  c #C92726",
+"<  c #D72425",
+"1  c #C83130",
+"2  c #CB3D3D",
+"3  c #DA3C2F",
+"4  c #E02B3E",
+"5  c #E97706",
+"6  c #FF7600",
+"7  c #FE7D02",
+"8  c #F47400",
+"9  c #EE7408",
+"0  c #D87C25",
+"q  c #D17C38",
+"w  c #D67113",
+"e  c #BF4C4C",
+"r  c #BD5754",
+"t  c #BB4B5D",
+"y  c #BA5163",
+"u  c #B86666",
+"i  c #BA7A7A",
+"p  c #B2727A",
+"a  c #C94747",
+"s  c #C45B5B",
+"d  c #C75652",
+"f  c #D34C41",
+"g  c #C26558",
+"h  c #CF5763",
+"j  c #C37A7B",
+"k  c #C36F69",
+"l  c #01E600",
+"z  c #02FE02",
+"x  c #00F600",
+"c  c #0CEB15",
+"v  c #17E31D",
+"b  c #2BD42C",
+"n  c #12D410",
+"m  c #41D733",
+"M  c #55BF53",
+"N  c #67BF67",
+"B  c #2FCA40",
+"V  c #49CC4B",
+"C  c #59C464",
+"Z  c #6EC175",
+"A  c #FE8203",
+"S  c #E58115",
+"D  c #CA823B",
+"F  c #D98C34",
+"G  c #D9DA0A",
+"H  c #D6D516",
+"J  c #DFE41B",
+"K  c #E5E403",
+"L  c #E9E903",
+"P  c #F3F300",
+"I  c #FEFE02",
+"U  c #E4E716",
+"Y  c #C9C935",
+"T  c #D7D630",
+"R  c #CDE03F",
+"E  c #BF8C59",
+"W  c #81B07C",
+"Q  c #BBBC62",
+"!  c #B5B579",
+"~  c #B58D67",
+"^  c #C8884E",
+"/  c #C1BE57",
+"(  c #C19B78",
+")  c #C49161",
+"_  c #C6B566",
+"`  c #B8C161",
+"'  c #C9CF48",
+"]  c #C3D060",
+"[  c #C3C366",
+"{  c #710E99",
+"}  c #792C99",
+"|  c #7202A3",
+" . c #7507A5",
+".. c #7C01B2",
+"X. c #7F15A9",
+"o. c #7E27A1",
+"O. c #7D46AF",
+"+. c #6A73BD",
+"@. c #263EEC",
+"#. c #233EFB",
+"$. c #2F43D4",
+"%. c #2A43FD",
+"&. c #2742F4",
+"*. c #364FFF",
+"=. c #3951FF",
+"-. c #4A59C6",
+";. c #6C7AC9",
+":. c #7B74C8",
+">. c #8204B4",
+",. c #8401B9",
+"<. c #8026A4",
+"1. c #864E9B",
+"2. c #937A9C",
+"3. c #BA7787",
+"4. c #8548A5",
+"5. c #8556AE",
+"6. c #926FAC",
+"7. c #7ACA8A",
+"8. c #7788CA",
+"9. c #6784CD",
+"0. c #888888",
+"q. c #959595",
+"w. c #9F9F9C",
+"e. c #A98685",
+"r. c #BC8888",
+"t. c #AB9B9C",
+"y. c #BA9999",
+"u. c #BB9D80",
+"i. c #BBBC86",
+"p. c #BBA996",
+"a. c #BDBD96",
+"s. c #A8A583",
+"d. c #989CB4",
+"f. c #918FB0",
+"g. c #B59DB1",
+"h. c #9DA1BD",
+"j. c #A4A4A4",
+"k. c #ACACAC",
+"l. c #A8A6A6",
+"z. c #BBAAA9",
+"x. c #BAB9AB",
+"c. c #ACA9B9",
+"v. c #B8ABB5",
+"b. c #ABBBB8",
+"n. c #B5B5B4",
+"m. c #BBBBBB",
+"M. c #BAB2BE",
+"N. c #A9BDA4",
+"B. c #C28782",
+"V. c #C19896",
+"C. c #C5AC93",
+"Z. c #C0AFAF",
+"A. c #C5B6AC",
+"S. c #C2BCBC",
+"D. c #C2B6B5",
+"F. c #8FC28C",
+"G. c #BCC393",
+"H. c #9ACAA6",
+"J. c #B8C1B7",
+"K. c #BDC4AD",
+"L. c #C0C384",
+"P. c #C2C190",
+"I. c #C2C1B8",
+"U. c #C1C1AC",
+"Y. c #8B82C9",
+"T. c #BEBDC1",
+"R. c #B5B5C7",
+"E. c #C9BCCB",
+"W. c #BBC6CB",
+"Q. c #C4C3C3",
+"!. c #CCCDCC",
+"~. c #C7C9C7",
+"^. c #D1CDCC",
+"/. c #CDD0CD",
+"(. c #D1D2CD",
+"). c #D6D8CF",
+"_. c #CCCCD5",
+"`. c #D2CED3",
+"'. c #D6CDD9",
+"]. c #CDD5D5",
+"[. c #CED9D9",
+"{. c #C9D7DA",
+"}. c #D5D5D5",
+"|. c #D9D7D7",
+" X c #D6DAD5",
+".X c #DADAD6",
+"XX c #D4D4DC",
+"oX c #D4DCDD",
+"OX c #DADBDB",
+"+X c #DCD5DC",
+"@X c #E0DFD9",
+"#X c #DDE3DB",
+"$X c #DADAE1",
+"%X c #D8D9E6",
+"&X c #CFDCE7",
+"*X c #E0D9E8",
+"=X c #DBE2E4",
+"-X c #D5E6E6",
+";X c #E3E4E3",
+":X c #E6E9E4",
+/* pixels */
+"}.}.}.}.|.OX}.}.}.}.OX}.}.}.}.|.|.}.}.}. XOX|.}.}.}.}.}.}.}.}.}.",
+"}.}.}.#XQ.S.-X}. X[.D._.oX}.%X~.I.%X}.}._.m.~.$X}.}.}.|.}.}.}.}.",
+"}.}.oXi # & e [.Q.1 * % p.%X! G K ' _.~.Y L H a.XXJ.Q.Q.T.!.|.}.",
+"}.OXv.& ; ; - r.s ; ; ; < n.L I I P i.[ I I I H E.!.(.n.oXQ. X}.",
+"}.=Xy.* ; ; ; u a ; ; ; > s.P I I I ` ' I P I K I.T.n.~.l.}.}.|.",
+"}.|.Q.% ; ; & v.i - ; ; a W.H I I K A.i.P I I Y XXw.q.k.0.!.|.}.",
+"}.}.oXD.f 3 V.#X[.j 4 h ~.%XD.' ' P.XXXXL.' ] ~.XX!.!.}.~.XX}.}.",
+"}.}. X/.8.9.W..XOXH.C 7.'.|.!.p y D.oXoXz.t 3. XOX!.!.}.Q.|.}.}.",
+"`.|.^.-.#.%.$.R.F.l z x M '.1 ; ; # D.y.& ; - e -Xo X +   T.OX}.",
+"}..Xh.@.=.=.%.:.m z z z c e.* ; ; ; u a ; ; ; & ~.0.@ l.O !.}.}.",
+"}..Xc.@.=.=.#.Y.V z z z v t.* ; ; ; i s ; ; ; $ ~.m.k.S.j.}.}.}.",
+"}.}.).;.&.&.-.^.K.n z l F.=Xr * - , !.D.% ; & i =Xl.j.m.q.].|.}.",
+"}.}.}. Xd.f./.|.*X~.W b.*X}.-Xt.e.{.OX$XW.~ c.-X/.#X:XOXOX|.}.}.",
+"}.}.%Xu.S 5 ) ].Q.D 9 0 p.=Xr.: : d [.~.2 : < y.#X2.@ Q.k.}.}.}.",
+"}.OXx.5 A A 8 p.) 6 A 7 0 c.= ; ; - r.k ; ; ; % [.o . n.q.!.|.}.",
+"}.oXp.8 A A 7 ~ ^ A 7 A S e.- ; ; ; u a ; ; ; & S.Q.n.!.n.}.}.}.",
+"}. XQ.w 6 6 8 x.( 8 7 6 g W.% ; ; * z.j - ; ; 1 oXw.q.k.0.!.|.}.",
+"XX}.|.A.F F p.$X`.( q ) I.%XD.a 2 V. X].j 3 d I.OX!.!.}.Q.}.}.}.",
+"}.}.|.].8.;.T.OXXXK.` G.OX#X].~ u T.oXOXM.5.f. X|.].!.|.!. X}.}.",
+"}.}.(.-.#.%.$.R.P.K I P / {.1 ; ; # S.g.| >.| 1.:Xo X +   m.|.}.",
+"}.@Xd.&.=.=.%.;.T I I I U e.- ; ; ; g 5.>.>.,. .~.@ + j.O !.|.}.",
+"].OXR.@.*.=.#.8.' I I I J t.* ; ; - k 5...>.,. .m.}.}.m.l.].}.}.",
+"}.|.(.+.&.%.-.!.x.G I L ! -Xd - ; , ~.M.{ ..| 2..Xm.Q.c.q.!.|.}.",
+"}.}.}.|.f.f._.|.%XE.! x.%X|.-Xt.e.{.|.#X~.2.k.#X}.OXOX;X:X|.}.}.",
+"}.}.XXi.U L Q %X~.V c b N.$Xr.% : s {.!.1.X.<.c.:X0.0.l.+ !.}.}.",
+"}.XXm.K I I P C.C z z z b v.= ; ; - B.6.| >.>.{ |.o X +   m.|.}.",
+"}.$Xa.P I I I _ B z z z c e.- ; ; ; g O.,.>.>. .Q.j.q.m.@ }.|.}.",
+"}.|.Q.G I I L A.Z x z z b E.% ; ; & C.6.| >...} #Xo . +   m.OX}.",
+"}.}.OXx.Y T i.{.`.N b V I.$Xz.2 4 r.oX).6.<.1.m.;Xk.j.T.q.}.}.}.",
+"}.}.}.XXR.M.XX|.}.'.v.E.OX}.|.W.b.[.}. X Xn.~.|.}.OX$X X;X|.}.}.",
+"}.}.}.}.(.!.(.}.}.]././.}.|.}.!.`.!.}.}.!.!.!.}.}.}.}.}.].}.}.}.",
+"}.|.}.}.|.|.}.}.}.}.}.|.}.}.}. X}.|.}.}.}.|.}.}.}.}.}.|.}.}.}.}."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 203 2 ",
+"   c black",
+".  c #0B0B0B",
+"X  c #1E1E1E",
+"o  c gray13",
+"O  c #343434",
+"+  c #3B3B3B",
+"@  c #454545",
+"#  c #585858",
+"$  c #616161",
+"%  c gray43",
+"&  c #7C7B7B",
+"*  c #717171",
+"=  c #BC211E",
+"-  c #B82827",
+";  c #B23433",
+":  c #BB1A1A",
+">  c #C90B0A",
+",  c #D30202",
+"<  c #DC0000",
+"1  c #D20A0A",
+"2  c #C31615",
+"3  c #E40000",
+"4  c #EC0000",
+"5  c #F30000",
+"6  c #FE0202",
+"7  c #C92828",
+"8  c #CB3036",
+"9  c #CE342F",
+"0  c #B17437",
+"q  c #B76F27",
+"w  c #BD6A18",
+"e  c #D46E09",
+"r  c #E66C00",
+"t  c #F47301",
+"y  c #FD7D01",
+"u  c #FB7600",
+"i  c #ED7000",
+"p  c #CC7926",
+"a  c #AD4545",
+"s  c #BC4A4A",
+"d  c #AB5757",
+"f  c #B85857",
+"g  c #BF544E",
+"h  c #AF7B48",
+"j  c #AB6969",
+"k  c #B96663",
+"l  c #AB7A7A",
+"z  c #B37878",
+"x  c #BB7169",
+"c  c #C0524C",
+"v  c #C04547",
+"b  c #29B829",
+"n  c #3CAE3B",
+"m  c #40B23E",
+"M  c #02DE02",
+"N  c #07D406",
+"B  c #0AC80A",
+"V  c #00E800",
+"C  c #01FE01",
+"Z  c #01F401",
+"A  c #35C83A",
+"S  c #52B057",
+"D  c #5CBB62",
+"F  c #6DB16E",
+"G  c #3FC242",
+"H  c #43C44E",
+"J  c #BDBD17",
+"K  c #B9B924",
+"L  c #B3B437",
+"P  c #B0AF3E",
+"I  c #FF8302",
+"U  c #C3823C",
+"Y  c #D8D805",
+"T  c #C9C811",
+"R  c #E3E300",
+"E  c #EBEA00",
+"W  c #F3F300",
+"Q  c #FEFE02",
+"!  c #F7FB03",
+"~  c #C5CA3B",
+"^  c #CDCB25",
+"/  c #AF8156",
+"(  c #ADAD47",
+")  c #B1B353",
+"_  c #B1B155",
+"`  c #B6997B",
+"'  c #B28968",
+"]  c #B3B365",
+"[  c #B6B877",
+"{  c #AEAD70",
+"}  c #C2A069",
+"|  c #C2C349",
+" . c #680A8E",
+".. c #690393",
+"X. c #6A009A",
+"o. c #6B178C",
+"O. c #7400A4",
+"+. c #7701AC",
+"@. c #7C00B1",
+"#. c #3546BF",
+"$. c #4B57B3",
+"%. c #414FB7",
+"&. c #5B67B1",
+"*. c #6D75AC",
+"=. c #6A73B3",
+"-. c #2C3DD8",
+";. c #1F39F2",
+":. c #243CEC",
+">. c #233EFC",
+",. c #3346CC",
+"<. c #2943FC",
+"1. c #2944FF",
+"2. c #334CFE",
+"3. c #3952FF",
+"4. c #3750FF",
+"5. c #4555CC",
+"6. c #777EC1",
+"7. c #5B6DCA",
+"8. c #8203B4",
+"9. c #8501BC",
+"0. c #8804BC",
+"q. c #845996",
+"w. c #8B6799",
+"e. c #947D9D",
+"r. c #9073A6",
+"t. c #7B84B2",
+"y. c #7384C2",
+"u. c #858585",
+"i. c #8D8D8D",
+"p. c #9B9A9A",
+"a. c #959494",
+"s. c #908D8F",
+"d. c #AB8787",
+"f. c #B28B8B",
+"g. c #B38686",
+"h. c #AC9393",
+"j. c #AD9D9C",
+"k. c #B39897",
+"l. c #B28E94",
+"z. c #8DB190",
+"x. c #B3A986",
+"c. c #BEB299",
+"v. c #ADAE91",
+"b. c #9A87A5",
+"n. c #989AB7",
+"m. c #A598A8",
+"M. c #B295A7",
+"N. c #97A3B6",
+"B. c #A3A3A3",
+"V. c #ABABAB",
+"C. c #AAA6AA",
+"Z. c #B3A3A3",
+"A. c #B5AAA8",
+"S. c #B6B7AD",
+"D. c #B7B5A6",
+"F. c #ABACB5",
+"G. c #B8A9B4",
+"H. c #B4B3B3",
+"J. c #BBBBBC",
+"K. c #B7B7B7",
+"L. c #AAB8B0",
+"P. c #C2B8BC",
+"I. c #B2C1BB",
+"U. c #C2C2BD",
+"Y. c #BEBEC5",
+"T. c #ADBFC2",
+"R. c #C3BEC2",
+"E. c #BCC2C3",
+"W. c #BBC7C9",
+"Q. c #B7C9CE",
+"!. c #C3C4C4",
+"~. c #C3C4CD",
+"^. c #C4CDCD",
+"/. c #CCCCCB",
+"(. c #CAC6C5",
+"). c #D3CDCB",
+"_. c #D4D3CB",
+"`. c #DAD8CD",
+"'. c #CDCDDC",
+"]. c #C7C8D3",
+"[. c #CBD3D5",
+"{. c #CCD9D9",
+"}. c #C8D3D9",
+"|. c #D5D5D5",
+" X c #D9D6D6",
+".X c #DADBD6",
+"XX c #D4D3DB",
+"oX c #D4DDDD",
+"OX c #DBDBDB",
+"+X c #D7D8D6",
+"@X c #D1CDD3",
+"#X c #DDE2DB",
+"$X c #E2E5DB",
+"%X c #D7C9E5",
+"&X c #CADAE3",
+"*X c #D4DAE3",
+"=X c #D9D9E3",
+"-X c #E4D9E4",
+";X c #D5E2E2",
+":X c #DBE2E2",
+">X c #DCECEC",
+",X c #E4E6E4",
+"<X c white",
+/* pixels */
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.+X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.+X|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.OX:XOX|.|.|.|.|.OXOX+X|.|.|.|..XOXOXOX|.|.|.|.|.OXOX.X|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|. X;XE.A.!.oX X|. XoXJ.A.^.*X|.|.OX'.J.S.~.OX|.|.OX'.K.H.~.OX+X|.OXOX|.+XOXOX|.+X|.|.|.",
+"|.|.|.|.|.{.j 1 < > l oX X^.d 1 3 2 d.oX X!.( Y Y T v.=XOXY.P Y R K D.XX+XJ.V.~.~.V.J.OX|.|.|.|.",
+"|.|.|.|.;Xj 5 6 6 6 3 l >Xd 6 6 6 6 < h.*X( Q Q Q Q Y S.'.K Q Q Q Q T J.|.S.<XV.V.<XH./.+X|.|.|.",
+"|.|.|.|.^.2 6 6 6 6 6 8 E.> 6 6 6 6 6 s K.Y ! ! Q Q Q _ D.R Q Q Q Q W { *XS./.K.H./.H.|.|.|.|.|.",
+"|.|.|.OXE.1 6 6 6 6 6 7 B.< 6 6 6 6 6 8 v.E Q Q Q Q Q ) v.W Q Q Q Q Q _ *X(.B.|.|.B./.OX|.|.|.|.",
+"|.|.|. X{.; 6 6 6 6 6 s Q.2 6 6 6 6 6 f W.T Q Q Q Q W [ K.Y W Q Q Q E x.=XB.u.H.H.u.B.+X|.|.|.|.",
+"|.|.|.|.#Xk., 6 6 6 > Z.>Xd.< 6 6 6 : J.=X{ R Q Q Q K R.*X] E Q Q W L ]..XV.u.J.K.u.C.+X|.|.|.|.",
+"|.|.|.|.|.oXV.s 9 f H.oX_.oXj.s 8 f J.OX|.XXv.| ~ ] R.=X X'.x.~ ~ { ~.OX+X|.!.+X+X~.|.+X|.|.|.|.",
+"|.|.|.|.|.|.$XJ.N.E.$X|.|. X=XI.z.Q.-X|.|.OX&XC.h.Q.:XXX|.OX&Xm.m.].:X|.|.OX,XOXOX,XOX|.|.|.|.|.",
+"|.|.|.|.+X/.&.-.:.-.*./.#X!.n M Z N F %XOXJ.- 3 4 1 l oX+XH.= 4 4 2 h.OX.XB.# J.J.# B.OX|.|.|.|.",
+"|.|.|.|.$X*.>.3.2.2.;.b.OXS C C C C V z.=X; 6 6 6 6 , Z.{.= 6 6 6 6 , V.,XO   # $   O OX|.|.|.|.",
+"|.|.|.XXU.,.2.2.2.2.2.5.D.N C C C C C G G.3 6 6 6 6 6 f Z.3 6 6 6 6 6 j >Xl X B.B.X *.`.|.|.|.|.",
+"|.+X|.OXU.,.2.2.2.2.2.,.B.V C C C C C A M.3 6 6 6 6 6 s h.5 6 6 6 6 6 d ;XQ.K..X.XP.`.`.+X|.|.|.",
+"|.|.|.|.`.$.2.3.2.3.1.&.).b C C C C C F ].> 6 6 6 6 5 e.U., 6 6 6 6 4 h.:Xp.& V.V.F b.%X|.|.|.|.",
+"|.|.|.|.OXV.-.1.1.>.#.K.-Xz.N C C Z b R.:Xd.< 6 6 5 ; ^.$Xx 3 6 6 5 a {..XF.i.J.P.s.G. X|.|.|.|.",
+"|.|.|.|.|..XJ.=.7.t.U.OX|.OXH.D H F R.OX|.oXA.f g l [. X|.oXk.f c g.[. X|.|.@X|.+X_. X X|.|.|.|.",
+"|.|.|.|.|.OX&Xc.` P.*X X|.OXXXA.f.P.oX X|.OX{.j.h.E.;X|.|.OX[.j.h.W.;X|.|.#X,XOX|.+X X X|.|.|.|.",
+"|.|.+X|.XX^.0 r t r h ^.,XJ.q i u r / [.#XH.: 4 5 < j oXOXj.2 4 5 , l oXOXa.+ V./.B.I.OX|.|.|.|.",
+"|.|.|.|.&X/ u I I I t ' &X0 y I I I i f.&X- 6 6 6 6 < k.}.2 6 6 6 6 , A.,XO   # H.& p.+X|.|.|. X",
+"|.|.|.OXW.e I y y I I p F.e I y I y y U C.3 6 6 6 6 6 f j.4 6 6 6 6 6 j >Xs.O C./.B.U.+X|.|.|.|.",
+"|.|.|.+XE.e I y I y I p V.e I y I I y U m.3 6 6 6 6 6 g h.5 6 6 6 6 6 f ;X/.K.|.@XF./.|.|.|.|.|.",
+"|.|.|.|.{.h y I y I u / &Xq y I I I t ' }.: 6 6 6 6 4 g.W.> 6 6 6 6 3 j.:Xp.& C.M.F p.XX|.|.|.|.",
+"|.|.|.|.OXJ.p t u t q R.:XA.e u y t 0 ~.:Xh., 6 6 4 a [.:Xd., 6 6 3 d oX XH.a.!.R.a.H.+X|.|.|.|.",
+"|.|.|.|.|.OXY.` } ` ^.oX|.OXE.` ' k.[.+X|.oXJ.z x k.{.OX|.oXH.x x Z.{.|.|.+X|.+XXXXXXX+X|.|.|.|.",
+"|.|.|.|.|.+X/.n.y.N._.+X|. X~.v.[ D.'.|.|.OX~.f.l A.=X|.|.OXY.b.r.H.#X|.|.OXOXOX X-XOX|.|.|.|.|.",
+"|.|.|.|.OXI.%.:.<.:.$.(.-XS.J W Q E ( ~.:XZ.> 5 6 3 d {.OXm...O.+...w.#XOXu.o B.B.o u.OX|.|.|.|.",
+"|.|.|.|.`.&.>.3.4.3.;.*.|.L Q Q Q Q W { }.= 6 6 6 6 3 f.^. .9.8.8.0.X.m.,XO   $ $   O OX|.|.|.|.",
+"|.|.|.OXU.,.4.2.2.2.4.5.D.Y Q Q Q Q Q ~ m.4 6 6 6 6 6 g n.O.8.8.@.8.+.q.$XB.@ J.H.# B.OX|.|.|.|.",
+"|.|.|.OX(.,.2.2.2.2.2.,.D.Y Q Q Q ! Q ~ m.3 6 6 6 6 6 g m.O.8.@.8.8.@.q.#XY.J.(.@XH./. X|.|.|.|.",
+"|.|.|.|.`.&.>.3.3.3.<.*.|.L Q Q Q Q W { '.- 6 6 6 6 3 l.^.o.9.8.8.9.X.C.|.H.<XF.B.& p.XX|.|.|.|.",
+"|.|.|.|.OXU.%.:.<.:.$.(.#XH.J W ! R ( ].=XZ.2 5 6 < d {.OXm. .O.+...w.OX|.H.H.J.!.p.J.OX|.|.|.|.",
+"|.|.|.|.|.OX_.n.=.F.`..X|.OX].c.[ P.XX X|.OX^.l.l S.;X X|.OX(.b.b.J.#X|. X|./.|.+XOX|.|.|.|.|.|.",
+"|.|.|.|.|.XX~.[ | c.~.XX|.OXE.F S z.@X-X|.OXK.x k l.[.+X|.OXH.w.w.m.+X+X|.OX|.OXOX_.OX|.|.|.+X|.",
+"|.|.|.|.OXK.T W Q W K J.-XB.B C C Z b R.;Xh., 6 6 5 a [..Xe...+.+.X.*.). X* . p.a.. * OX|.|.|.|.",
+"|.|.|.|.'.L Q Q Q Q Q ) '.b C C C C Z F @X2 6 6 6 6 5 g.~. .8.8.8.0.O.b.$XO   $ $   + #X|.|.|.|.",
+"|.|.|.OXY.T Q Q Q Q Q ^ C.V C C C C C A M.3 6 6 6 6 6 c n.O.8.8.8.8.@.q.$XK.* (./.% K.OX|.|.|.|.",
+"|.|.|.OXY.T Q Q Q Q ! ^ F.N C C C C C G M.3 6 6 6 6 6 f n.X.0.8.8.8.+.w.,Xs.+ A.V.+ s.OX|.|.|.|.",
+"|.|.|.|.*X_ ! Q Q Q W { %Xm C C C C V { &X; 6 6 6 6 < k.[.o.@.8.8.9...V.:XO   # $   O OX|.|.|.|.",
+"|.|.|.|.|.~.P R W R ( ].#XR.b V Z M S %XoXH.- 3 5 , j oXOXF.o.O.O...b.OXOXp.@ H.H.+ p.OX|.|.|.|.",
+"|.|.|.|.|. X'.D.x.S.XX|.|.OX%Xv.z.L.=X|.@XOX[.k.f.J.;X X|.OX/.m.b.U.OX|.|.OX,X=XOX,XOX|.|.|.|.+X",
+"|.|.|.|.|.|./.J.F.E.|.|.|.|.^.Y.G.R._.|.|.|./.K.L.!._.|.|.|.~.K.H.(.|.|.|.|.|.|.|.|.|.|.+X|.|.|.",
+"|.|.|.|.|.|.|./.)./.|.|.|.|.[./.^.@X|.|.|.|.@X/.@X/.|.+X|.|.@X/././.+X+X|.|.|.|.|.|.|.+X|.|.+X|.",
+"|.+X|.|.|.|.|.+XXX+X|.|.|.|.|. X+X+X|.|.|.|.|.+X+X+X|.|.|.|.|.+XXX+X|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"+X|.+X|.|.|.|.|.+X|.|.|.|.|.|.|.|.|.|.+X|.|.|.|.|.|.|.|.|.|.|.|.|.+X|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.+X|.|.|.|.|.|.|.|.|.|.|.|.|.+X|.|.|.|.|.|.+X|.|.|.|.|.|.+X|.|.|.|.|.|.|.|.|.|.|."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/guess-web.png b/icons/guess-web.png
new file mode 100644 (file)
index 0000000..661bb5d
Binary files /dev/null and b/icons/guess-web.png differ
diff --git a/icons/guess.ico b/icons/guess.ico
new file mode 100644 (file)
index 0000000..9237250
Binary files /dev/null and b/icons/guess.ico differ
diff --git a/icons/guess.rc b/icons/guess.rc
new file mode 100644 (file)
index 0000000..d6ab798
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "guess.ico"
diff --git a/icons/inertia-16d24.png b/icons/inertia-16d24.png
new file mode 100644 (file)
index 0000000..da44eb5
Binary files /dev/null and b/icons/inertia-16d24.png differ
diff --git a/icons/inertia-16d4.png b/icons/inertia-16d4.png
new file mode 100644 (file)
index 0000000..32b0792
Binary files /dev/null and b/icons/inertia-16d4.png differ
diff --git a/icons/inertia-16d8.png b/icons/inertia-16d8.png
new file mode 100644 (file)
index 0000000..9620641
Binary files /dev/null and b/icons/inertia-16d8.png differ
diff --git a/icons/inertia-32d24.png b/icons/inertia-32d24.png
new file mode 100644 (file)
index 0000000..3184683
Binary files /dev/null and b/icons/inertia-32d24.png differ
diff --git a/icons/inertia-32d4.png b/icons/inertia-32d4.png
new file mode 100644 (file)
index 0000000..eaa93dd
Binary files /dev/null and b/icons/inertia-32d4.png differ
diff --git a/icons/inertia-32d8.png b/icons/inertia-32d8.png
new file mode 100644 (file)
index 0000000..c3c70f0
Binary files /dev/null and b/icons/inertia-32d8.png differ
diff --git a/icons/inertia-48d24.png b/icons/inertia-48d24.png
new file mode 100644 (file)
index 0000000..b86be48
Binary files /dev/null and b/icons/inertia-48d24.png differ
diff --git a/icons/inertia-48d4.png b/icons/inertia-48d4.png
new file mode 100644 (file)
index 0000000..894d2d6
Binary files /dev/null and b/icons/inertia-48d4.png differ
diff --git a/icons/inertia-48d8.png b/icons/inertia-48d8.png
new file mode 100644 (file)
index 0000000..71b1ccd
Binary files /dev/null and b/icons/inertia-48d8.png differ
diff --git a/icons/inertia-base.png b/icons/inertia-base.png
new file mode 100644 (file)
index 0000000..329028f
Binary files /dev/null and b/icons/inertia-base.png differ
diff --git a/icons/inertia-ibase.png b/icons/inertia-ibase.png
new file mode 100644 (file)
index 0000000..ab303d1
Binary files /dev/null and b/icons/inertia-ibase.png differ
diff --git a/icons/inertia-ibase4.png b/icons/inertia-ibase4.png
new file mode 100644 (file)
index 0000000..dfa5e89
Binary files /dev/null and b/icons/inertia-ibase4.png differ
diff --git a/icons/inertia-icon.c b/icons/inertia-icon.c
new file mode 100644 (file)
index 0000000..7812e5c
--- /dev/null
@@ -0,0 +1,546 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 248 2 ",
+"   c #D5D5D5",
+".  c #CECECE",
+"X  c gray85",
+"o  c gainsboro",
+"O  c gray81",
+"+  c #D0D0D0",
+"@  c gray83",
+"#  c gray82",
+"$  c #D2D2D2",
+"%  c LightGray",
+"&  c #D2D2D2",
+"*  c gray84",
+"=  c #D5D5D5",
+"-  c #D5D5D5",
+";  c #D5D5D5",
+":  c #D5D5D5",
+">  c #D2D2D2",
+",  c #E4E4E4",
+"<  c gray59",
+"1  c #717171",
+"2  c #E2E2E2",
+"3  c #CECECE",
+"4  c gray72",
+"5  c gray78",
+"6  c gray",
+"7  c gray75",
+"8  c #E6E6E6",
+"9  c gray91",
+"0  c #E6E6E6",
+"q  c #E9E9E9",
+"w  c gray84",
+"e  c #D0D0D0",
+"r  c gainsboro",
+"t  c #9D9D9D",
+"y  c #353535",
+"u  c gray3",
+"i  c #6F6F6F",
+"p  c gray80",
+"a  c gray73",
+"s  c #D8D8D8",
+"d  c gray82",
+"f  c gray72",
+"g  c gray90",
+"h  c gray88",
+"j  c #DDDDDD",
+"k  c #E1E1E1",
+"l  c #C8C8C8",
+"z  c #CECECE",
+"x  c #DDDDDD",
+"c  c gray31",
+"v  c #0C0C0C",
+"b  c gray3",
+"n  c #1D1D1D",
+"m  c #B9B9B9",
+"M  c #D7D7D7",
+"N  c gray84",
+"B  c gray85",
+"V  c #CDCDCD",
+"C  c #E2E2E2",
+"Z  c #E1E1E1",
+"A  c gray87",
+"S  c #E2E2E2",
+"D  c #CBCBCB",
+"F  c gray81",
+"G  c #D7D7D7",
+"H  c #D7D7D7",
+"J  c #3C3D3D",
+"K  c #131313",
+"L  c #B9B9B9",
+"P  c LightGray",
+"I  c gray68",
+"U  c #D1D2D2",
+"Y  c #C6C6C6",
+"T  c #B2B2B2",
+"R  c #E7E7E7",
+"E  c #DFDFDF",
+"W  c #DFDFDF",
+"Q  c #E1E1E1",
+"!  c #CACACA",
+"~  c #CECECE",
+"^  c #D3D2D2",
+"/  c #D4D5D5",
+"(  c #C9C8C8",
+")  c #B8B5B5",
+"_  c #D9DBDB",
+"`  c gray79",
+"'  c #C7C8C8",
+"]  c #CCC9C9",
+"[  c #C7C6C6",
+"{  c #CBCCCC",
+"}  c #D0D0D0",
+"|  c #CBCBCB",
+" . c gray77",
+".. c gray80",
+"X. c gray",
+"o. c #D2D2D2",
+"O. c #D4D5D5",
+"+. c #DBD6D6",
+"@. c #B8C1C1",
+"#. c #A8BDBD",
+"$. c #D8D1D1",
+"%. c #CED0D0",
+"&. c #DDD5D5",
+"*. c #A5B9B9",
+"=. c #B9C2C2",
+"-. c #D8D3D3",
+";. c #DADBDB",
+":. c gray71",
+">. c #222222",
+",. c #A5A5A5",
+"<. c #E1E1E1",
+"1. c gray81",
+"2. c #DAD9D9",
+"3. c #B9BFBF",
+"4. c #8ADEDE",
+"5. c #8CF4F4",
+"6. c #A2BCBC",
+"7. c #D6CECE",
+"8. c #A2BCBC",
+"9. c #8DF4F4",
+"0. c #89DEDE",
+"q. c #BCC3C3",
+"w. c #AAA8A8",
+"e. c #2A2A2A",
+"r. c #2A2A2A",
+"t. c #040404",
+"y. c gray62",
+"u. c #DADADA",
+"i. c #DAD9D9",
+"p. c #B9BFBF",
+"a. c #8BDFDF",
+"s. c #8DF5F5",
+"d. c #A1BCBC",
+"f. c #D6CECE",
+"g. c #A2BCBC",
+"h. c #8DF4F4",
+"j. c #89DEDE",
+"k. c #BCC2C2",
+"l. c #AFADAD",
+"z. c #141515",
+"x. c black",
+"c. c #0B0B0B",
+"v. c #9D9D9D",
+"b. c #DADADA",
+"n. c #D3D4D4",
+"m. c #DDD8D8",
+"M. c #B7BFBF",
+"N. c #A2B7B7",
+"B. c #DBD3D3",
+"V. c #CDD0D0",
+"C. c #DDD5D5",
+"Z. c #A5B9B9",
+"A. c #B9C2C2",
+"S. c #D9D4D4",
+"D. c #DBDBDC",
+"F. c #B6B8B6",
+"G. c #232723",
+"H. c #A6A8A6",
+"J. c #DFDFDF",
+"K. c gray81",
+"L. c gray83",
+"P. c #CECFCF",
+"I. c #D3D1D1",
+"U. c #D5D1D1",
+"Y. c #CECFCF",
+"T. c #CCCBCB",
+"R. c #C6C8C8",
+"E. c #CCC9C9",
+"W. c #C8C6C6",
+"Q. c #CACACB",
+"!. c #CCCDCB",
+"~. c #D3C9D3",
+"^. c #CEBCCE",
+"/. c #D2C7D2",
+"(. c #CCCDCC",
+"). c #D2D2D2",
+"_. c #D5D5D5",
+"`. c gray84",
+"'. c #D5D5D5",
+"]. c #D4D5D5",
+"[. c #D7D7D7",
+"{. c #CBCBCB",
+"}. c gray69",
+"|. c #D1D2D2",
+" X c #C5C5C5",
+".X c #B4B6B3",
+"XX c #CAC1CA",
+"oX c #659F65",
+"OX c #21D721",
+"+X c #59A359",
+"@X c #C3B9C3",
+"#X c #D4D7D4",
+"$X c #D5D5D5",
+"%X c #D5D5D5",
+"&X c #D5D5D5",
+"*X c #D5D5D5",
+"=X c gray84",
+"-X c gray79",
+";X c gray83",
+":X c #D7D7D7",
+">X c gray85",
+",X c #D1D2D1",
+"<X c #BEB7BE",
+"1X c #16DA16",
+"2X c green",
+"3X c #09E209",
+"4X c #B3B7B3",
+"5X c #D8D7D8",
+"6X c #D5D5D5",
+"7X c #D5D5D5",
+"8X c #D7D7D7",
+"9X c gray78",
+"0X c gray73",
+"qX c #D7D7D7",
+"wX c gray81",
+"eX c #BABCBA",
+"rX c #C2B7C2",
+"tX c #34B534",
+"yX c #00F900",
+"uX c #26BD26",
+"iX c #B9B2B9",
+"pX c #D6D8D6",
+"aX c #D5D5D5",
+"sX c #D5D5D5",
+"dX c gray82",
+"fX c #BCBCBC",
+"gX c #CACACA",
+"hX c #C1C1C1",
+"jX c gray77",
+"kX c #D4D2D4",
+"lX c #B6B0B6",
+"zX c #9EB99E",
+"xX c #B2AFB2",
+"cX c #D0CED0",
+"vX c #D2D3D2",
+"bX c #D5D5D5",
+"nX c #D5D5D5",
+"mX c gray85",
+"MX c #D5D5D5",
+"NX c #D7D7D7",
+"BX c #D8D8D8",
+"VX c #D4D5D4",
+"CX c #DADBDA",
+"ZX c #E0D9E0",
+"AX c gray86",
+"SX c #D5D6D5",
+"DX c #D5D5D5",
+"FX c white",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+"> , < 1 2 3 4 5 6 7 8 9 0 q w e ",
+"r t y u i p a s d f g h j k l z ",
+"x c v b n m M N B V C Z A S D F ",
+"G H J K L P I U Y T R E W Q ! ~ ",
+"^ / ( ) _ ` ' ] [ { } |  ...X.o.",
+"O.+.@.#.$.%.&.*.=.-.;.:.>.,.<.1.",
+"2.3.4.5.6.7.8.9.0.q.w.e.r.t.y.u.",
+"i.p.a.s.d.f.g.h.j.k.l.z.x.c.v.b.",
+"n.m.M.N.B.V.C.Z.A.S.D.F.G.H.J.K.",
+"L.P.I.U.Y.T.R.E.W.Q.!.~.^./.(.).",
+"_.`.'.].[.{.}.|. X.XXXoXOX+X@X#X",
+"$X%X&X*X=X-X;X:X>X,X<X1X2X3X4X5X",
+"6X6X6X7X8X9X0XqXwXeXrXtXyXuXiXpX",
+"6X6X6XaXsXdXfXgXhXjXkXlXzXxXcXvX",
+"6X6X6X6XbXnXmXMXNXBXVXCXZXAXSXDX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 78 1 ",
+"  c #020202",
+". c #0C0C0C",
+"X c gray15",
+"o c #2B2B2B",
+"O c #3C3C3C",
+"+ c #464646",
+"@ c gray29",
+"# c gray33",
+"$ c #5B5B5B",
+"% c gray38",
+"& c #6C6C6C",
+"* c gray46",
+"= c #13BC13",
+"- c #1FBB1F",
+"; c #2DAD2D",
+": c #20B920",
+"> c #3CA53C",
+", c #0ECA0E",
+"< c #00D100",
+"1 c #0AD20A",
+"2 c #12C112",
+"3 c #00E200",
+"4 c #00F200",
+"5 c #02FE02",
+"6 c #4FA34F",
+"7 c #49A849",
+"8 c #628F62",
+"9 c #748574",
+"0 c #758875",
+"q c #7E837E",
+"w c #77A577",
+"e c #7AA07A",
+"r c #7A9595",
+"t c #7C9B9B",
+"y c #69B3B3",
+"u c #74C3C3",
+"i c #77C8C8",
+"p c #808080",
+"a c #8A838A",
+"s c #8D8D8D",
+"d c #928992",
+"f c #949494",
+"g c #9A939A",
+"h c #9C9C9C",
+"j c #A29BA2",
+"k c #9DA2A2",
+"l c #A3A3A3",
+"z c #A8A6A6",
+"x c #ABA2AB",
+"c c #ACACAC",
+"v c #B2A3B2",
+"b c #B2AFB2",
+"n c #BCADBC",
+"m c #B5B5B5",
+"M c #B7B8B7",
+"N c #BBBBBB",
+"B c #BFC2BF",
+"V c #8AEBEB",
+"C c #8DF0F0",
+"Z c #97FBFB",
+"A c #9EFFFF",
+"S c #A2FFFF",
+"D c #C4C4C4",
+"F c #C6C9C6",
+"G c #CCCCCC",
+"H c #D3CCCC",
+"J c #CDD0CD",
+"K c #D5C6D5",
+"L c #DBCBDB",
+"P c #D5D5D5",
+"I c #DED6DE",
+"U c #DBDCDB",
+"Y c #E2DFDF",
+"T c #E3D2E3",
+"R c #E5DBE5",
+"E c #E3E3E3",
+"W c #EEEEEE",
+"Q c #F2F2F2",
+/* pixels */
+"PPPUPPPPIPPPPUPPPPIPPPPUPPPPIPPP",
+"PPGGGPUGGGGJGJJGPJGGJPJJJJGJJJPP",
+"PPPGPm*PJJFDPGmPDNUGPQWQQQQWQPPP",
+"PPPPU$ hEPGPGdMUGfcPUQYEEEEEEmPP",
+"PPUGo   &EJGsGUPPEgcEQUYUUEUUmPP",
+"PPG# mX  hPNMUPPPPJcEQUYEEUEUMPP",
+"PE@ .O.   dYUPPPPPUPUQUYUEEUUmPP",
+"PUcO     &DDFPPPPPPMEQUYEUUEUbPP",
+"PPEN. . +EPFsPUPPEllEQUUUEERUmPP",
+"PPPUBO *PPGPNsFPPlkPUQEEEEEEEmPP",
+"PPPGEz#PPJGGUNcPBcPKEUDDDFDFDcPP",
+"PJFGFJEFGGDDGGPHJJGFFDNNMMNNNNPP",
+"PPPPUGzUPPJGUPUcGUPPFPUW$oEUUGPP",
+"PPPUJfykRPJGPUlytHIPGPP#  ODPGPP",
+"PPUHtVSuhRGFEkuSVrHPDW$.%. OEGJP",
+"PPHtCZZAikPPkuSZACtGG@ og   oNPP",
+"PPJtVAZSikPPkuSZACrGG@      oNPP",
+"PPUJrVSuhRGGRhuSVrHPDW%    OEGHU",
+"PPPUHfyhUPGGPUlytHUPFPP#  ODUGPP",
+"PPPPUJcIPUJJUPUcGUPPGPPW#oEUPGJP",
+"PPGFFGJGFGDDGGJJJJGGBFGHDBJFGDPP",
+"PPPPPPJPPPGGUBcIDcPJDPHxLTmJPFPP",
+"PPPPPUPPPUGPNsFPPjhUGPgr670dGJJP",
+"PPPPPPPPPPJDsPUPPElzPj9155<8gGPP",
+"PPPPPPIPPIJBDIPPPPPNGn;55552xGPP",
+"PPPPPPPPPPGPUJPPPPPUGK=5555<MPGP",
+"PPPPPPUPPPPNNUPPPUGcJx75555:jFPP",
+"PPPPPPPPPPGGsGUPPYfmPc*-44,9jGPP",
+"PPPPPPPPPPGPGsmUJfzUFUlaewagPGPP",
+"PUPPPPPPPUJJUJNUFDUPGPUBIRDPPGPP",
+"PPPPPPUPPPPPPPUPPUPPPPPUPJUPPPPP",
+"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 97 2 ",
+"   c #010101",
+".  c #0B0B0B",
+"X  c #121212",
+"o  c #181818",
+"O  c gray14",
+"+  c gray17",
+"@  c gray20",
+"#  c #3C3C3C",
+"$  c #454545",
+"%  c #4E4E4E",
+"&  c #545454",
+"*  c #5D5D5D",
+"=  c #5E7A7A",
+"-  c gray39",
+";  c #616B6B",
+":  c #6A6A6A",
+">  c #6A7575",
+",  c #617C7C",
+"<  c #6A7979",
+"1  c #757575",
+"2  c #7C7C7C",
+"3  c #1F9F1F",
+"4  c #02AC02",
+"5  c #0DA20D",
+"6  c #05B005",
+"7  c #00BC00",
+"8  c #249424",
+"9  c #3D8C3D",
+"0  c #359335",
+"q  c #389238",
+"w  c #00C100",
+"e  c #00CE00",
+"r  c #00D000",
+"t  c #00D900",
+"y  c #00E200",
+"u  c #00EC00",
+"i  c #01FE01",
+"p  c #468C46",
+"a  c #4F8F4F",
+"s  c #6F896F",
+"d  c #778C77",
+"f  c #7D807D",
+"g  c #788978",
+"h  c #837F83",
+"j  c #5A8484",
+"k  c #5F8989",
+"l  c #5D9696",
+"z  c #5E9A9A",
+"x  c #619C9C",
+"c  c #77D4D4",
+"v  c #7BD3D3",
+"b  c #7EDCDC",
+"n  c #858585",
+"m  c #858885",
+"M  c #8A8A8A",
+"N  c #8B948B",
+"B  c #938893",
+"V  c #9C8E9C",
+"C  c #939393",
+"Z  c #9C939C",
+"A  c #9C9B9B",
+"S  c #9EA19E",
+"D  c #A297A2",
+"F  c #A39EA3",
+"G  c #A4A4A4",
+"H  c #A7AAA7",
+"J  c #ACA4AC",
+"K  c #ADADAD",
+"L  c #B5ADAD",
+"P  c #B5A8B5",
+"I  c #B4B3B3",
+"U  c #B7B8B7",
+"Y  c #BCBCBC",
+"T  c #BFC2BF",
+"R  c #CDBCCD",
+"E  c #88E7E7",
+"W  c #8BECEC",
+"Q  c #93F6F6",
+"!  c #96FBFB",
+"~  c #9BFEFE",
+"^  c #A3FFFF",
+"/  c #C4C4C4",
+"(  c #C8C2C2",
+")  c #CACACA",
+"_  c #CFD0CF",
+"`  c #D5D5D5",
+"'  c #D4D8D4",
+"]  c #D7D9D9",
+"[  c #DBDCDC",
+"{  c #E0DEDE",
+"}  c #E6D7E6",
+"|  c #E6D8E6",
+" . c #E2E2E2",
+".. c #EAE7EA",
+"X. c #ECECEC",
+"o. c #F1F1F1",
+"O. c #FCFCFC",
+/* pixels */
+"` ` ` ` ` ` ` ` ` ` ` ` ` ] ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ] ` ` ` ` ` ` ` ",
+"` ` ` ` ` ` ` ] ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ] ` ' ` ` ` ` ` ` ' ` ] ` ` ` ` ` ",
+"` ` ` ` ] ` ] ] ] ] ` ] ] ` [ ` ` ` [ ` ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ` ] ] ] ] ] ` ` ` ` ` ",
+"` ` ` ` ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) / ) ) ) ) ) ( ) ) ( ) ) ) / ) / ) ) ) / ) ) / ) ` ` ] ` ",
+"` ` ` ` ) ) ) ) ) T Y / ) ) ) ) ( ( ) ) ` _ ) ) ) ) ` ) ) ( _ o.o.o.o.o.o.o.o.o.o.X.o._ ` ' ` ` ",
+"` ` ` ` ` ` ` [ ..#   K ..` ] ] ) ) '  .I f ) ] ` m G  .] _ [ O.o.o.o.o.o.o.o.o.o.o. .U ` ' ` ` ",
+"` ` ` ` ` ` ] ` M X   % Y { ` ` ) )  .A 2 / ] ` ` ) m M { ) | O.] [ [ [ ] [ ] [ [  ./ K ` ` ` ` ",
+"` ` ` ` ` ` _ #         . A [ ` / ` I 2 { ] ` ` ` ]  .M S ] ] O.[ {  .{  . . . .|  ./ K ] ` ` ` ",
+"` ` ` ` ] o.*   @ $       X / ..) ) 2 ) ] ` ' ` ` ` ` ` 2 / { O.[  .{ {  .[  .[ {  ./ K ] ` ` ] ",
+"` ` ` [ I 1 o   H O..       % A ) ) / ` ` ` ` ` ` ` ` ] ) / [ O.[ [ [  .[  .[  .[ ../ L [ ` ` ` ",
+"` ` `  .n       . .           O ) ) [ ` ` ` ` ` ` ` ` ` [ ) [ O.[  .[  . .[  .[ {  ./ K ` ` ` ` ",
+"` ` ` { A @ .               O - ) ) ] ` ` ` ` ` ` ` ` ` ] ) { O.[ [  .[ [  .[  . . .) L ` ` ` ` ",
+"` ` ` ` [ ..$               I X./ ) M ` ` ` ` ` ` ` ` [ M / { O.{ { {  . .[  .[ [  .) K ` ` ` ` ",
+"` ` ` ` ` ] I o           : [ ` / ] A C ..` ` ` ` _ ..G M ` ] O.]  . .[ [  .[  .[  ./ I ] ` ` ` ",
+"` ` ` ` ` ` { Y % .   O M ] ` ` ) ) ] f A ] ] ` ` [ H 1 ` _ [ O.] { { { { {  .[ [  ./ K ] ` ` ` ",
+"` ` ` ` ` ` ` ] ..+   G X.` ` ] ) _ ` [ B 2 ) [ ` n n ` [ ) [ O. . . . . . . . . . .) I ] ` ` ` ",
+"` ` ` ` _ ` ` _ _ G C / ` ` _ ` ( ) ` ` [ / ) ` _ T ] ` ` ) [ ..I I I I I I I I I U K I ` ` ` ` ",
+"` ` ` ` / / ( / / ) _ / R / ( ( Y Y / / T ) / T ( ) T / / T Y / Y Y Y Y ) ) Y Y Y Y Y Y ` ` ` ` ",
+"` ` ` ` ` ` ` ] ] [ [ ` _ ' ` [ ) _ ` ` ] ` ] { ] ' ] ] ` _ / ] ] ] [ _ % * ` ] ` ] ] / ` ` ` ` ",
+"` ` ` ` ` ` ` ` { A > ` ] ` ` ` ) ) ] ` ` { / ; I | _ ` ` _ ) ] ` `  .A   . I [ ` ` ` / ` ] ` ` ",
+"` ` ] ` ` ` `  .A x v < _ [ _ [ ) ) ` ` [ R , b k L [ ` ` _ ) ` ` ` &         : ] ` ` / ' ` ` ` ",
+"` ` ` ` ` ` { A x ~ ^ v > _ [ ` ) ) ` [ ( = E ^ Q j L  .` ` ( `  .&             :  .` ( ` ] ` ` ",
+"` ` ` ` ` { A l ~ ~ Q ^ v > _ { / ) [ ( = E ^ ! ~ ! j L  .) / ` A      .I       X I _ / ` ] ` ` ",
+"` ` ` ` { A l ~ ~ ~ ~ ~ ^ E > ` ) _ ) = W ~ ! ~ ! ~ ! j I ` ` $       : %           * ` ) ` ` ` ",
+"` ` ` ` [ A z ^ ~ ~ ~ ! ^ b > ` / ` ) = W ^ ! ! ! ^ ! j I ` ` $                     * ` _ ] ` ` ",
+"` ` ` ` `  .A l ~ ~ Q ^ v > ` { ) ) [ ( = W ^ ! ~ ! j L  .) ( ` A               X K _ / ` ` ` ` ",
+"` ` ` ] ` `  .A l ~ ^ v < ` ` ` / ) ` [ ( = E ^ Q j L [ ` _ / ]  .&             : ..] / ` ` ` ` ",
+"` ` ` ` ` ` `  .A x v < _ [ ` ` ) ) ` ` [ ( , b k L  .` ` ` / ` ] ` &       . : ] ` ' ( ` ` ` ` ",
+"` ` ` ` ` ` ` ` | A > ` ] ` ` ] ) ) ] ` ` ] / ; I [ _ ` ` ) / ] ` ` { S     I  .` ` ` / ` ` ` ` ",
+"` ` ` ` ` ` ` ` ` { { ] ` ] ` ] ) ) [ ] ` ` [ { [ ' ] ' ] ` ) ] ] ` ] ) % * ` ` ` ` ] / ` ` ` ` ",
+"' ` ` ` / ( / / / / / / / / / / Y T / ( / ) / / / ) R T / / Y ( / / / ) ` ` / / / / / Y ` ` ` ` ",
+"` ` ` ' _ _ ` ` _ ` _ _ _ ` ` ` / / ` ` [ / ) ` ) T ] ` ` ) / ' _ ] ) T ` ` / _ ] ) ` / ` ` ` ` ",
+"` ` ` ` ` ] ` ` ] ` ` ] ` ` ` [ ) ) ] ] C 2 ) [ ` m m _ ] ` / ` { K 2 P R R J 2 U | ` / ` ` ` ` ",
+"` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ] ) ) [ f A [ ` ` ` | H 1 ` _ / | G n C q 5 5 p Z 2 K [ T ` ` ` ` ",
+"` ` ] ` ` ` ` ` ` ` ` ] ` ` ` ] ( ` A C  .` ` ` ` `  .H m ] ) T 2 C 4 i i i i 5 A 2 ) ) ` ` ` ` ",
+"` ` ` ` ] ` ` ` ` ` ` ` ` ` ` ` ) ) n ` ` ` ` ` ` ` ` [ M / _ A V 3 i i i i i i 0 Z H ) ` ] ` ` ",
+"` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ] / ) ` ` ` ` ` ` ` ` ` ` ] _ /  .N e i i i i i i 7 S [ / ` ` ` ` ",
+"` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ] ) ) [ ` ` ` ` ` ` ` ` ` ] ` T ..d y i i i i i i r C ..T ` ` ` ` ",
+"` ] ` ` ` ` ` ` ` ` ` ` ` ` ` ] ) ) / ` ` ` ` ` ` ` ` ` ) ) ( ` C w i i i i i i 6 F _ / ` ` ` ` ",
+"` ` ` ` ` ] ` ` ` ` ` ` ` ` ` ] ) _ 2 ) ] ` ` ` ` ` ` ` 1 ) _ A V q i i i i i u a B H ) ` ` ` ` ",
+"` ` ` ] ` ` ` ` ` ` ` ` { ` ` ` / ` I 2 { ] ` ` ` ] ..M A [ / ` 2 Z 8 y i i t q D f ] T ` ` ` ` ",
+"` ` ` ` ` ` ] ` ` ` ` ` ` ` ` ` ) )  .A 2 ) ] ` ` ) n M [ _ / [ Y 2 Z d 9 9 g V 2 ) ] R _ ] ` ` ",
+"` ` ` ` ` ` ` ` ] ` ` ` ` ` ` ] ) ) ] { K 2 ) ] ` n G { ] _ R ` [ ) m I } } J N ` ] ` / ` ` ` ' ",
+"` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ) ) ` ` [ [ ` ` ` ` [ ` ` ` ( { ` ] [ _ ` ` ` { ` ` ` ) ` ` ` ` ",
+"` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ",
+"` { ` ` ` ` ` ` ` ` ` ` ` ` ` ] ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ",
+"` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ",
+"` ` ` ` ` ` ` ` ` ` ` { ` ` ` ` ] ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ] ` ` ] ` ` ` ` ` "
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/inertia-web.png b/icons/inertia-web.png
new file mode 100644 (file)
index 0000000..8e83c80
Binary files /dev/null and b/icons/inertia-web.png differ
diff --git a/icons/inertia.ico b/icons/inertia.ico
new file mode 100644 (file)
index 0000000..58ba5a9
Binary files /dev/null and b/icons/inertia.ico differ
diff --git a/icons/inertia.rc b/icons/inertia.rc
new file mode 100644 (file)
index 0000000..cc3dceb
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "inertia.ico"
diff --git a/icons/keen-16d24.png b/icons/keen-16d24.png
new file mode 100644 (file)
index 0000000..ba7e2ac
Binary files /dev/null and b/icons/keen-16d24.png differ
diff --git a/icons/keen-16d4.png b/icons/keen-16d4.png
new file mode 100644 (file)
index 0000000..d7f65db
Binary files /dev/null and b/icons/keen-16d4.png differ
diff --git a/icons/keen-16d8.png b/icons/keen-16d8.png
new file mode 100644 (file)
index 0000000..24d206e
Binary files /dev/null and b/icons/keen-16d8.png differ
diff --git a/icons/keen-32d24.png b/icons/keen-32d24.png
new file mode 100644 (file)
index 0000000..ba37160
Binary files /dev/null and b/icons/keen-32d24.png differ
diff --git a/icons/keen-32d4.png b/icons/keen-32d4.png
new file mode 100644 (file)
index 0000000..d2674e9
Binary files /dev/null and b/icons/keen-32d4.png differ
diff --git a/icons/keen-32d8.png b/icons/keen-32d8.png
new file mode 100644 (file)
index 0000000..abad710
Binary files /dev/null and b/icons/keen-32d8.png differ
diff --git a/icons/keen-48d24.png b/icons/keen-48d24.png
new file mode 100644 (file)
index 0000000..8e2aa64
Binary files /dev/null and b/icons/keen-48d24.png differ
diff --git a/icons/keen-48d4.png b/icons/keen-48d4.png
new file mode 100644 (file)
index 0000000..a96e876
Binary files /dev/null and b/icons/keen-48d4.png differ
diff --git a/icons/keen-48d8.png b/icons/keen-48d8.png
new file mode 100644 (file)
index 0000000..b566eca
Binary files /dev/null and b/icons/keen-48d8.png differ
diff --git a/icons/keen-base.png b/icons/keen-base.png
new file mode 100644 (file)
index 0000000..29c0a93
Binary files /dev/null and b/icons/keen-base.png differ
diff --git a/icons/keen-ibase.png b/icons/keen-ibase.png
new file mode 100644 (file)
index 0000000..6dc0e06
Binary files /dev/null and b/icons/keen-ibase.png differ
diff --git a/icons/keen-ibase4.png b/icons/keen-ibase4.png
new file mode 100644 (file)
index 0000000..04065d9
Binary files /dev/null and b/icons/keen-ibase4.png differ
diff --git a/icons/keen-icon.c b/icons/keen-icon.c
new file mode 100644 (file)
index 0000000..09734ca
--- /dev/null
@@ -0,0 +1,667 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 241 2 ",
+"   c gray2",
+".  c #202020",
+"X  c #272727",
+"o  c #272727",
+"O  c gray13",
+"+  c gray13",
+"@  c gray14",
+"#  c #161616",
+"$  c gray10",
+"%  c #272727",
+"&  c gray16",
+"*  c gray13",
+"=  c gray13",
+"-  c #232323",
+";  c #1E1E1E",
+":  c #010101",
+">  c #2A2A2A",
+",  c #979797",
+"<  c #A9A9A9",
+"1  c #D0D0D0",
+"2  c gray88",
+"3  c gainsboro",
+"4  c gray92",
+"5  c #9A9A9A",
+"6  c #868686",
+"7  c #9D9D9D",
+"8  c #B5B4B5",
+"9  c #E6E2E6",
+"0  c gray87",
+"q  c #E6E6E6",
+"w  c #C6C6C6",
+"e  c gray4",
+"r  c gray16",
+"t  c gray65",
+"y  c gray75",
+"u  c #D8D8D8",
+"i  c #E9E9E9",
+"p  c gray90",
+"a  c #F4F4F4",
+"s  c #9F9F9F",
+"d  c gray56",
+"f  c #BBBBBB",
+"g  c #C6CAC6",
+"h  c #CBDCCB",
+"j  c #E8E7E8",
+"k  c #EFEFEF",
+"l  c #CECECE",
+"z  c gray4",
+"x  c gray13",
+"c  c gray90",
+"v  c #EEEEEE",
+"b  c #E9E9E9",
+"n  c gray90",
+"m  c gray89",
+"M  c #F3F3F3",
+"N  c #959595",
+"B  c #BFC0BF",
+"V  c #FBF8FB",
+"C  c #D7E2D7",
+"Z  c #68B368",
+"A  c #73B773",
+"S  c #FAF2FA",
+"D  c #C9CBC9",
+"F  c gray4",
+"G  c #222222",
+"H  c gray87",
+"J  c #E7E7E7",
+"K  c gray90",
+"L  c #E6E6E6",
+"P  c gray89",
+"I  c #F4F4F4",
+"U  c gray59",
+"Y  c #BABBBA",
+"T  c #EEEEEE",
+"R  c #E6E4E6",
+"E  c #74B874",
+"W  c #94C494",
+"Q  c #F8F1F8",
+"!  c #CACBCA",
+"~  c gray4",
+"^  c #222222",
+"/  c gray87",
+"(  c #E7E7E7",
+")  c #E4E4E4",
+"_  c gray90",
+"`  c #E2E2E2",
+"'  c #F3F3F3",
+"]  c #959595",
+"[  c #B8B9B8",
+"{  c #F5F0F5",
+"}  c #BCD3BC",
+"|  c #42A342",
+" . c #A4C9A4",
+".. c #EFECEF",
+"X. c #C8C9C8",
+"o. c gray4",
+"O. c #222222",
+"+. c #E4E4E4",
+"@. c gray93",
+"#. c gray92",
+"$. c gray92",
+"%. c gray91",
+"&. c #F9F9F9",
+"*. c gray60",
+"=. c gray78",
+"-. c #FBFCFB",
+";. c #F3F2F3",
+":. c #FDF7FD",
+">. c #F3F2F3",
+",. c #FBFBFB",
+"<. c gray85",
+"1. c #0B0B0B",
+"2. c #1E1E1E",
+"3. c #C5C5C5",
+"4. c #CDCDCD",
+"5. c #CACACA",
+"6. c #CBCBCB",
+"7. c #C8C8C8",
+"8. c #D7D7D7",
+"9. c gray51",
+"0. c gray49",
+"q. c #A9A9A9",
+"w. c #9C9D9C",
+"e. c #9C9D9C",
+"r. c #959595",
+"t. c #9A9A9A",
+"y. c #848484",
+"u. c #060606",
+"i. c #202020",
+"p. c #D2D2D2",
+"a. c #DADADA",
+"s. c #D8D8D8",
+"d. c #D8D8D8",
+"f. c #D5D5D5",
+"g. c #E4E4E4",
+"h. c #939393",
+"j. c #6F6F6F",
+"k. c gray40",
+"l. c gray46",
+"z. c #949394",
+"x. c gray71",
+"c. c #C6C7C6",
+"v. c #929192",
+"b. c black",
+"n. c #222222",
+"m. c gray89",
+"M. c gray92",
+"N. c #E9E9E9",
+"B. c #E9E9E9",
+"V. c #E7E7E7",
+"C. c #F6F6F6",
+"Z. c #A0A0A0",
+"A. c gray57",
+"S. c #898A89",
+"D. c #9F9E9F",
+"F. c #AEADAE",
+"G. c #E0E3E0",
+"H. c #FEFEFE",
+"J. c gray73",
+"K. c #222222",
+"L. c #DFDFDF",
+"P. c gray91",
+"I. c gray90",
+"U. c #E6E6E6",
+"Y. c gray89",
+"T. c #F4F4F4",
+"R. c gray58",
+"E. c #C0C1C0",
+"W. c #FFFDFF",
+"Q. c #C4DBC4",
+"!. c #36A436",
+"~. c #A8CBA8",
+"^. c #FAF4FA",
+"/. c #AFB0AF",
+"(. c #222222",
+"). c #DFDFDF",
+"_. c gray91",
+"`. c gray90",
+"'. c #E6E6E6",
+"]. c gray89",
+"[. c gray59",
+"{. c #B9BAB9",
+"}. c #F3F0F3",
+"|. c #D0DCD0",
+" X c #69B369",
+".X c #64B064",
+"XX c #FDF6FD",
+"oX c #B0B1B0",
+"OX c #DDDDDD",
+"+X c #E6E6E6",
+"@X c gray89",
+"#X c #E4E4E4",
+"$X c #E1E1E1",
+"%X c #F1F1F1",
+"&X c gray58",
+"*X c gray73",
+"=X c #F3F0F3",
+"-X c #CDDACD",
+";X c #6FB56F",
+":X c #81BB81",
+">X c #FAF4FA",
+",X c #AFB1AF",
+"<X c #232323",
+"1X c gray92",
+"2X c #F4F4F4",
+"3X c #F1F1F1",
+"4X c gray95",
+"5X c #EFEFEF",
+"6X c white",
+"7X c #9D9D9D",
+"8X c #C1C1C1",
+"9X c gray97",
+"0X c #EAEAEA",
+"qX c #E1E8E1",
+"wX c #F2EDF2",
+"eX c #F9F9F9",
+"rX c #B7B7B7",
+"tX c gray10",
+"yX c gray68",
+"uX c #B4B4B4",
+"iX c #B2B2B2",
+"pX c #B2B2B2",
+"aX c gray69",
+"sX c gray74",
+"dX c gray46",
+"fX c #A9A9A9",
+"gX c #D4D5D4",
+"hX c #CBCBCB",
+"jX c #CECDCE",
+"kX c gray79",
+"lX c #D6D7D6",
+"zX c gray62",
+"xX c black",
+"cX c black",
+"vX c #090909",
+"bX c gray4",
+"nX c gray4",
+"mX c #090A09",
+"MX c gray4",
+"NX c gray4",
+"BX c gray3",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+"> , < 1 2 3 4 5 6 7 8 9 0 q w e ",
+"r t y u i p a s d f g h j k l z ",
+"x c v b n m M N B V C Z A S D F ",
+"G H J K L P I U Y T R E W Q ! ~ ",
+"^ / ( ) _ ` ' ] [ { } |  ...X.o.",
+"O.+.@.#.$.%.&.*.=.-.;.:.>.,.<.1.",
+"2.3.4.5.6.7.8.9.0.q.w.e.r.t.y.u.",
+"i.p.a.s.d.f.g.h.j.k.l.z.x.c.v.b.",
+"n.m.M.N.B.V.C.Z.A.S.D.F.G.H.J.b.",
+"K.L.P.I.U.Y.T.R.E.W.Q.!.~.^./.b.",
+"(.)._.`.'.].I [.{.}.|. X.XXXoXb.",
+"+ OX+X@X#X$X%X&X*X=X-X;X:X>X,Xb.",
+"<X1X2X3X4X5X6X7X8X9X0XqXwXeXrXb.",
+"tXyXuXiXpXaXsXdXfXgXhXjXkXlXzXb.",
+"b.b.b.b.b.xXb.cXvXbXnXmXMXNXBXb."
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 230 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray4",
+"@  c #0C0C0C",
+"#  c #1E1E1E",
+"$  c #222222",
+"%  c #232323",
+"&  c #252525",
+"*  c #272727",
+"=  c #2A2A2A",
+"-  c gray17",
+";  c gray18",
+":  c #2F2F2F",
+">  c gray19",
+",  c #313131",
+"<  c #323232",
+"1  c gray20",
+"2  c #343434",
+"3  c gray21",
+"4  c #373737",
+"5  c gray22",
+"6  c #393939",
+"7  c #3A3A3A",
+"8  c #3C3C3C",
+"9  c gray24",
+"0  c #3E3E3E",
+"q  c #007900",
+"w  c gray25",
+"e  c #414141",
+"r  c gray27",
+"t  c #505050",
+"y  c gray32",
+"u  c #535553",
+"i  c #5A5A5A",
+"p  c #5D5D5D",
+"a  c gray37",
+"s  c #5F5F5F",
+"d  c gray38",
+"f  c #6D6D6D",
+"g  c #717371",
+"h  c #727272",
+"j  c #767676",
+"k  c #7B7B7B",
+"l  c #7C7C7C",
+"z  c #008000",
+"x  c #008500",
+"c  c #008700",
+"v  c #098609",
+"b  c #149214",
+"n  c #1B951B",
+"m  c #1D941D",
+"M  c #239823",
+"N  c #299A29",
+"B  c #2B9B2B",
+"V  c #339E33",
+"C  c #389F38",
+"Z  c #36A036",
+"A  c #3FA33F",
+"S  c #40A440",
+"D  c #47A647",
+"F  c #4BA94B",
+"G  c #4CAB4C",
+"H  c #53AB53",
+"J  c #50AD50",
+"K  c #67B367",
+"L  c #6EB56E",
+"P  c #7DBC7D",
+"I  c #7EBC7E",
+"U  c #7FBC7F",
+"Y  c #838383",
+"T  c gray53",
+"R  c #888988",
+"E  c gray54",
+"W  c #8B8B8B",
+"Q  c gray55",
+"!  c #8D8D8D",
+"~  c #8D8E8D",
+"^  c #8E8E8E",
+"/  c gray57",
+"(  c #929292",
+")  c #939393",
+"_  c #959595",
+"`  c gray60",
+"'  c #9B9B9B",
+"]  c gray62",
+"[  c #81BE81",
+"{  c #83BE83",
+"}  c #84BD84",
+"|  c #A0A0A0",
+" . c #A4A4A4",
+".. c #A5A5A5",
+"X. c gray65",
+"o. c #A9A9A9",
+"O. c gray67",
+"+. c #ACACAC",
+"@. c #AEAEAE",
+"#. c #AFAFAF",
+"$. c gray69",
+"%. c #B1B1B1",
+"&. c #B2B2B2",
+"*. c gray70",
+"=. c #B4B4B4",
+"-. c gray71",
+";. c #B7B7B7",
+":. c #B9B9B9",
+">. c gray73",
+",. c #BBBBBB",
+"<. c gray",
+"1. c gray75",
+"2. c #88C188",
+"3. c #8AC18A",
+"4. c #8BC18B",
+"5. c #8EC38E",
+"6. c #94C594",
+"7. c #97C497",
+"8. c #9EC99E",
+"9. c #A2CBA2",
+"0. c #AACEAA",
+"q. c #AECDAE",
+"w. c #AFD0AF",
+"e. c #B4D2B4",
+"r. c #B7D3B7",
+"t. c #B9D4B9",
+"y. c #BAD7BA",
+"u. c #C0C0C0",
+"i. c gray76",
+"p. c #C3C3C3",
+"a. c gray77",
+"s. c #C4C5C4",
+"d. c #C6C6C6",
+"f. c gray78",
+"g. c #C8C8C8",
+"h. c gray79",
+"j. c #CACACA",
+"k. c gray81",
+"l. c #C7DAC7",
+"z. c #C8DAC8",
+"x. c gray82",
+"c. c LightGray",
+"v. c gray83",
+"b. c gray84",
+"n. c #D7D7D7",
+"m. c #D2DED2",
+"M. c #D3DED3",
+"N. c #D8D6D8",
+"B. c #DED4DE",
+"V. c #D8D8D8",
+"C. c #DFDFDF",
+"Z. c #DAE1DA",
+"A. c #DBE2DB",
+"S. c #DFE1DF",
+"D. c #DEE3DE",
+"F. c #DFE3DF",
+"G. c #E0D6E0",
+"H. c gray88",
+"J. c #E1E1E1",
+"K. c #E0E3E0",
+"L. c #E1E2E1",
+"P. c #E1E3E1",
+"I. c #E2E2E2",
+"U. c #E2E3E2",
+"Y. c gray89",
+"T. c #E1E4E1",
+"R. c #E2E4E2",
+"E. c #E2E5E2",
+"W. c #E3E4E3",
+"Q. c #E3E5E3",
+"!. c #E4E4E4",
+"~. c #E4E5E4",
+"^. c #E5E4E5",
+"/. c gray90",
+"(. c #E4E6E4",
+"). c #E5E6E5",
+"_. c #E6E6E6",
+"`. c #E7E7E7",
+"'. c #EBE2EB",
+"]. c #E8E7E8",
+"[. c #E9E7E9",
+"{. c #EAE7EA",
+"}. c gray91",
+"|. c #E8E9E8",
+" X c #E9E9E9",
+".X c #EAE8EA",
+"XX c #EAE9EA",
+"oX c #EBE8EB",
+"OX c #EAEAEA",
+"+X c #EAEBEA",
+"@X c gray92",
+"#X c #EBECEB",
+"$X c #ECE8EC",
+"%X c #ECE9EC",
+"&X c #EDE9ED",
+"*X c #EDEBED",
+"=X c #EEE9EE",
+"-X c #EFE9EF",
+";X c #EFEAEF",
+":X c #ECECEC",
+">X c gray93",
+",X c #EEEEEE",
+"<X c #EFEFEF",
+"1X c #F1E9F1",
+"2X c #F0EAF0",
+"3X c #F1EAF1",
+"4X c #F2EBF2",
+"5X c #F3EBF3",
+"6X c #F0EDF0",
+"7X c #F5ECF5",
+"8X c #F6EDF6",
+"9X c #F7EDF7",
+"0X c #F8EDF8",
+"qX c #FAEEFA",
+"wX c gray94",
+"eX c #F1F1F1",
+"rX c gray95",
+"tX c #F4F4F4",
+"yX c gray96",
+"uX c #F6F6F6",
+"iX c gray97",
+"pX c #FFF1FF",
+"aX c #F8F8F8",
+"sX c #F9F9F9",
+"dX c gray98",
+"fX c #FBFBFB",
+"gX c #FEF9FE",
+"hX c #FDFDFD",
+"jX c #FEFEFE",
+"kX c white",
+/* pixels */
+"                                                                ",
+"  + 3 8 6 ; ; > > > > > 2 > 1 @ * 8 8 > 5 > > > > > > > > ;     ",
+"  6 V.j >.hXhXeX,X,X,X6XeX,XdX8 -.` ^ dXv.<XeX6XeXeX,X,XuXx.O   ",
+"  > eXl Y s.' j. X!.~.!.!.J.6X5 -.u.i u.s |  XJ.~.~.~.!.,Xj.    ",
+"  6 p.= %.s.+.k.*X!.~.].].!.eX6 -.t h S.Q s.*X].~.~.~.!.,Xj.    ",
+"  2 J.1.k.eXeX*X~.].].~.~.!.eX6 +.x.p.`. X6XZ.m.*X*X~.!.*Xj.O   ",
+"  > eX,X*X~.~.~.].~.].~.].!.eX5 -.dX,XQ.7X4.n b D S.].!.,Xj.O   ",
+"  > ,X!.~.~.].~.~.].~.].~.!.eX5 %.eXJ.~.*Xr.l.r.q q.4XQ.,Xj.    ",
+"  > eX~.~.].~.].~.].~.].~.!.eX5 *.rX~.].Q.4XpXL m A. X~.,Xj.    ",
+"  > 6X~.].~.].~.].~.].~.].~.eX5 %.eX~.~.~. XK N Q.6X~.~.,Xj.O   ",
+"  > eX!.~.].~.].~.].~.].~.~.eX5 *.eX!.J.7X[ q Z A w.4XJ.,Xj.    ",
+"  > ,X!.].~.].~.].~.].~.~.!.eX5 *.rX!.!.*Xt.5.4.I z. XQ.,Xj.O   ",
+"  > ,X~.~.].~.].~.].~.].~.~.eX5 %.eX~.].~.*XqX7XqX&X~.~.,Xj.    ",
+"  > ,XJ.!.!.~.~.!.~.~.~.!.!.eX6 %.eXJ.!.~.Q.J.J.J.!.~.J. Xj.O   ",
+"  3 uX,X,X6X,X<X,X6X,X<X,X*XdX6 ,.hX,XeX6XeXeXeXeXeXeX,XdXb.O   ",
+"  & +.........X.......X.....+.= & w e 6 r 6 3 3 6 6 6 6 6 >     ",
+"  > J.b.V.V.V.V.V.V.V.V.V.b.J.3 ^ +.R o.j #.>.>.#.&.%.#.t.f   O ",
+"  > eX]. X X X*X*X X X*X X XuX6 u.Q s ^ p | &.|  XtXtX<XgX_   O ",
+"  > ,X!.~.~.].~.~.~.].~.~.~.6X8 ` y 9 p d ^ g u (.~.!.G.rXQ   O ",
+"  > eX~.~.].~.].~. X~.].~.~.eX6 -.!.+.j.R V.B.B.]. X~.!.uX^   O ",
+"  2 6X~.].~.].~.].~.].~.~.~.eX6 %.uX6X#XgXy.G H F m.*XJ.uX^   O ",
+"  > 6X~.~.].~.].~.].~.].~.~.eX6 *.eXJ.J.4X7.v H P Q.].J.uX^   O ",
+"  > <X~.].~.].~.].~.].~.~.~.eX5 %.rX!.Q.4X9.M B V m.].J.uX^   O ",
+"  > ,X~.~.].~.].~.].~.].`.Q.eX5 *.eX!.].~.~.7XJ.x [ 7XS.uX^   O ",
+"  > <X~.~.~.].~.~.].~.].~.~.eX5 *.rX~.~.4X7.[ [ x 9.7XJ.uX^   O ",
+"  > 6X~.~. X~.].].~.].~.].!.<X5 *.rX!.~.*X0.S Z } *X~.J.uX^   O ",
+"  3 ,XJ.~.].].~.~.].~.~.~.`.eX5 %.rX~.~.~.4X7X7X7X~.].J.uX^   O ",
+"  > ,XJ.!.J.J.!.!.J.!.J.!.G.,X5 %.6XJ.~.~.J.Q.J.J.~.~.J.eX^   O ",
+"  3 hXuXuXuXuXuXuXuXuXuXuXuXhX8 >.dX*X,X,X X,X,X,X,X,X XhX/   O ",
+"  # / ^ Q ^ Q ^ ^ ^ ^ W ^ W _ % | x.s.j.j.k.j.j.j.j.j.j.V.l   O ",
+"                                O   O O O   O O     O   O       ",
+"    O O O O O O O O O O O O O                                   "
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 73 1 ",
+"  c #010101",
+". c gray3",
+"X c #131313",
+"o c #1B1B1B",
+"O c #252525",
+"+ c #2B2B2B",
+"@ c #333333",
+"# c #3E3E3E",
+"$ c #007E00",
+"% c #434343",
+"& c gray30",
+"* c #545454",
+"= c #5D5D5D",
+"- c #626262",
+"; c #6C6C6C",
+": c #707270",
+"> c #7B7B7B",
+", c #008400",
+"< c #028A02",
+"1 c #0B8E0B",
+"2 c #138E13",
+"3 c #149114",
+"4 c #199219",
+"5 c #218F21",
+"6 c #209720",
+"7 c #259825",
+"8 c #2D9B2D",
+"9 c #3AA13A",
+"0 c #42A442",
+"q c #49A749",
+"w c #4DA84D",
+"e c #54AB54",
+"r c #5AAE5A",
+"t c #60B060",
+"y c #69B569",
+"u c #71B771",
+"i c #76B976",
+"p c #838383",
+"a c #8A8A8A",
+"s c #929292",
+"d c #9B9C9B",
+"f c #82BE82",
+"g c #A4A4A4",
+"h c #ACACAC",
+"j c #B5B5B5",
+"k c #BABABA",
+"l c #86C086",
+"z c #8AC18A",
+"x c #95C695",
+"c c #9AC79A",
+"v c #A7CDA7",
+"b c #ACCFAC",
+"n c #B7D3B7",
+"m c #B9D5B9",
+"M c #C7C7C7",
+"N c #CCCCCC",
+"B c #C0D7C0",
+"V c #C4D9C4",
+"C c #CFD1CF",
+"Z c #CCDCCC",
+"A c #D5D5D5",
+"S c #D1DED1",
+"D c #DCDCDC",
+"F c #DEE3DE",
+"G c #E5E6E5",
+"H c #E9E7E9",
+"J c #ECEBEC",
+"K c #F1E7F1",
+"L c #F3EBF3",
+"P c #FAEEFA",
+"I c #F4F4F4",
+"U c #FFF3FF",
+"Y c #FAFAFA",
+/* pixels */
+"                                                ",
+"                  .                       .     ",
+"                                                ",
+"   .O@@+OOOOOOOOOOOOOOO X+@@OOOOOOOOOOOOOOOO.   ",
+"   OJjdDHGHHGJJJHHGJGJIXpJdjJHJHHHGGJHJHJGGJO   ",
+"   OH>&%IIIIGGGGHHGHGGJXpM;OdYajYGHHGHHGHHGJO   ",
+"   OHYp;DassGGGGGGGGHGJX>YJ%ks--hJGGGHGGGGGGO   ",
+"   OI-okSddgGGGGHGGGGGJXpFX=DD;sFGFGGGGGGGGJO   ",
+"   OJ;=>HIIIGGGGGGGGGGJXpN*-hINDJHKJGGGGGGHGO   ",
+"   OHYYIHGGGGGGJGGGGGGJX>YIIIGJHHSVZJHGGGGHJO . ",
+"   OJFFGGGGGGGGGGGGGGGJo>YDGGGHH0<<<eFHGGGHHO   ",
+"   OHGGGGGGGGJGGGJJGGGJX>YGGGGHGefv8$zLGGHGJO   ",
+"   OHGHGHGHGGGGGGGGGGGJX>YFGGGGGJKUi$lIGGGGJO   ",
+"   OJGGGGGGGGGGGGGGGHGJX>YGGGGGHGJZ44SJGGGGGO   ",
+" . OHGHGGHGGGGGGGGGGGGJX>IGGGGGGLm34VKGGGGGJO   ",
+"   OJHGGGGGGGGGGGGHJHHJX>YFGHGGHv17SHFGGGGGJO   ",
+"   OGGGGHGGGGHHGGGGGGHJXuPGGGGHG4$241uKGGGGHO   ",
+"   OJGHGGGGHGGGGGGGGGGJX>PFHGGHFitrrecJGGGHJO   ",
+"   OJGGGGGGGGHGGGJGGHGJX>UFGGGGHKPULPJGGGGHJO   ",
+"   OJGGHGGGGGGGGGGGGHJJX>PFHGGGGGFGGGGGGGHGHO   ",
+"   OGHHGGHGGGGGGGGGGHGJX>YGGHGGGGGGGGHGGGGGGO   ",
+"   OHGFGGFFGGGFGGGGFGFJX>YFGGGHGGGGHGGGGGGHJO   ",
+"   OYJIIIIIIIIIIIIIIIJYX>YHJJJJJJIJJJIJKJJJJO   ",
+"   ossssssssssssssssssdX.XXXXXXXXXXXXXXXXXXo.   ",
+"   OMMMMVMMMMMMMMMMMMMNo%p>a>pap>p>>>>>>>>p*    ",
+"   OIJJJJJLJJIJJJJJJJJIXpYM*Hj*jYJYJYYYYYYYj    ",
+"   OHGHHGGGGHGGGGGGGHGJX>J-+j@a@k:apJFGFGDJg    ",
+"   OGGHGGGGGHGGGJGGGHGJXas@+;#A+Ap.NJGGGGGIg .  ",
+"   OJGGGGGGGGGGGGGGGGGJX>Ddod;+-C:d>HGGGGGIg    ",
+"   OJGGHGGGGGGJGGGGGHGJX>YINHGjGKLYKPHGGGGIg .  ",
+"   OJGGGGHGGGGGGGGGGGHJX>YDJGGJJxrrrrZHGGGIg    ",
+"   OJGGGGHJGGGGGGGJGGGJX>YGGGGGKe,642nJGGFIg    ",
+"   OJGGGGGGGGGGJGGGGGGJouPGHHGGLr1izZJGGGGIg    ",
+"   OGGGGGGGGGGGGGGGGGGJX:PDGGGFJe<1<4BJGHFIg    ",
+"   OJHGGGGJGGGGGGGGGGGJX>YGHGGGHnBGy$rKGGFLg .  ",
+"   OGGHGGGGGGGGGHGGGGGIX>UDHHGGGLPUn<0LGGGIg    ",
+"   OJGGGGJGGGGGGGGGGHHJX>YDGGGHFqzb9$iKGGGIg .  ",
+"   OJGGHGGGGJGGGGHGHHHJX>UGGGGGG0<,<eGHGGGIg    ",
+" . OHGGGGGGGGJGGGGGHGGJX>YFGGGGHHSVSJHGGGGIg .  ",
+"   OJHGGGGGGGGGGGGGGGGIX>IGGGGHGGHJJGGGGGDIg    ",
+"   OHGGGGGHGGHGGGGGGGGJX>YFGGGGHGGGGGHHGGGIg .  ",
+"   OGGGGGHFGGFFGGGGGDGJX>YGGHHGGGGGGGGGHGGIg    ",
+"   OYIIIIIIIIIIIIIIIIIYX>IFHGGGGGHHGGGGGGGIg .  ",
+"   oggggggggggggggggggh.iYHJJGJHJGJGHJJHHGIg    ",
+"                        X+OOOOOOOOOOOOOOOOOo    ",
+"    .    .    . .    .                          ",
+"                                                ",
+"                                                "
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/keen-web.png b/icons/keen-web.png
new file mode 100644 (file)
index 0000000..530202c
Binary files /dev/null and b/icons/keen-web.png differ
diff --git a/icons/keen.ico b/icons/keen.ico
new file mode 100644 (file)
index 0000000..a32c5b2
Binary files /dev/null and b/icons/keen.ico differ
diff --git a/icons/keen.rc b/icons/keen.rc
new file mode 100644 (file)
index 0000000..1839d0f
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "keen.ico"
diff --git a/icons/lightup-16d24.png b/icons/lightup-16d24.png
new file mode 100644 (file)
index 0000000..d6e0aa2
Binary files /dev/null and b/icons/lightup-16d24.png differ
diff --git a/icons/lightup-16d4.png b/icons/lightup-16d4.png
new file mode 100644 (file)
index 0000000..c7e80d3
Binary files /dev/null and b/icons/lightup-16d4.png differ
diff --git a/icons/lightup-16d8.png b/icons/lightup-16d8.png
new file mode 100644 (file)
index 0000000..b147cf8
Binary files /dev/null and b/icons/lightup-16d8.png differ
diff --git a/icons/lightup-32d24.png b/icons/lightup-32d24.png
new file mode 100644 (file)
index 0000000..c5f81ac
Binary files /dev/null and b/icons/lightup-32d24.png differ
diff --git a/icons/lightup-32d4.png b/icons/lightup-32d4.png
new file mode 100644 (file)
index 0000000..cbf6012
Binary files /dev/null and b/icons/lightup-32d4.png differ
diff --git a/icons/lightup-32d8.png b/icons/lightup-32d8.png
new file mode 100644 (file)
index 0000000..86f2ac4
Binary files /dev/null and b/icons/lightup-32d8.png differ
diff --git a/icons/lightup-48d24.png b/icons/lightup-48d24.png
new file mode 100644 (file)
index 0000000..1f30b3e
Binary files /dev/null and b/icons/lightup-48d24.png differ
diff --git a/icons/lightup-48d4.png b/icons/lightup-48d4.png
new file mode 100644 (file)
index 0000000..8713acb
Binary files /dev/null and b/icons/lightup-48d4.png differ
diff --git a/icons/lightup-48d8.png b/icons/lightup-48d8.png
new file mode 100644 (file)
index 0000000..c9e90be
Binary files /dev/null and b/icons/lightup-48d8.png differ
diff --git a/icons/lightup-base.png b/icons/lightup-base.png
new file mode 100644 (file)
index 0000000..4a4149d
Binary files /dev/null and b/icons/lightup-base.png differ
diff --git a/icons/lightup-ibase.png b/icons/lightup-ibase.png
new file mode 100644 (file)
index 0000000..56f72f8
Binary files /dev/null and b/icons/lightup-ibase.png differ
diff --git a/icons/lightup-ibase4.png b/icons/lightup-ibase4.png
new file mode 100644 (file)
index 0000000..60519b3
Binary files /dev/null and b/icons/lightup-ibase4.png differ
diff --git a/icons/lightup-icon.c b/icons/lightup-icon.c
new file mode 100644 (file)
index 0000000..a422ddf
--- /dev/null
@@ -0,0 +1,576 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 232 2 ",
+"   c #E4E4E4",
+".  c #D8D8DC",
+"X  c #D7D7DC",
+"o  c #D8D8DC",
+"O  c #D8D8DC",
+"+  c #D8D8DB",
+"@  c #D8D8DC",
+"#  c #D8D8DC",
+"$  c #D8D8DC",
+"%  c #D8D8DB",
+"&  c #D8D8DB",
+"*  c #D8D8DC",
+"=  c #D8D8DC",
+"-  c #D7D7DB",
+";  c #D9D9DC",
+":  c gray90",
+">  c #DEDED2",
+",  c #E6E62C",
+"<  c #EEEE1C",
+"1  c #ECEC21",
+"2  c #EDED1F",
+"3  c #D5D543",
+"4  c #EBEB21",
+"5  c #ECEC20",
+"6  c #EEEE1D",
+"7  c #E4E42C",
+"8  c #D9D93D",
+"9  c #EFEF1B",
+"0  c #EBEB23",
+"q  c #F0F016",
+"w  c #D9D94E",
+"e  c #DDDDE9",
+"r  c #DFDFD0",
+"t  c #F7F710",
+"y  c yellow",
+"u  c #FFFF01",
+"i  c #E1E12C",
+"p  c #FEFE01",
+"a  c yellow",
+"s  c #F4F410",
+"d  c #E6E625",
+"f  c #FDFD04",
+"g  c #E5E539",
+"h  c #DBDBEB",
+"j  c #DFDFD0",
+"k  c #F2F211",
+"l  c #FCFC00",
+"z  c #FAFA03",
+"x  c #FBFB01",
+"c  c #DFDF2D",
+"v  c #FDFD04",
+"b  c #FDFD03",
+"n  c #F3F312",
+"m  c #E6E627",
+"M  c #FCFC06",
+"N  c #E4E43B",
+"B  c #DBDBEA",
+"V  c #E0E0D1",
+"C  c #F7F710",
+"Z  c #FFFF01",
+"A  c #E3E32E",
+"S  c #FEFE01",
+"D  c yellow",
+"F  c #F4F410",
+"G  c #E7E725",
+"H  c #FDFD04",
+"J  c #E5E539",
+"K  c #DBDBEB",
+"L  c #D4D4CC",
+"P  c #9A9A20",
+"I  c #9C9C12",
+"U  c #999913",
+"Y  c #999915",
+"T  c #ACAC3A",
+"R  c #E8E82C",
+"E  c #E2E22A",
+"W  c #E5E527",
+"Q  c #DBDB35",
+"!  c #D2D245",
+"~  c #EAEA20",
+"^  c #E2E219",
+"/  c #EAEA19",
+"(  c #D3D356",
+")  c #DDDDE8",
+"_  c #C0C0C0",
+"`  c #030305",
+"'  c #010106",
+"]  c #0F0F17",
+"[  c black",
+"{  c #68681A",
+"}  c #FFFF0A",
+"|  c #F6F608",
+" . c #FCFC04",
+".. c #EFEF19",
+"X. c #E4E425",
+"o. c #E1E11C",
+"O. c #CFCF80",
+"+. c #DDDD28",
+"@. c #E1E137",
+"#. c #DCDCEC",
+"$. c #C3C3C3",
+"%. c #5A5A56",
+"&. c #A2A29A",
+"*. c #0D0D19",
+"=. c #65650F",
+"-. c #FFFF03",
+";. c #FBFB00",
+":. c #F8F810",
+">. c #D6D622",
+",. c #E2E2BD",
+"<. c white",
+"1. c #E9E9D5",
+"2. c #CCCC48",
+"3. c #E1E1E6",
+"4. c #C3C3C3",
+"5. c gray35",
+"6. c #A2A29E",
+"7. c #0D0D1D",
+"8. c #646411",
+"9. c #FFFF05",
+"0. c #FBFB02",
+"q. c #F9F911",
+"w. c #D0D025",
+"e. c #E2E2CC",
+"r. c #EBEBE2",
+"t. c #C7C74F",
+"y. c #E1E1E5",
+"u. c #C0C0C0",
+"i. c gray1",
+"p. c #010101",
+"a. c #0F0F0C",
+"s. c #696916",
+"d. c #FFFF02",
+"f. c #F7F700",
+"g. c #FEFE00",
+"h. c #F1F112",
+"j. c #E8E822",
+"k. c #EAEA2E",
+"l. c #E2E2A6",
+"z. c #E8E83E",
+"x. c #E4E435",
+"c. c #DCDCED",
+"v. c LightGray",
+"b. c #8E8E8E",
+"n. c #909090",
+"m. c #8E8E8D",
+"M. c #8B8B8E",
+"N. c #A2A291",
+"B. c #DBDBA5",
+"V. c #D5D5A3",
+"C. c #D7D7A3",
+"Z. c #D4D4A6",
+"A. c #5A5A34",
+"S. c #454505",
+"D. c #434303",
+"F. c #444400",
+"G. c #5D5D3A",
+"H. c #E1E1E4",
+"J. c gray88",
+"K. c #EFEFEF",
+"L. c gray96",
+"P. c gray95",
+"I. c #F7F7F6",
+"U. c #D7D7DB",
+"Y. c #E5E5F1",
+"T. c #E7E7F2",
+"R. c #E8E8F3",
+"E. c #E7E7F2",
+"W. c #252526",
+"Q. c #040405",
+"!. c #262625",
+"~. c #E4E4E4",
+"^. c #DADADA",
+"/. c gray93",
+"(. c #888888",
+"). c gray19",
+"_. c gray93",
+"`. c #CDCDCC",
+"'. c #E5E5E2",
+"]. c #E5E5E3",
+"[. c #E6E6E3",
+"{. c #E5E5E3",
+"}. c #292927",
+"|. c #080805",
+" X c #292927",
+".X c #E4E4E4",
+"XX c #DDDDDD",
+"oX c #E6E6E6",
+"OX c #CECECE",
+"+X c #B2B2B2",
+"@X c gray92",
+"#X c #D0D0D0",
+"$X c #E7E7E7",
+"%X c #E7E7E7",
+"&X c gray91",
+"*X c #E7E7E7",
+"=X c #252525",
+"-X c #040404",
+";X c #252525",
+":X c #E4E4E4",
+">X c gray87",
+",X c #D8D8D8",
+"<X c gray90",
+"1X c #E9E9E9",
+"2X c gray87",
+"3X c gray80",
+"4X c #DDDDDD",
+"5X c gray87",
+"6X c gray87",
+"7X c gray87",
+"8X c #373737",
+"9X c #0E0E0E",
+"0X c #191919",
+"qX c #0E0E0E",
+"wX c gray22",
+"eX c #E4E4E4",
+"rX c gray90",
+"tX c #E1E1E1",
+"yX c #DFDFDF",
+"uX c gray87",
+"iX c gray88",
+"pX c #E1E1E1",
+"aX c gray88",
+"sX c gray88",
+"dX c gray88",
+"fX c gray88",
+"gX c #DADADA",
+"hX c #D8D8D8",
+"jX c #D8D8D8",
+"kX c #D8D8D8",
+"lX c #DADADA",
+"zX c #E6E6E6",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+"> , < 1 2 3 4 5 6 7 8 9 0 q w e ",
+"r t y u y i p a y s d y f y g h ",
+"j k l z x c v b y n m y M y N B ",
+"V C y Z y A S D y F G y H y J K ",
+"L P I U Y T R E W Q ! ~ ^ / ( ) ",
+"_ ` ' ] [ { } |  ...X.o.O.+.@.#.",
+"$.[ %.&.*.=.-.;.y :.>.,.<.1.2.3.",
+"4.[ 5.6.7.8.9.0.y q.w.e.<.r.t.y.",
+"u.i.p.a.[ s.d.f.g.h.j.k.l.z.x.c.",
+"v.b.n.m.M.N.B.V.C.Z.A.S.D.F.G.H.",
+"J.K.L.P.I.U.Y.T.R.E.W.[ Q.[ !.~.",
+"^./.(.)._.`.'.].[.{.}.[ |.[  X.X",
+"XXoXOX+X@X#X$X%X&X*X=X[ -X[ ;X:X",
+">X,X<X1X2X3X4X5X6X7X8X9X0XqXwXeX",
+"rXtXyXuXiXpXaXsXdXfXgXhXjXkXlXzX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 109 2 ",
+"   c #010101",
+".  c #00000F",
+"X  c gray3",
+"o  c #010111",
+"O  c #141414",
+"+  c #1D1D1D",
+"@  c #20201E",
+"#  c #35351D",
+"$  c #202020",
+"%  c #3F3F25",
+"&  c gray20",
+"*  c #3D3D30",
+"=  c #3B3B3A",
+"-  c #414127",
+";  c #3D3D41",
+":  c #414141",
+">  c #4C4C4C",
+",  c #5B5B5B",
+"<  c #676767",
+"1  c gray43",
+"2  c #7E7E7E",
+"3  c #BFBF1F",
+"4  c #878725",
+"5  c #88882F",
+"6  c #929223",
+"7  c #92922E",
+"8  c #8A8A31",
+"9  c #BDBD2A",
+"0  c #ACAC32",
+"q  c #C6C60B",
+"w  c #D3D300",
+"e  c #DBDB00",
+"r  c #DFDF08",
+"t  c #C3C310",
+"y  c #E1E100",
+"u  c #EDED00",
+"i  c #F1F100",
+"p  c #FFFF01",
+"a  c #F5F50D",
+"s  c #FEFE0D",
+"d  c #EDED1B",
+"f  c #F4F410",
+"g  c #FFFF11",
+"h  c #F4F418",
+"j  c #CDCD26",
+"k  c #CCCC28",
+"l  c #DEDE26",
+"z  c #DBDB2E",
+"x  c #CACA33",
+"c  c #D2D235",
+"v  c #DDDD30",
+"b  c #D7D73C",
+"n  c #D8D83C",
+"m  c #E0E030",
+"M  c #E2E23B",
+"N  c #8A8A5E",
+"B  c #8B8B66",
+"V  c #ACAC61",
+"C  c #ADAD6F",
+"Z  c #B5B564",
+"A  c #B4B475",
+"S  c #C5C54D",
+"D  c #CACA4C",
+"F  c #D2D246",
+"G  c #C6C654",
+"H  c #C9C953",
+"J  c #C4C459",
+"K  c #CFCF5A",
+"L  c #D2D253",
+"P  c #C6C665",
+"I  c #CECE66",
+"U  c #C5C569",
+"Y  c #CACA68",
+"T  c #D0D064",
+"R  c #C6C671",
+"E  c #8B8B8B",
+"W  c #979797",
+"Q  c #B2B283",
+"!  c #B0B089",
+"~  c #B2B291",
+"^  c gray64",
+"/  c #ABABAB",
+"(  c #B1B1A5",
+")  c #B6B6AD",
+"_  c #B9B9B9",
+"`  c gray76",
+"'  c #C9C9C7",
+"]  c #C3C3CF",
+"[  c #CCCCCC",
+"{  c #D7D7CC",
+"}  c #D9D9CF",
+"|  c #C7C7D4",
+" . c #CCCCD3",
+".. c #CCCCDC",
+"X. c #D4D4D4",
+"o. c #D6D6DE",
+"O. c #DDDDDD",
+"+. c #DCDCED",
+"@. c #DADAF0",
+"#. c #E5E5E5",
+"$. c #E9E9E4",
+"%. c #E2E2E9",
+"&. c #EBEBEA",
+"*. c #F1F1ED",
+"=. c #E4E4F5",
+"-. c #ECECFF",
+";. c #F2F2F3",
+":. c #F7F7FF",
+">. c #FEFEFD",
+/* pixels */
+"#.#.&.&.&.&.$.*.&.&.&.&.&.&.&.&.&.&.&.$.&.&.&.&.&.*.&.&.&.&.#.#.",
+"#.#........... .......X...............X. ......... .......X.#.#.",
+"&.{ x z z z z z z l S G l z z z z z z c Z z v z z z z v l A +.$.",
+"&.{ a p p p p p p p m n p p p p p p p a G p p p p p p p p P +.$.",
+"&.{ a p p p p p p p v F p p p p p p p f H p p p p p p p p P +.$.",
+"&.{ a p p p p p p p v n p p p p p p p a H p p p p p p p p P +.$.",
+"&.{ i p p p p p p p v b p p p p p p p a H p p p p p p p p P +.$.",
+"&.{ a p p p p p p p v b p p p p p p p a G p p p p p p p p P +.$.",
+"&.{ a p p p p p p p v b p p p p p p p a G p p p p p p p p P +.&.",
+"=.{ u p p p p p p p z b p p p p p p p a H p p p p p p p p P +.$.",
+"&.} h s g g s s g p M F p f a a a f a d J a f f f f f f a U +.$.",
+";._ # - % - - % % % * Z H G H G H H H J A D G H L L K G D A +.$.",
+";./                 . j p p p p p p p a G p p p e w u p p P +.$.",
+";./   X     + X     o j p p p p p p p a G p e V  .o.~ q p P +.$.",
+";./       E [ ^     o j p p p p p p p a H p V :.>.>.>.) y I +.$.",
+";./     + O.O X.:   o j p p p p p p p a L w ' >.>.>.>.-.9 K +.$.",
+";./     O #.O X.:   o j p p p p p p p a L w  .>.>.>.>.-.9 K @.&.",
+";./       E [ ^     o j p p p p p p p a K i ! >.>.>.>.| w T +.$.",
+";./   X   X $ X     o k p p p p p p p f G p q ( -.-.| 0 p P +.$.",
+";./                 o k p p p p p p p a H p p u j x y p p P +.$.",
+";._ & = = = ; = = = ; A P U U U U U P U N 4 5 7 6 6 7 8 4 B %.$.",
+"&.X.#.;.&.&.&.*.&.;.X.] =.+.+.+.+.@.+.=.:         X       = &.#.",
+"&.X.o.&.#.#.#.#.#.&.[ ' &.$.$.&.&.$.#.*.:                 = &.#.",
+"&.X.O.&.#.&.#.&.#.&. .' &.$.#.#.#.&.#.&.:   X             = &.#.",
+"&.X.O.#.&., O 2 ;.&. .' &.%.#.#.#.#.%.*.:                 = &.#.",
+"&.X.O.#.;.=   < ;.#.{ ' &.%.&.#.#.%.$.;.;             X   = &.#.",
+"&.X.O.#.&.W 1 / &.&.[ ' &.#.#.#.#.#.#.&.:                 = &.%.",
+"&.X.O.&.#.;.>.&.$.&. .' &.#.#.#.#.#.#.&.:                 = &.$.",
+"&.X.+.&.&.#.#.%.&.&.X.' &.#.&.&.&.&.#.;.- . X             = &.#.",
+"&.X.' X.X.X.X.{ X.X.` ` o.X.X.X.X.X.X.O.> X O O O O O O X : &.#.",
+"&.$.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.o.O.O.o.O.o.O.O.O.&.#.",
+"$.#.&.#.&.&.#.&.&.&.&.&.&.&.#.&.#.&.#.&.&.#.$.&.&.&.&.&.&.&.#.#."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 112 2 ",
+"   c #010101",
+".  c #0C0C0C",
+"X  c #050518",
+"o  c #151515",
+"O  c #1E1E1E",
+"+  c #20201F",
+"@  c #242424",
+"#  c gray16",
+"$  c #33332A",
+"%  c #3E3E34",
+"&  c #3D3D3D",
+"*  c gray20",
+"=  c #404036",
+"-  c #43433F",
+";  c #6D6D38",
+":  c #74743E",
+">  c #414142",
+",  c #767641",
+"<  c #7C7C43",
+"1  c #75755E",
+"2  c #616161",
+"3  c #767676",
+"4  c #9E9E12",
+"5  c #A6A60E",
+"6  c #B5B506",
+"7  c #BBBB02",
+"8  c #B3B309",
+"9  c #A2A215",
+"0  c #9E9E27",
+"q  c #9B9B28",
+"w  c #9A9A30",
+"e  c #C4C400",
+"r  c #CDCD00",
+"t  c #D7D700",
+"y  c #E4E400",
+"u  c #ECEC00",
+"i  c #F5F502",
+"p  c #FEFE01",
+"a  c #FAFA0A",
+"s  c #EBEB14",
+"d  c #F2F214",
+"f  c #FFFF13",
+"g  c #FFFF18",
+"h  c #D3D334",
+"j  c #D9D939",
+"k  c #E2E22C",
+"l  c #EDED2A",
+"z  c #8A8A4E",
+"x  c #919144",
+"c  c #969648",
+"v  c #8A8A57",
+"b  c #969652",
+"n  c #999953",
+"m  c #9B9B5F",
+"M  c #BEBE4F",
+"N  c #B7B755",
+"B  c #8A8A65",
+"V  c #AEAE6E",
+"C  c #B6B663",
+"Z  c #BBBB65",
+"A  c #BABA69",
+"S  c #AEAE71",
+"D  c #A7A77B",
+"F  c #ADAD7B",
+"G  c #B2B272",
+"H  c #B2B27B",
+"J  c #C6C64C",
+"K  c #C9C94F",
+"L  c #D1D146",
+"P  c #C2C250",
+"I  c #CACA50",
+"U  c #CFCF5F",
+"Y  c #C0C06B",
+"T  c #838383",
+"R  c #8E8E87",
+"E  c #8E8E8E",
+"W  c #9E9E85",
+"Q  c #9E9E9D",
+"!  c #A6A685",
+"~  c #AEAE85",
+"^  c #A6A69B",
+"/  c #ADAD9A",
+"(  c #B1B19D",
+")  c #A6A6A6",
+"_  c #A5A5A9",
+"`  c gray66",
+"'  c #ACACB5",
+"]  c #B6B6B6",
+"[  c #BDBDBD",
+"{  c #BDBDC5",
+"}  c #C6C6C5",
+"|  c #C4C4CF",
+" . c #CACACA",
+".. c #D0D0CF",
+"X. c #CECED4",
+"o. c #C9C9DD",
+"O. c #D3D3D3",
+"+. c #D3D3DD",
+"@. c #DBDBDB",
+"#. c #D3D3E7",
+"$. c #DBDBE7",
+"%. c #DDDDEA",
+"&. c #E5E5E5",
+"*. c #E9E9E6",
+"=. c #E5E5EA",
+"-. c #EBEBEA",
+";. c #F0F0ED",
+":. c #E2E2F3",
+">. c #EAEAFB",
+",. c #F3F3F3",
+"<. c #F4F4FF",
+"1. c #FEFEFE",
+/* pixels */
+"&.&.&.&.&.&.&.*.&.&.*.&.&.&.&.&.&.&.&.&.&.&.*.&.&.&.&.&.&.&.&.&.&.&.*.&.&.&.&.&.&.&.&.&.&.&.&.&.",
+"&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.*.&.&.&.&.&.&.&.&.&.&.&.*.&.&.&.&.=.*.&.&.",
+"&.*.=.*.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.*.-.-.-.-.-.-.-.-.*.-.*.-.&.&.&.&.",
+"*.*.&.$.X.o.o.o.o.o.o.o.o.o.X.o.X.X.o.o.o.o.o.o.o.o.o.o.o.X.O.o.o.o.o.o.o.o.o.o.X.o.o.O.&.&.&.=.",
+"*.&.-. .N J P P J P P P P J J J S V J P J M J P P P J P J C D J P P P P P P P P P P M ^ *.&.*.*.",
+"*.*.-.O.s p p p p p p p p p a p I L p p p p p p p p p p p k Z p p p p p p p p p p p p / =.&.&.&.",
+"=.&.-.X.s p a p p a p p p a p p I L p a a p p a p a p a p k Z p p p p p p a p p a p i / =.&.&.&.",
+"&.&.-.X.s p p p p p p p p p a p I L p p p p p p p p p p p k Z p a p p p p p p p p p a / =.&.&.&.",
+"&.&.-.X.s p p p p p p p p p p p I L p p p p p p p p p p p k Z p p p p p p p p p p p a / =.&.*.&.",
+"&.&.-.X.s p p p p p p p p p p p I L p p p p p p p p p p p k Z p a p p p p p p p p p p / =.&.=.&.",
+"&.&.-.X.s p p p p p p p p p p p I L p p p p p p p p p p p k Z p p p p p p p p p p p i / =.&.&.&.",
+"&.&.-.X.s p p p p p p p p p a p I L p p p p p p p p p p p k Z p p p p p p p p p p p i / *.&.&.&.",
+"&.&.-.X.s p p p p p p p p p p p I L p p p p p p p p p p p k Z p p p p p p p p p p p p / =.&.&.&.",
+"&.&.-.X.s p p p p p p p p p p p I L p p p p p p p p p p p k Z p p p p p p p p p p p i / *.&.*.=.",
+"&.&.-.O.s p p p p p p p p p p p K L p p p p p p p p p p p k Z p a p p p p p p p p p i / =.&.=.*.",
+"&.&.-.X.s p p p p p p p p p a p K K p p p p p p p p p p p k Z p p p p p p p p p p p a / =.&.&.&.",
+"&.&.-.O.l f g g g g g g g g g a U K a d d d d d d d d d a j A a s d d d d d d d d d s / =.=.&.&.",
+"&.&.,.] $ = % % % % % = % % % % - D G G G G G G G G G G G F ! G G G G G S G G G G G G ) *.&.&.&.",
+"&.&.,.`                         X h p p p p p p p p p p p k Z p a p p p p p p p p p p / =.&.&.&.",
+"&.&.,.`                         X h p p p p p p p p p p p k Z p p p i 6 0 0 8 u p p i / *.&.-.&.",
+"&.&.;._                         X h p p p p p p p p p p p k Z p a t z | >.>.X.v r p p / =.&.&.&.",
+"&.&.,._   .     . ) &.] O       X h p p p p p p p p p p p k Z p u v <.1.1.1.1.<.B y a / =.&.&.&.",
+"&.&.,._         3 1.> @.]       X h p p p p p p p p p p p k Z p 5 o.1.1.1.1.1.1.#.9 p / =.&.&.&.",
+"&.&.,.)          .}   E ,.      X h p p p p p p p p p p p k Z p c <.1.1.1.1.1.1.1.n i / =.&.&.&.",
+"&.&.,._          . .  E -.      X h p p p p p p p p p p p k A p b 1.1.1.1.1.1.1.1.m i ( *.&.&.&.",
+"&.&.,.)         3 1.> @.]       X h p p p p p p p p p p p k Z p q :.1.1.1.1.1.1.>.q p / =.&.&.&.",
+"&.@.,.)         . Q &.] +       X h p p p p p p p p p p p k Z p r Q 1.1.1.1.1.1._ e a / =.=.&.&.",
+"&.&.,.)                         X h p p p p p p p p p p p k Z p p 5 _ <.1.1.1.' 4 p i / =.&.=.*.",
+"&.&.,._   .           .         X h p a p p p p p p p p p k Z p p p 7 w W W x 6 p p i / =.&.&.*.",
+"&.&.,._                         X h p p p p p p p p p a p k Y p a a a p i i p a a p a ( =.&.&.&.",
+"&.&.,.] * & & & > & & > & & & & > ! H H H H H H H H H H G ~ 1 : , : : , < < , : : , ; R -.&.&.&.",
+"&.&.-.O.@.,.-.-.-.-.-.-.-.-.-.,.} { =.$.$.$.$.$.$.$.$.$.%.+.O                         2 ,.&.&.&.",
+"&.&.*. .O.-.&.&.&.&.&.&.&.&.$.-.[ { -.*.*.*.-.*.*.*.*.*.-.@.+                     .   2 ,.&.&.&.",
+"&.&.-.O.O.-.&.*.&.&.&.&.&.&.&.-.[ } -.&.&.&.&.*.&.&.&.&.*.@.+                         2 ,.&.&.&.",
+"*.&.-.O.O.-.*.&.*.<.,.,.*.&.&.-.[ } -.&.&.&.&.&.&.&.&.&.*.@.O                         2 ,.&.&.&.",
+"*.*.-. .O.-.&.-.} T R E &.-.&.-.[ } -.&.*.&.&.&.&.&.&.&.-.@.O                         2 ,.&.&.*.",
+"=.&.-.O.O.-.$.,.Q     . O.-.&.-.[ } -.&.*.*.&.&.*.*.&.&.-.@.O                         2 ,.&.&.&.",
+"&.&.-.O.O.-.&.,.Q     . @.-.&.-.[ } -.&.=.&.&.&.=.*.&.&.*.@.O                         2 ;.&.&.&.",
+"&.&.-. .O.-.&.,.` o O @ @.*.&.-.[ } -.&.&.&.&.&.&.&.&.&.=.@.+                         2 ;.&.&.&.",
+"&.&.-.X.@.-.&.&.&.&.=.*.&.&.=.;.{ } -.&.&.&.=.*.&.&.&.&.-.@.+                         2 ,.&.&.&.",
+"*.&.-. .O.-.&.&.*.*.*.=.&.&.&.-.[ } -.&.&.&.&.*.&.&.&.&.-.@.O                         2 ,.&.&.&.",
+"*.*.-.O.O.*.&.&.&.&.=.*.&.&.&.-.[ } -.&.&.&.&.&.&.&.&.=.*.@.O                         2 ,.&.&.&.",
+"=.&.-...@.-.-.-.*.*.*.-.*.-.*.,.[ } ,.&.&.-.-.-.*.=.-.*.-.@.O                         2 ,.&.&.&.",
+"&.&.-.O.{  .}  .| } } } }  .} | ] ]  .} } } } } }  .} }  .} & O @ @ @ @ @ @ @ @ # # o 3 ;.&.&.&.",
+"&.&.&.*.&.$.&.@.@.&.$.&.&.$.&.@.&.&.$.&.@.&.&.$.&.&.@.&.$.&.*.*.-.*.=.-.*.*.-.*.*.*.*.*.*.&.&.&.",
+"&.&.&.=.*.*.&.&.*.*.&.&.&.&.*.*.*.&.&.&.*.&.&.*.&.&.&.&.=.*.&.&.*.*.=.*.&.&.*.=.=.=.*.&.=.&.&.&.",
+"*.&.&.&.&.*.&.&.&.&.=.&.*.&.&.&.&.&.*.&.&.&.&.&.&.=.&.&.&.*.&.&.&.=.&.&.&.&.&.&.=.&.*.=.&.&.*.*.",
+"*.&.&.&.&.&.*.&.&.&.*.*.&.&.&.&.=.*.*.&.*.&.&.&.&.*.*.&.&.&.&.=.&.*.&.&.=.*.*.&.&.&.&.&.&.&.&.=."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/lightup-web.png b/icons/lightup-web.png
new file mode 100644 (file)
index 0000000..d48aa4d
Binary files /dev/null and b/icons/lightup-web.png differ
diff --git a/icons/lightup.ico b/icons/lightup.ico
new file mode 100644 (file)
index 0000000..2774b76
Binary files /dev/null and b/icons/lightup.ico differ
diff --git a/icons/lightup.rc b/icons/lightup.rc
new file mode 100644 (file)
index 0000000..f3d0cee
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "lightup.ico"
diff --git a/icons/loopy-16d24.png b/icons/loopy-16d24.png
new file mode 100644 (file)
index 0000000..453bdd9
Binary files /dev/null and b/icons/loopy-16d24.png differ
diff --git a/icons/loopy-16d4.png b/icons/loopy-16d4.png
new file mode 100644 (file)
index 0000000..25972da
Binary files /dev/null and b/icons/loopy-16d4.png differ
diff --git a/icons/loopy-16d8.png b/icons/loopy-16d8.png
new file mode 100644 (file)
index 0000000..453bdd9
Binary files /dev/null and b/icons/loopy-16d8.png differ
diff --git a/icons/loopy-32d24.png b/icons/loopy-32d24.png
new file mode 100644 (file)
index 0000000..d521848
Binary files /dev/null and b/icons/loopy-32d24.png differ
diff --git a/icons/loopy-32d4.png b/icons/loopy-32d4.png
new file mode 100644 (file)
index 0000000..4cbbc93
Binary files /dev/null and b/icons/loopy-32d4.png differ
diff --git a/icons/loopy-32d8.png b/icons/loopy-32d8.png
new file mode 100644 (file)
index 0000000..d521848
Binary files /dev/null and b/icons/loopy-32d8.png differ
diff --git a/icons/loopy-48d24.png b/icons/loopy-48d24.png
new file mode 100644 (file)
index 0000000..ad93828
Binary files /dev/null and b/icons/loopy-48d24.png differ
diff --git a/icons/loopy-48d4.png b/icons/loopy-48d4.png
new file mode 100644 (file)
index 0000000..2e020e3
Binary files /dev/null and b/icons/loopy-48d4.png differ
diff --git a/icons/loopy-48d8.png b/icons/loopy-48d8.png
new file mode 100644 (file)
index 0000000..ad93828
Binary files /dev/null and b/icons/loopy-48d8.png differ
diff --git a/icons/loopy-base.png b/icons/loopy-base.png
new file mode 100644 (file)
index 0000000..cf71c8d
Binary files /dev/null and b/icons/loopy-base.png differ
diff --git a/icons/loopy-ibase.png b/icons/loopy-ibase.png
new file mode 100644 (file)
index 0000000..9cdfcf6
Binary files /dev/null and b/icons/loopy-ibase.png differ
diff --git a/icons/loopy-ibase4.png b/icons/loopy-ibase4.png
new file mode 100644 (file)
index 0000000..9167cbd
Binary files /dev/null and b/icons/loopy-ibase4.png differ
diff --git a/icons/loopy-icon.c b/icons/loopy-icon.c
new file mode 100644 (file)
index 0000000..cb46570
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"hXwXlXhXzXtXaXlXhXkXeX0XqXqX9XhX",
+"wXF.xXcXNXE.#XNXnXuX$.x.x.x.h.rX",
+"lXxXkX.XiXcXvX6X&XsXz.AXmXNXbXkX",
+"jXlX7XW _.vXxX).4.gXf.cXhXkXfXjX",
+"zXmXjX).eXmXJX1X&XNXx.bXkXlXcXlX",
+"tXE.xXbXMX}.b.R.E.m.<.vXfXxX*XwX",
+"aX#XzXsXCXV.V.&X X X#XlXdXVX(.:X",
+"zXvXlXjXZXK.=XJXMXBXvXvXb.>X#X:X",
+"kXjXcXlXDXK.XXMXhXjXhXbX5.3X#X:X",
+"kXuXiXrXcXV.XXBXjXkXiXuX3XgX(.>X",
+"eX#.l.b.b.:.#XvXhXuX#.j.z.l.t.0X",
+"0Xb.CX*XhXnXlXlXcXiXl.BXcXbXcXkX",
+"qXz.VX@.`.bXdXjXlXyXj.vXjXkXgXjX",
+"0XM.SX/.aXCXMXNXCXlXz.bXkXlXxXlX",
+"wX0.XX+XXXQ.(.}.|.~.t.cXgXxX3XyX",
+"kX5X:X;X>X:X:X>X>X:X0XkXjXlXyXfX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"lXlXcXlXlXlXlXlXlXlXkXxXzXlXlXlXlXlXlXkXxXlXhXjXjXjXjXjXhXzXzXlX",
+"lXzXdXlXzXzXzXzXzXlXxXfXkXzXzXzXzXzXlXxXaXcXCXBXVXVXVXBXCXkXhXzX",
+"cXdX3 V.MXpXdXdXsXfXgXq g.BXpXdXdXdXsXjXC d J S D D D D F s 7XnX",
+"lXlXV.,XvXjXgXfXjXkXzXA.*XbXhXgXfXhXgXZXI e.-X}. X X X XXXL.yXcX",
+"lXzXMXvXlXlXCXDXbXkXzXMXbXkXzXCXSXnXgXJX( R.UXMXVXVXVXBXCXMXkXlX",
+"lXzXpXjXkXmXB.@.8XbXlXpXhXzXjXu.*.,XxXFX~ G.AXgXjXjXjXjXkXaXhXzX",
+"lXzXdXhXMX*XI q.$.FXjXdXjXxXaXtX_ r.AXSX~ H.DXhXlXlXlXlXzXfXhXzX",
+"lXzXdXhXNXOXE m.} FXjXdXjXkXNXP.! rXlXGX~ H.DXhXlXlXlXlXzXfXhXzX",
+"lXzXsXjXlXvXr.E &XmXkXdXjXzXjXY Y ^.bXDX~ H.DXhXlXlXlXlXzXfXhXzX",
+"lXlXfXkXlXzXNXmXnXjXzXfXhXhXgXbXjXfXdXSX~ H.DXhXlXlXlXlXzXfXjXzX",
+"kXxXfXzXzXzXkXlXkXzXcXsXMXFXSXAXSXDXCXUX] P.DXjXzXzXzXlXcXfXgXzX",
+"xXfX0 A.MXpXdXdXdXfXsXV m R I I I I P ! * t.BXpXdXdXdXdXjX[ 2XmX",
+"zXkXg.*XbXhXjXjXjXhXMXV r.{.Q.~.~.~.!.).k.XXbXhXgXfXhXgXNX$.;XMX",
+"lXzXBXbXlXzXlXlXlXhXFXR }.UXVXZXZXZXZXAXVXbXlXzXZXFXnXgXSX9.=XNX",
+"lXzXpXjXlXlXlXlXlXhXSXI Q.VXgXjXjXjXjXkXpXgXzXzXz.<.<XxXZX5.=XNX",
+"lXzXdXkXlXlXlXlXlXhXSXI ~.ZXjXlXlXlXlXzXfXjXzXsX5X| <.SXVX5.=XNX",
+"lXzXdXkXlXlXlXlXlXhXSXI ~.ZXjXlXlXlXlXzXfXjXkXMX.X~ 5XxXZX5.=XNX",
+"lXzXdXkXlXlXlXlXlXhXSXI ~.ZXjXlXlXlXlXzXdXhXlXvXT A R.vXCX5.=XNX",
+"lXlXsXgXhXgXgXgXgXsXCXP !.ZXjXlXlXlXlXlXdXfXhXfXlXaXiXdXBX4.=XNX",
+"kXxXhXAXJXGXGXGXGXSXUX~ ).AXkXzXzXzXlXcXjXVXJXGXGXJXJXSXUXt.*XNX",
+"xXsXC J ( ~ ~ ~ ~ ~ ' = c.BXpXfXfXdXdXjXR Z _ ~ ~ ~ ~ ~ ( k 6XnX",
+"lXxXl e.T.G.F.D.G.H.P.0.XXbXgXjXjXjXfXBXG *.Q.F.H.H.H.H.K.k.tXvX",
+"hXCXJ ;XUXAXIXUXHXSXFXVXbXlXzXzXzXzXhXJX_ Q.UXZXDXDXDXSXFXBXjXlX",
+"jXBXS }.MXdXm.t.5XzXhXpXhXzXlXlXlXlXgXGX~ F.ZXfXhXhXhXhXjXaXhXzX",
+"jXVXD  XVXjX~.g K.AXjXdXjXlXlXlXlXlXgXGX~ H.DXhXlXlXlXlXzXfXhXzX",
+"jXVXD  XNXcX,Xn V.SXjXdXjXlXlXlXlXlXgXGX~ H.DXhXlXlXlXlXzXfXhXzX",
+"jXVXD |.AXwX8.Q W.VXkXdXjXlXlXlXlXlXgXGX~ H.DXhXlXlXlXlXzXfXhXzX",
+"jXBXD }.mXgXqXpXnXfXjXsXgXhXhXhXhXhXsXSX~ H.SXhXlXlXlXlXzXdXhXzX",
+"jXCXG *XUXCXFXSXCXAXSXlXNXSXAXAXAXAXBXUX` L.FXjXzXzXzXzXxXkXhXzX",
+"zXhXk | q.4.5.5.5.5.9.R #.9.5.5.5.5.4.t.p k.BXaXfXfXfXdXkX5.6XnX",
+"zXhX9X:X=X=X=X=X=X=X=X,X;X=X=X=X=X=X=X*X3XtXjXhXhXhXhXhXhX6XhXzX",
+"lXzXbXMXNXNXNXNXNXNXNXMXMXNXNXNXNXNXNXNXmXcXlXzXzXzXzXzXzXnXzXlX"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX",
+"lXlXlXlXhXkXlXlXlXlXlXlXlXlXlXlXlXhXkXlXlXlXlXlXlXlXlXlXlXlXhXjXlXkXkXkXkXkXkXkXkXkXkXhXlXlXlXlX",
+"lXlXlXzXAXbXkXlXlXlXlXlXlXlXlXlXzXAXbXkXlXlXlXlXlXlXlXlXlXlXZXmXzXxXxXxXxXxXxXxXxXzXxXVXzXlXlXlX",
+"lXlXzXhXT.5XbXlXzXzXzXzXzXzXzXxXjXR.3XbXlXzXzXzXzXzXzXzXxXkXY.<XcXhXjXjXjXjXjXjXjXkXfX`.gXzXlXlX",
+"lXhXAXR.  ) bXyXpXpXpXpXpXpXyXvXU.  ~ bXyXpXpXpXpXpXpXyXcXY.  @ * & & & & & & & & = X 6 fXxXkXlX",
+"lXkXbX5XW H.MXgXjXjXjXjXjXjXhXcX6XQ F.MXgXjXjXjXjXjXjXhXcX6X$ #.Q.F.J.J.J.J.J.J.H.K.A.=.sXxXlXlX",
+"lXlXkXbXmXMXlXzXlXlXhXgXkXzXzXkXbXmXMXlXzXzXkXhXhXkXzXlXlXmX> K.UXCXSXSXSXSXSXSXSXSXFXvXjXzXlXlX",
+"lXlXlXlXyXgXzXlXlXkXAXKXvXkXlXlXlXyXgXzXlXkXmXJXHXvXkXlXzXxX; N.ZXdXhXhXhXhXhXhXhXhXjXuXjXzXlXlX",
+"lXlXlXzXpXjXlXlXlXbXZ.5.8XbXkXlXzXpXjXlXkXbX&X6.r.8XbXjXzXcX; V.FXhXlXlXlXlXlXlXlXlXzXpXjXzXlXlX",
+"lXlXlXzXpXjXlXhXSXa.y ! k lXzXkXzXpXjXlXjXVXc.:.N c cXlXlXcX; V.FXhXlXlXlXlXlXlXlXlXzXpXjXzXlXlX",
+"lXlXlXzXpXjXlXjXSXn 2.lX# +XNXjXzXpXjXlXlXkXxXUX1.h nXkXlXcX; V.FXhXlXlXlXlXlXlXlXlXzXpXjXzXlXlX",
+"lXlXlXzXpXjXlXjXSXm 1.kX# @XNXjXzXpXjXlXlXjXZXg.v uXMXjXzXcX; V.FXhXlXlXlXlXlXlXlXlXzXpXjXzXlXlX",
+"lXlXlXzXpXjXlXhXSXh.r U c zXlXkXzXpXjXlXhXAXh.  ^ p.aXzXlXcX; V.FXhXlXlXlXlXlXlXlXlXzXpXjXzXlXlX",
+"lXlXlXzXpXjXlXlXlXnXJ.e.wXbXkXlXzXpXjXlXjXmX/.i.q.i.gXzXlXcX; V.FXhXlXlXlXlXlXlXlXlXzXpXjXzXlXlX",
+"lXlXlXzXyXhXzXlXlXkXAXJXcXkXlXlXzXyXhXlXlXjXBXGXHXGXlXkXlXxX; V.FXhXlXlXlXlXlXlXlXlXzXuXjXzXlXlX",
+"lXlXlXxXvXcXkXlXlXlXhXgXkXlXlXkXxXvXvXzXzXzXkXhXhXjXzXzXxXvX: C.DXgXlXlXlXlXlXlXlXkXxXxXjXlXlXlX",
+"lXlXzXjXU.5XbXlXzXzXzXzXzXzXzXxXlXP.2XbXlXzXzXzXzXzXzXlXxXlX: B.FXjXzXzXzXzXzXzXzXxXkX^.dXxXlXlX",
+"lXhXZXR.  ) bXyXpXpXpXpXpXpXyXvXP.  $ - = = = = = = = = - -   R vXyXpXpXpXpXpXpXuXvXP., hXxXkXlX",
+"lXkXbX4XU F.MXgXjXjXjXjXjXjXhXvX3X+ #.Y.Z.S.S.S.S.S.S.S.D.S.R B.MXgXjXjXjXjXjXjXhXvX,Xh pXcXkXlX",
+"lXlXkXbXnXMXlXzXlXlXlXlXlXlXlXzXbX; Y.UXCXDXDXDXDXDXDXDXDXFXnXMXlXzXzXkXhXhXkXzXlXzXkXZ tXcXkXlX",
+"lXlXlXlXyXgXzXlXlXlXlXlXlXlXkXzXlX= Z.CXdXhXhXhXhXhXhXhXhXjXyXgXzXlXkXnXJXGXvXkXlXxXdXB yXcXkXlX",
+"lXlXlXzXpXjXlXlXlXlXlXlXlXlXlXzXzX= S.DXhXlXlXlXlXlXlXlXlXzXpXjXzXkXbX-Xq.u.9XbXjXxXfXB tXcXkXlX",
+"lXlXlXzXpXjXlXlXlXlXlXlXlXlXlXzXzX= S.DXhXlXlXlXlXlXlXlXlXzXpXjXzXjXVXv.&.M x xXlXzXfXB tXcXkXlX",
+"lXlXlXzXpXjXlXlXlXlXlXlXlXlXlXzXzX= S.DXhXlXlXlXlXlXlXlXlXzXpXjXzXlXkXzXUX8.s vXlXzXfXB tXcXkXlX",
+"lXlXlXzXpXjXlXlXlXlXlXlXlXlXlXzXzX= S.DXhXlXlXlXlXlXlXlXlXzXpXjXzXlXjXZXc.z wXNXjXxXfXB tXcXkXlX",
+"lXlXlXzXpXjXlXlXlXlXlXlXlXlXlXzXzX= S.DXhXlXlXlXlXlXlXlXlXzXpXjXzXhXZXx.  ^ s.pXxXzXfXB tXcXkXlX",
+"lXlXlXzXpXjXlXlXlXlXlXlXlXlXlXzXzX= S.DXhXlXlXlXlXlXlXlXlXzXpXjXzXjXMX^.r.8.e.dXzXzXfXB tXcXkXlX",
+"lXlXlXzXyXhXlXlXlXlXlXlXlXlXkXzXlX= S.DXhXlXlXlXlXlXlXlXlXzXuXhXlXlXjXBXHXJXHXzXkXzXdXB tXcXkXlX",
+"lXlXlXxXcXcXlXzXzXzXzXzXzXzXlXxXxX- D.DXhXlXlXlXlXlXlXlXkXzXcXcXlXzXzXkXgXhXhXlXlXxXgXV tXcXkXlX",
+"lXlXlXkXU.6XmXxXcXcXcXcXcXcXxXvXlX- S.FXjXzXzXzXzXzXzXzXzXzXT.3XmXxXcXcXcXcXcXcXxXbXfXV yXcXkXlX",
+"lXhXZXY.  & : ; ; ; ; ; ; ; ; : :   ! bXyXpXpXpXpXpXpXuXcXT.  % : ; ; ; ; ; ; ; ; > # 7 fXxXkXlX",
+"lXjXnX<Xo #.K.N.V.V.V.V.V.V.V.C.B.P B.MXgXjXjXjXjXjXjXhXcX4X@ X.L.N.V.V.V.V.V.V.V.C.b.o.sXxXlXlX",
+"lXlXzXcX= Q.UXZXFXSXZXZXSXFXDXDXFXbXMXlXzXzXzXzXzXzXzXlXlXmX> L.UXZXFXFXFXFXFXFXFXDXGXcXjXzXlXlX",
+"lXkXxXhX& F.CXdXgXcXFXSXzXgXhXgXjXyXgXzXlXlXlXlXlXlXlXkXzXxX; N.ZXsXhXhXhXhXhXhXhXgXjXuXjXzXlXlX",
+"lXkXxXjX& J.SXgXbX;X7.i.6XvXkXlXzXpXjXlXlXlXlXlXlXlXlXlXzXcX; V.FXhXlXlXlXlXlXlXlXlXzXpXjXzXlXlX",
+"lXkXxXjX& J.SXfXNXW.u.M x bXlXkXzXpXjXlXlXlXlXlXlXlXlXlXzXcX; V.FXhXlXlXlXlXlXlXlXlXzXpXjXzXlXlX",
+"lXkXxXjX& J.SXhXkXnX~.c &.CXjXlXzXpXjXlXlXlXlXlXlXlXlXlXzXcX; V.FXhXlXlXlXlXlXlXlXlXzXpXjXzXlXlX",
+"lXkXxXjX& J.SXhXjXBXW.H A zXlXkXzXpXjXlXlXlXlXlXlXlXlXlXzXcX; V.FXhXlXlXlXlXlXlXlXlXzXpXjXzXlXlX",
+"lXkXxXjX& J.SXfXBXz.f.R u kXzXkXzXpXjXlXlXlXlXlXlXlXlXlXzXcX; V.FXhXlXlXlXlXlXlXlXlXzXpXjXzXlXlX",
+"lXkXxXjX& J.SXfXmX`.-.w.7XbXkXlXzXpXjXlXlXlXlXlXlXlXlXlXzXcX; V.FXhXlXlXlXlXlXlXlXlXzXpXjXzXlXlX",
+"lXkXxXjX& H.SXhXjXBXKXGXvXkXlXkXzXuXhXlXlXlXlXlXlXlXlXkXlXxX; V.FXhXlXlXlXlXlXlXlXlXzXuXjXzXlXlX",
+"lXkXzXkX= L.FXjXxXlXhXjXlXxXxXzXcXvXvXzXxXxXxXxXxXxXxXzXxXbX> C.DXgXlXlXlXlXlXlXlXkXxXxXjXlXlXlX",
+"lXkXxXfX$ Z.BXaXfXfXfXfXfXfXfXfXdXP.,XkXdXfXfXfXfXfXfXdXgXfX= m.GXjXzXzXzXzXzXzXzXxXjX^.fXzXlXlX",
+"lXjXVX).> l Z B B B B B B B B V N , f Z B B B B B B B B V V : o.cXuXpXpXpXpXpXpXuXxX/.i fXxXkXlX",
+"lXlXzXgXdXpXtXyXtXtXtXtXtXtXyXtXyXhXpXtXyXtXtXtXtXtXtXtXtXyXfXsXjXjXjXjXjXjXjXjXjXjXfXfXzXlXlXlX",
+"lXlXlXzXxXcXcXcXcXcXcXcXcXcXcXcXcXxXcXcXcXcXcXcXcXcXcXcXcXcXxXxXzXzXzXzXzXzXzXzXzXlXzXxXlXlXlXlX",
+"lXlXlXlXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXlXlXlXlXlXlXlXlXlXlXlXlXkXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/loopy-web.png b/icons/loopy-web.png
new file mode 100644 (file)
index 0000000..fc0f23f
Binary files /dev/null and b/icons/loopy-web.png differ
diff --git a/icons/loopy.ico b/icons/loopy.ico
new file mode 100644 (file)
index 0000000..9a498ef
Binary files /dev/null and b/icons/loopy.ico differ
diff --git a/icons/loopy.rc b/icons/loopy.rc
new file mode 100644 (file)
index 0000000..583ee8f
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "loopy.ico"
diff --git a/icons/magnets-16d24.png b/icons/magnets-16d24.png
new file mode 100644 (file)
index 0000000..aadfdf6
Binary files /dev/null and b/icons/magnets-16d24.png differ
diff --git a/icons/magnets-16d4.png b/icons/magnets-16d4.png
new file mode 100644 (file)
index 0000000..3b1e455
Binary files /dev/null and b/icons/magnets-16d4.png differ
diff --git a/icons/magnets-16d8.png b/icons/magnets-16d8.png
new file mode 100644 (file)
index 0000000..1aaffb9
Binary files /dev/null and b/icons/magnets-16d8.png differ
diff --git a/icons/magnets-32d24.png b/icons/magnets-32d24.png
new file mode 100644 (file)
index 0000000..cd3340f
Binary files /dev/null and b/icons/magnets-32d24.png differ
diff --git a/icons/magnets-32d4.png b/icons/magnets-32d4.png
new file mode 100644 (file)
index 0000000..6c1d57d
Binary files /dev/null and b/icons/magnets-32d4.png differ
diff --git a/icons/magnets-32d8.png b/icons/magnets-32d8.png
new file mode 100644 (file)
index 0000000..757c287
Binary files /dev/null and b/icons/magnets-32d8.png differ
diff --git a/icons/magnets-48d24.png b/icons/magnets-48d24.png
new file mode 100644 (file)
index 0000000..54b1403
Binary files /dev/null and b/icons/magnets-48d24.png differ
diff --git a/icons/magnets-48d4.png b/icons/magnets-48d4.png
new file mode 100644 (file)
index 0000000..46b5af2
Binary files /dev/null and b/icons/magnets-48d4.png differ
diff --git a/icons/magnets-48d8.png b/icons/magnets-48d8.png
new file mode 100644 (file)
index 0000000..ace4e78
Binary files /dev/null and b/icons/magnets-48d8.png differ
diff --git a/icons/magnets-base.png b/icons/magnets-base.png
new file mode 100644 (file)
index 0000000..50901d5
Binary files /dev/null and b/icons/magnets-base.png differ
diff --git a/icons/magnets-ibase.png b/icons/magnets-ibase.png
new file mode 100644 (file)
index 0000000..8a13917
Binary files /dev/null and b/icons/magnets-ibase.png differ
diff --git a/icons/magnets-ibase4.png b/icons/magnets-ibase4.png
new file mode 100644 (file)
index 0000000..aef8868
Binary files /dev/null and b/icons/magnets-ibase4.png differ
diff --git a/icons/magnets-icon.c b/icons/magnets-icon.c
new file mode 100644 (file)
index 0000000..d8b9941
--- /dev/null
@@ -0,0 +1,636 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 251 2 ",
+"   c #D5D7D7",
+".  c #D5D2D2",
+"X  c #D5CACA",
+"o  c #D4CACA",
+"O  c #D5CDCD",
+"+  c #CFCBCB",
+"@  c #CCCDCD",
+"#  c #CECECE",
+"$  c #CDCDCD",
+"%  c gray83",
+"&  c #D7D7D7",
+"*  c LightGray",
+"=  c LightGray",
+"-  c LightGray",
+";  c LightGray",
+":  c #D5D5D5",
+">  c #D4C4C4",
+",  c #CD2323",
+"<  c #CD1515",
+"1  c #CA1D1D",
+"2  c #D91111",
+"3  c #5E1A1A",
+"4  c #071313",
+"5  c #100D0D",
+"6  c gray1",
+"7  c gray27",
+"8  c #C8C8C8",
+"9  c #ACACAC",
+"0  c #AFAFAF",
+"q  c #AEAEAE",
+"w  c gray70",
+"e  c #D4B6B6",
+"r  c #CC0505",
+"t  c #D06868",
+"y  c #CE7D7D",
+"u  c #DB0404",
+"i  c #4B0000",
+"p  c #061515",
+"a  c #383535",
+"s  c gray15",
+"d  c #2C2C2C",
+"f  c #BCBCBC",
+"g  c gray65",
+"h  c #A9A9A9",
+"j  c gray66",
+"k  c #AEAEAE",
+"l  c LightGray",
+"z  c #D3B1B1",
+"x  c #CC1B1B",
+"c  c #D1ABAA",
+"v  c #CFBDBC",
+"b  c #DC2726",
+"n  c #450000",
+"m  c #293A39",
+"M  c #908E8C",
+"N  c #767876",
+"B  c #393939",
+"V  c #BAB9B9",
+"C  c #A9A7A7",
+"Z  c #ABA9A9",
+"A  c #A9A7A7",
+"S  c #AFAFAF",
+"D  c LightGray",
+"F  c #D4BBBC",
+"G  c #D20303",
+"H  c #D52325",
+"J  c #D23133",
+"K  c #E20000",
+"L  c #510202",
+"P  c black",
+"I  c #050202",
+"U  c #2B2A2B",
+"Y  c #C1C4C4",
+"T  c #A6AEAE",
+"R  c #A9B3B3",
+"E  c #A8B1B1",
+"W  c #AEB1B1",
+"Q  c #D3D2D2",
+"!  c #D6D5D6",
+"~  c #B7A592",
+"^  c #AC8F75",
+"/  c #AF9078",
+"(  c #B1987F",
+")  c #91957E",
+"_  c #7A977D",
+"`  c #839A82",
+"'  c #7A9479",
+"]  c #A2B2A4",
+"[  c #D7CCCE",
+"{  c #C7A3A2",
+"}  c #C99D9D",
+"|  c #C8A1A1",
+" . c #CBBEBE",
+".. c #D5D7D7",
+"X. c #BDCEBD",
+"o. c #2AA732",
+"O. c #18A524",
+"+. c #19A524",
+"@. c #20A62B",
+"#. c #19A21D",
+"$. c #2DA72D",
+"%. c #22A322",
+"&. c #20A01D",
+"*. c #4BBC59",
+"=. c #D26D6E",
+"-. c #CD0000",
+";. c #CF2D2D",
+":. c #CD0000",
+">. c #D15555",
+",. c #D6E4E4",
+"<. c #B8CCB8",
+"1. c #20991E",
+"2. c #3CA239",
+"3. c #42A43F",
+"4. c #1F981C",
+"5. c #169615",
+"6. c #1E991E",
+"7. c #43A542",
+"8. c #319B2E",
+"9. c #36B246",
+"0. c #D05E5E",
+"q. c #CE2828",
+"w. c #D3C3C3",
+"e. c #CF5252",
+"r. c #CF4A4A",
+"t. c #D6E3E3",
+"y. c #B7CBB7",
+"u. c #199719",
+"i. c #359F35",
+"p. c #3BA13B",
+"a. c #189618",
+"s. c #139411",
+"d. c #1D971A",
+"f. c #41A33E",
+"g. c #309929",
+"h. c #34B042",
+"j. c #CE5F5E",
+"k. c #CB2828",
+"l. c #D1C3C3",
+"z. c #CD5252",
+"x. c #CD4B4B",
+"c. c #D6E3E3",
+"v. c #C2CFC2",
+"b. c #46B046",
+"n. c #34AC34",
+"m. c #34AB34",
+"M. c #3EAE3D",
+"N. c #26AA2F",
+"B. c #2FAE3E",
+"V. c #26AD35",
+"C. c #23A92F",
+"Z. c #52C56C",
+"A. c #D96465",
+"S. c #D70000",
+"D. c #D92E2E",
+"F. c #D80000",
+"G. c #D74B4B",
+"H. c #D5E4E4",
+"J. c #D5D3D5",
+"K. c #878E87",
+"L. c #737E73",
+"P. c #798278",
+"I. c #6E7F74",
+"U. c #A57E75",
+"Y. c #C68175",
+"T. c #C2796F",
+"R. c #BD7367",
+"E. c #D7AFAA",
+"W. c #886768",
+"Q. c #380000",
+"!. c #490909",
+"~. c #3A0000",
+"^. c #764D4D",
+"/. c #DFE3E3",
+"(. c #B7B7B7",
+"). c #070707",
+"_. c #040101",
+"`. c #800101",
+"'. c #DD0000",
+"]. c #CE3435",
+"[. c #CD1011",
+"{. c #DE2D2D",
+"}. c #636565",
+"|. c #070606",
+" X c #4C4C4C",
+".X c gray89",
+"XX c #AFAFAF",
+"oX c gray15",
+"OX c #868685",
+"+X c #8F8D8C",
+"@X c #223232",
+"#X c #770000",
+"$X c #DD3434",
+"%X c #D1CAC9",
+"&X c #CE9897",
+"*X c #DF4343",
+"=X c #5E5959",
+"-X c #464545",
+";X c #989595",
+":X c #656262",
+">X c #525050",
+",X c #E2E2E2",
+"<X c #B4B4B4",
+"1X c gray6",
+"2X c #2A2A2A",
+"3X c #312E2E",
+"4X c #010F0F",
+"5X c #7B0000",
+"6X c #DB0606",
+"7X c #CE8383",
+"8X c #CC4D4D",
+"9X c #DD2E2E",
+"0X c gray38",
+"qX c #0B0C0C",
+"wX c #363535",
+"eX c #161616",
+"rX c gray30",
+"tX c gray89",
+"yX c #C8C8C8",
+"uX c #3E3E3E",
+"iX c #202020",
+"pX c #272424",
+"aX c #212C2C",
+"sX c #923232",
+"dX c #D82828",
+"fX c #CC3838",
+"gX c #CB2424",
+"hX c #DA6161",
+"jX c #8F9494",
+"kX c #1F1E1E",
+"lX c #272727",
+"zX c #1B1B1B",
+"xX c #7C7C7C",
+"cX c gray88",
+"vX c #D8D8D8",
+"bX c gray87",
+"nX c #DDDDDD",
+"mX c #DDDDDD",
+"MX c gainsboro",
+"NX c #D7DBDB",
+"BX c #D5DDDD",
+"VX c #D5D9D9",
+"CX c #D5DBDB",
+"ZX c #D5DDDD",
+"AX c #DBDCDC",
+"SX c #DDDDDD",
+"DX c #DDDDDD",
+"FX c #DDDDDD",
+"GX c gainsboro",
+"HX c #D5D5D5",
+"JX c white",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+"> , < 1 2 3 4 5 6 7 8 9 0 q w ; ",
+"e r t y u i p a s d f g h j k l ",
+"z x c v b n m M N B V C Z A S D ",
+"F G H J K L P I P U Y T R E W Q ",
+"! ~ ^ / ( ) _ ` ' ] [ { } |  ...",
+"X.o.O.+.@.#.$.%.&.*.=.-.;.:.>.,.",
+"<.1.2.3.4.5.6.7.8.9.0.q.w.e.r.t.",
+"y.u.i.p.a.s.d.f.g.h.j.k.l.z.x.c.",
+"v.b.n.m.M.N.B.V.C.Z.A.S.D.F.G.H.",
+"J.K.L.P.I.U.Y.T.R.E.W.Q.!.~.^./.",
+"(.).P _.P `.'.].[.{.}.P |.P  X.X",
+"XXoXOX+X@X#X$X%X&X*X=X-X;X:X>X,X",
+"<X1X2X3X4X5X6X7X8X9X0XqXwXeXrXtX",
+"yXuXiXpXaXsXdXfXgXhXjXkXlXzXxXcX",
+"vXbXnXmXMXNXBXVXCXZXAXSXDXFXGXHX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 140 2 ",
+"   c #010101",
+".  c #080404",
+"X  c #0B0A0A",
+"o  c #111111",
+"O  c #131A1A",
+"+  c #1B1B1B",
+"@  c #320202",
+"#  c #252525",
+"$  c #2A2A2A",
+"%  c #322F32",
+"&  c #2F3537",
+"*  c #373637",
+"=  c #393537",
+"-  c #393639",
+";  c #3A3A3A",
+":  c #7D0000",
+">  c #5D3537",
+",  c #444444",
+"<  c #4C4C4C",
+"1  c #4C5353",
+"2  c #535353",
+"3  c #715353",
+"4  c #616161",
+"5  c gray46",
+"6  c #7D767E",
+"7  c #820202",
+"8  c #9B0202",
+"9  c #A21A1A",
+"0  c #C70302",
+"q  c #CB0101",
+"w  c #CC0D0D",
+"e  c #D50101",
+"r  c #DA0101",
+"t  c #CD1414",
+"y  c #CC1B1B",
+"u  c #D61A1A",
+"i  c #CE2626",
+"p  c #CD2D2D",
+"a  c #CE3535",
+"s  c #CE3C3C",
+"d  c #D23436",
+"f  c #D93537",
+"g  c #D33538",
+"h  c #D43D3D",
+"j  c #CF4545",
+"k  c #CF4B4B",
+"l  c #D44242",
+"z  c #D34848",
+"x  c #CF5252",
+"c  c #D35555",
+"v  c #D05B5B",
+"b  c #D06262",
+"n  c #CE7676",
+"m  c #C6767E",
+"M  c #D07070",
+"N  c #DD747D",
+"B  c #D17979",
+"V  c #E2757E",
+"C  c #048E02",
+"Z  c #069105",
+"A  c #0A9106",
+"S  c #0C930B",
+"D  c #10950F",
+"F  c #139713",
+"G  c #1B9617",
+"H  c #169816",
+"J  c #1B991B",
+"K  c #219A1F",
+"L  c #1F9A20",
+"P  c #239B22",
+"I  c #2B9F2B",
+"U  c #2FA02F",
+"Y  c #31A131",
+"T  c #38A337",
+"R  c #3BA43B",
+"E  c #42A642",
+"W  c #41AB47",
+"Q  c #43AC48",
+"!  c #4EAA4E",
+"~  c #4CAF51",
+"^  c #57AD57",
+"/  c #5AAE5A",
+"(  c #65B266",
+")  c #6AB36A",
+"_  c #827A82",
+"`  c #808080",
+"'  c gray55",
+"]  c #908E8E",
+"[  c #939393",
+"{  c #9D9B9B",
+"}  c #BB9393",
+"|  c #86BF8A",
+" . c #A7A4A4",
+".. c #ABABAB",
+"X. c #B1B1B1",
+"o. c #BCBCBC",
+"O. c #D28484",
+"+. c #D38C8C",
+"@. c #D39393",
+"#. c #D29B9B",
+"$. c #D99CA1",
+"%. c #D4A5A4",
+"&. c #D3A9A9",
+"*. c #CCBEBE",
+"=. c #D3B2B2",
+"-. c #D4BBBB",
+";. c #96D1A6",
+":. c #99D1A7",
+">. c #ADC8AD",
+",. c #A6D1A6",
+"<. c #AAD2AA",
+"1. c #BDCEBD",
+"2. c #B4D5BE",
+"3. c #BFC6C6",
+"4. c #BFC9C9",
+"5. c #C3C3C4",
+"6. c #C2CECE",
+"7. c #D4C5C5",
+"8. c #DEC2C9",
+"9. c #D5CCCC",
+"0. c #CAD1CA",
+"q. c #C5D9CE",
+"w. c #CED9CE",
+"e. c #DFCFD6",
+"r. c #C2D0D0",
+"t. c #CBD0D1",
+"y. c #C8DAD2",
+"u. c #D4D4D4",
+"i. c #DAD6D9",
+"p. c #D5DBDB",
+"a. c #DDDBDD",
+"s. c #DFE0DF",
+"d. c #D6E2E2",
+"f. c #DCE2E2",
+"g. c #D6ECEC",
+"h. c #D6F6F6",
+"j. c #D7FAFA",
+"k. c #E3E3E3",
+"l. c #F3F3F3",
+"z. c #F8F8F8",
+/* pixels */
+"u.u.u.u.u.i.u.p.u.p.u.u.u.u.u.i.u.u.u.u.u.u.u.p.u.u.u.u.u.u.p.u.",
+"u.p.p.u.u.u.u.u.9.u.u.u.u.u.t.u.u.u.u.a.u.u.u.u.u.u.u.u.u.u.u.u.",
+"u.9.z t u t t y y u 9 O + + + + + + + ' s.o.....X.X.X...X.X.u.u.",
+"d.&.q q q w t q q e 8                 ; u.................X.u.p.",
+"p.&.q q q +.7.q 0 e 8                 ; s.................X.u.u.",
+"d.&.q i s %.9.j p e 8     * , , , < . * p...................u.u.",
+"d.&.q v h.u.u.h.#.e 8     o.l.k.k.l.$ $ a.................X.u.u.",
+"d.&.q t y #.9.i y e 8     # $ # # $   ; a......... .......X.u.u.",
+"p.&.q w q O.=.q q e 8   .             * i.................X.u.u.",
+"p.=.q q q q 0 q 0 e 8                 < s... . . . . . . ...u.u.",
+"u.u.$.N N N N N N V m 6 6 6 6 6 6 6 _ 5.i.0.6.6.4.r.r.r.4.5.u.u.",
+"u.i.2.;.:.;.;.:.;.;.;.,.,.,.,.,.,.,.<.u.a.-.+.@.@.@.@.+.&.s.u.i.",
+"i.1.J A A S D S Z S Z Z S Z S S S Z C ( e.y q q q q q q q &.s.t.",
+"a.>.S R Y H J P E J J J L E J J H R P W 8.w q q s B w 0 q @.d.u.",
+"a.>.F P / I H / U H J J H R ^ S T ^ S ~ 8.0 q q M g.w q 0 @.d.u.",
+"a.>.F G G ^ ( P H J J J J D U ) ~ J S ~ 8.q p &.-.u.=.+.q @.s.u.",
+"a.>.F H G ^ ( I F J J J J F Y ) ! H S ~ 8.q a =.-.u.=.+.q @.d.u.",
+"a.>.F L / I H / U H J J H R / S R ^ D ~ 8.0 q q M g.w q q @.d.u.",
+"a.>.Z T I F H J R H J H H R H H D R J W 8.q q 0 a n w 0 q @.d.9.",
+"i.t.E H J P P J J J J K P J K K P J G | 8.e r r r r r r r @.d.u.",
+"u.i.s.w.w.w.w.w.y.w.w.q.q.q.q.q.q.q.y.f.7.7 7 7 7 7 7 7 : } d.u.",
+"u.u.4 % - * * * = * > f g g g d d d g %.4.                [ s.u.",
+"f...                @ e q q q q q q q l 4..   . .   . .   [ k.u.",
+"s...                @ e 0 q w 9.v q q h 4..               [ k.9.",
+"s...  o $ # # $ +   @ e q y a d.B u q h 6.  X $ # # $ +   [ k.u.",
+"s...  4 z.k.k.z.{   @ e q 7.g.u.p.h.p d 6.  ; z.k.k.l.o.  [ f.u.",
+"s...  + , , , , $   @ e q d c p.O.s 0 h 4.  o , , , , *   [ k.u.",
+"s...  .         .   @ e 0 q w p.b q q h 4..           .   [ f.u.",
+"a.X.                @ e q q q t w q q z 6.X   .           { a.u.",
+"u.i.` < 2 2 2 2 2 1 3 c x x c z k x v =.f.] < 2 2 2 2 < 5 u.u.u.",
+"u.u.k.k.k.k.k.k.k.k.k.d.d.d.d.d.d.d.d.p.u.f.k.k.k.k.k.k.k.u.u.u.",
+"u.u.t.9.u.u.t.u.9.t.u.u.u.u.u.9.u.u.u.u.u.u.u.0.u.u.u.u.u.u.p.u."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 122 2 ",
+"   c #010101",
+".  c #0B0B0B",
+"X  c #131313",
+"o  c #181818",
+"O  c #3A0101",
+"+  c #222222",
+"@  c gray21",
+"#  c #343D3D",
+"$  c #3D3C3C",
+"%  c #663D3D",
+"&  c #424242",
+"*  c #5B5B5B",
+"=  c #636363",
+"-  c #6D6D6D",
+";  c gray46",
+":  c #7B7B7B",
+">  c #920101",
+",  c #AB0101",
+"<  c #A53D3D",
+"1  c #B73D3D",
+"2  c #CB0101",
+"3  c #CC0B0B",
+"4  c #D40101",
+"5  c #D80101",
+"6  c #CD1111",
+"7  c #CD1D1D",
+"8  c #CE2424",
+"9  c #CE2B2B",
+"0  c #CE3333",
+"q  c #CE3D3C",
+"w  c #D63D3D",
+"e  c #CF4343",
+"r  c #CC4846",
+"t  c #CF5252",
+"y  c #CD5959",
+"u  c #D05555",
+"i  c #D05959",
+"p  c #D06464",
+"a  c #D06B6B",
+"s  c #CE7676",
+"d  c #D17474",
+"f  c #D17C7C",
+"g  c #059305",
+"h  c #0D950D",
+"j  c #129712",
+"k  c #169816",
+"l  c #1A991A",
+"z  c #21991E",
+"x  c #239A21",
+"c  c #2A9E2A",
+"v  c #2EA02E",
+"b  c #34A234",
+"n  c #3CA43C",
+"m  c #45A745",
+"M  c #49A748",
+"N  c #4BA94B",
+"B  c #54AB54",
+"V  c #5FAF5F",
+"C  c #64B164",
+"Z  c #69B066",
+"A  c #6BB36B",
+"S  c #72B26F",
+"D  c #75B675",
+"F  c #78B778",
+"G  c #7CB87B",
+"H  c #808080",
+"J  c gray56",
+"K  c #909090",
+"L  c #999799",
+"P  c #9A999A",
+"I  c #AC999B",
+"U  c #8BBD8B",
+"Y  c #A09EA0",
+"T  c #A7A7A7",
+"R  c #AAAAAA",
+"E  c #B4B4B4",
+"W  c #BBBBBB",
+"Q  c #D28282",
+"!  c #D28B8B",
+"~  c #C5999B",
+"^  c #C99898",
+"/  c #D29090",
+"(  c #D69799",
+")  c #D4999A",
+"_  c #D9999B",
+"`  c #D59FA0",
+"'  c #D2A2A2",
+"]  c #D3ADAD",
+"[  c #D4B3B3",
+"{  c #D4BBBB",
+"}  c #96C196",
+"|  c #B7CBB7",
+" . c #BDCDBD",
+".. c #C2CCBF",
+"X. c #C5C5C5",
+"o. c #C9C7C7",
+"O. c #C2CDC0",
+"+. c #CBCCCC",
+"@. c #D4C4C4",
+"#. c #D6CCCC",
+"$. c #CFD1CF",
+"%. c #CBDED7",
+"&. c #CEDED9",
+"*. c #D5D4D4",
+"=. c #D9D2D5",
+"-. c #D7DED7",
+";. c #D8DED7",
+":. c #DBD7DB",
+">. c #D5DCDC",
+",. c #DBDBDB",
+"<. c #D6E2E2",
+"1. c #DBE2E3",
+"2. c #D6ECEC",
+"3. c #D6F1F1",
+"4. c #D7FDFD",
+"5. c #E2E2E2",
+"6. c #E2EAEA",
+"7. c #E8E8E8",
+"8. c #E4E7F1",
+"9. c #E3F2F2",
+"0. c #F4F4F4",
+"q. c white",
+/* pixels */
+"*.*.,.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.;.*.*.*.",
+"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.=.*.*.*.*.*.*.*.*.",
+"*.*.*.*.=.*.*.*.=.*.*.=.*.*.=.*.*.*.*.*.*.$.$.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.=.*.*.*.*.*.*.",
+"*.*.*.*.>.<.<.<.>.<.<.<.<.<.<.>.<.5.5.5.5.5.5.5.5.5.1.5.1.*.*.:.,.*.,.,.,.*.*.>.,.>.;.>.*.*.*.*.",
+"*.*.*.>.' e q w q q e q w q q w < # $ $ $ $ $ $ $ $ $ $ - =.*.*.W E E E W E E E E E E E *.*.*.*.",
+"*.*.*.@.6 2 2 2 2 2 2 2 2 2 2 5 >                         ; 5.W T R R T T T R T T R R T +.:.*.*.",
+"*.*.>.[ 2 2 2 2 2 8 8 3 2 2 2 4 >             .       .   * 7.E T R R R R R R R R R R R +.,.*.*.",
+"*.*.>.[ 2 2 2 2 6 #.>.9 2 2 2 5 >         .     .         * 7.E R R R R R R R R R R R R $.=.*.*.",
+"*.=.>.[ 2 4 2 2 3 @.>.8 2 2 2 4 >                         * 7.E T R R R R R R R R R R R $.,.,.*.",
+",.*.>.[ 2 2 e f f =.*.Q f u 2 4 >       = : ; ; ; ; H @   * 7.E R R R R R R R R R R R R +.*.*.*.",
+"*.*.>.[ 2 2 ! 4.3.*.*.2.4.] 2 5 >       +.q.0.0.0.0.q.-   = 7.R T R R R R R R R R R R R $.*.*.*.",
+"*.*.>.[ 2 2 r f f $.>.Q f y 2 5 >       = : ; : ; ; : @   * 7.E T R R R R R R R R T R R +.,.*.*.",
+"*.*.<.[ 2 2 2 2 3 #.>.8 2 2 2 4 >                         * 7.E T R R R R R R R R R R R $.=.*.*.",
+"*.*.>.[ 2 2 4 2 3 #.>.8 2 2 2 4 >         .           .   * 7.E R R R R R R R R R R R T +.,.*.*.",
+"*.*.>.[ 2 2 2 2 2 8 8 3 2 2 2 5 >                         * 7.R T R R R R R R R R R R R $.*.*.*.",
+"*.*.*.*.e 2 2 2 2 2 2 2 2 2 2 4 >                       . T ,.X.R T R T T R T T R T T T $.*.*.*.",
+"*.*.*.*.*.' ) ) ) ) ) ) ) ) ) _ ~ P P P P P P P P P P P W ,.*.*.$.+.+.+.+.+.+.+.+.+.X.X.*.*.*.*.",
+"*.*.*.*.:.&.%.%.&.%.&.%.&.%.%.%.>.-.-.-.-.-.-.-.-.-.-.-.>.*.*.<.=.#.#.#.#.#.#.#.#.#.<.>.*.*.*.*.",
+"*.*.*.=.G x x x x x x x x x x x x x x x x x x x x x x z m ..,.] 8 3 6 3 3 6 3 3 3 3 i *.*.*.*.*.",
+"*.*.,...k k h h k l k k k j k k k k k k h k k k k k k k g D 8.r 2 2 2 2 2 2 2 2 2 2 2 ' <.*.*.*.",
+"*.*.:.| l k n v k l l l l m l l k l k l N k l l l k b n g A 8.q 2 2 2 2 0 a 0 2 2 2 2 ) <.$.*.*.",
+"*.-.:.| k k n D l k l k A N h l k l l k B C h l j x D b g A 8.0 2 2 2 2 Q 4.f 2 3 2 2 ) <.=.*.*.",
+"*.*.:.| k l j b D l j A N h l k l l l l h B C h c D c j h C 8.q 2 2 2 2 d 3.s 2 2 2 2 ( <.*.=.*.",
+"*.*.:.| k l l h b A A m h l l l l k l k l h N A C v j x g C 8.q 2 8 [ [ @.*.@.] [ 8 2 ) <.*.*.*.",
+"*.*.:.| l l l l h G U k k l l l l l l l k j x } C h l x h A 8.q 2 9 2.2.>.*.>.2.2.8 2 ) <.*.*.*.",
+"*.*.:.| k l k k A n v D l k k l k l k l j c F x N C j l g C 8.q 2 6 q 0 ! 2.! 0 e 3 2 ) <.*.*.*.",
+"*.*.>.| k l l A m j k b D x k l l l l k c F c k k B C k h Z 8.q 2 2 2 2 f 4.f 2 2 2 2 ^ <.*.*.*.",
+"*.*.:.| k j B N j l l h n V k l l l l l C c j l l h B N g Z 2.q 2 2 2 2 p #.p 2 3 2 2 ) <.=.*.*.",
+"*.*.:. .k k l j k k k k j k k k k k k k k j k k k k j l g S 8.0 2 2 2 2 2 2 2 2 2 2 2 ) <.*.*.*.",
+"*.*.*.*.G x l x x x x x x x x x x x x x x x x x x x x x M ..<.w 4 4 4 4 4 4 4 4 4 4 4 ) >.=.*.*.",
+"*.*.*.*.,.>.;.;.;.;.-.-.-.-.>.;.>.%.%.%.%.%.%.%.&.%.%.%.>.=.<.1 , , , , , , , , , , , ^ <.*.*.*.",
+"*.*.=.,.*.Y P P P P P P P P P P I _ ) ) _ ) ) ) _ ( _ ( { &.5.$                       L 5.*.*.*.",
+"*.*.*.*.&                       O 5 2 2 2 2 2 2 2 2 2 2 3 ) 6.$                       L 5.$.*.*.",
+"*.*.,.E                         O 5 2 2 2 2 2 2 2 2 2 2 2 y 9.$                       L 5.*.*.*.",
+"*.=.1.E                         O 4 2 2 2 2 9 ' f 2 2 3 2 y 6.$                       L 1.*.*.*.",
+"*.*.,.E                         O 4 2 2 2 2 e 4.{ 2 2 2 2 u 9.$                       P 5.*.*.*.",
+"*.*.,.E     X + + + + + + o     O 5 2 2 7 7 t <.[ 7 8 6 2 y 9.$     + + + + + + + .   L 5.$.*.*.",
+"*.*.:.E     H 7.*.;.,.,.7.P     O 5 2 2 { <.>.*.*.,.2.p 2 y 9.$   + ,.,.:.,.,.;.,.+   P 5.*.*.*.",
+"*.*.;.E     ; ,.X.o.o.X.*.J     O 5 2 2 ' $.#.*.*.@.*.i 2 y 9.$   + +.+.o.+.o.o.+.+   P 1.*.*.*.",
+"*.*.,.E       . . . . . . .     O 5 2 2 3 2 e <.] 3 3 3 2 y 9.$   . . . . . . . X     L 5.=.*.*.",
+"*.*.,.E                         O 5 2 2 2 2 q 4.{ 2 2 2 2 i 9.$                       P 5.$.*.*.",
+"*.*.;.E                         O 5 2 2 2 2 8 ! a 2 3 2 2 u 9.@                       L 5.*.*.*.",
+"*.*.*.X.X                       O 4 2 2 2 2 2 2 2 2 2 2 2 s 9.*                       E ,.*.*.*.",
+"*.*.*.,.T & $ $ & $ $ $ $ $ & # % w q w e q w e e q q q a =.,.+.= $ & $ $ & $ $ & $ K ,.*.*.*.*.",
+"*.*.*.*.:.5.5.5.5.1.5.5.5.,.5.5.1.<.<.<.<.<.<.<.<.>.<.<.<.*.*.>.5.1.5.5.5.5.5.5.5.1.5.*.*.*.*.*.",
+"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.=.*.*.=.=.*.$.=.*.*.*.*.*.*.=.$.*.*.*.$.*.*.*.*.*.*.*.*.",
+"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.:.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.",
+"*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.,.*.*.*."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/magnets-web.png b/icons/magnets-web.png
new file mode 100644 (file)
index 0000000..e158f96
Binary files /dev/null and b/icons/magnets-web.png differ
diff --git a/icons/magnets.ico b/icons/magnets.ico
new file mode 100644 (file)
index 0000000..18cbf73
Binary files /dev/null and b/icons/magnets.ico differ
diff --git a/icons/magnets.rc b/icons/magnets.rc
new file mode 100644 (file)
index 0000000..54197a4
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "magnets.ico"
diff --git a/icons/map-16d24.png b/icons/map-16d24.png
new file mode 100644 (file)
index 0000000..ef5971f
Binary files /dev/null and b/icons/map-16d24.png differ
diff --git a/icons/map-16d4.png b/icons/map-16d4.png
new file mode 100644 (file)
index 0000000..51dc330
Binary files /dev/null and b/icons/map-16d4.png differ
diff --git a/icons/map-16d8.png b/icons/map-16d8.png
new file mode 100644 (file)
index 0000000..cc8d350
Binary files /dev/null and b/icons/map-16d8.png differ
diff --git a/icons/map-32d24.png b/icons/map-32d24.png
new file mode 100644 (file)
index 0000000..c7b5b29
Binary files /dev/null and b/icons/map-32d24.png differ
diff --git a/icons/map-32d4.png b/icons/map-32d4.png
new file mode 100644 (file)
index 0000000..5ab8dca
Binary files /dev/null and b/icons/map-32d4.png differ
diff --git a/icons/map-32d8.png b/icons/map-32d8.png
new file mode 100644 (file)
index 0000000..0d328b7
Binary files /dev/null and b/icons/map-32d8.png differ
diff --git a/icons/map-48d24.png b/icons/map-48d24.png
new file mode 100644 (file)
index 0000000..c2ad1fd
Binary files /dev/null and b/icons/map-48d24.png differ
diff --git a/icons/map-48d4.png b/icons/map-48d4.png
new file mode 100644 (file)
index 0000000..16354a6
Binary files /dev/null and b/icons/map-48d4.png differ
diff --git a/icons/map-48d8.png b/icons/map-48d8.png
new file mode 100644 (file)
index 0000000..f728fb5
Binary files /dev/null and b/icons/map-48d8.png differ
diff --git a/icons/map-base.png b/icons/map-base.png
new file mode 100644 (file)
index 0000000..e1caaf1
Binary files /dev/null and b/icons/map-base.png differ
diff --git a/icons/map-ibase.png b/icons/map-ibase.png
new file mode 100644 (file)
index 0000000..e1caaf1
Binary files /dev/null and b/icons/map-ibase.png differ
diff --git a/icons/map-ibase4.png b/icons/map-ibase4.png
new file mode 100644 (file)
index 0000000..13f47e8
Binary files /dev/null and b/icons/map-ibase4.png differ
diff --git a/icons/map-icon.c b/icons/map-icon.c
new file mode 100644 (file)
index 0000000..67011db
--- /dev/null
@@ -0,0 +1,640 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c gray90",
+".  c #DCDEDB",
+"X  c #DADCD9",
+"o  c #DBDDD9",
+"O  c #DADFDA",
+"+  c #DADAD8",
+"@  c #DBD9D8",
+"#  c #DEDDDC",
+"$  c #E1E1E1",
+"%  c #DEDBDA",
+"&  c #DEDCD8",
+"*  c #DFDDD8",
+"=  c #DFDDD8",
+"-  c #DFDDD8",
+";  c #DFDEDA",
+":  c gray90",
+">  c #DADCD9",
+",  c #83996C",
+"<  c #829B6A",
+"1  c #84956A",
+"2  c #838A65",
+"3  c #8C7B61",
+"4  c #886F56",
+"5  c #C7C1BB",
+"6  c #EAEEF2",
+"7  c #BCA294",
+"8  c #C1A663",
+"9  c #CDB770",
+"0  c #CAB36E",
+"q  c #CAB26B",
+"w  c #C8B476",
+"e  c #E0DFDC",
+"r  c #DFDFDF",
+"t  c #B1BBA6",
+"y  c #819969",
+"u  c #817355",
+"i  c #8B6E57",
+"p  c #866D52",
+"a  c #B4A89B",
+"s  c #E9EAEB",
+"d  c #E4E4E3",
+"f  c #B68E7C",
+"g  c #BC995B",
+"h  c #CBB364",
+"j  c #C9AF63",
+"k  c #CEB561",
+"l  c #CAB36E",
+"z  c #E0DFDB",
+"x  c #E1E1E1",
+"c  c #E9E7EB",
+"v  c #D1D3D0",
+"b  c #D0CECA",
+"n  c #D6D3D0",
+"m  c #CECBC9",
+"M  c #DEDEDF",
+"N  c #EDF2F5",
+"B  c #CABCB4",
+"V  c #AB755A",
+"C  c #B28168",
+"Z  c #B18364",
+"A  c #B08164",
+"S  c #BD9D60",
+"D  c #CEB970",
+"F  c #E0DFDC",
+"G  c #E2E2E2",
+"H  c #D9D9D8",
+"J  c #E4E4E5",
+"K  c #EAEBEB",
+"L  c #EAEBEC",
+"P  c #E0E1E1",
+"I  c #D8D8D8",
+"U  c #B7ADA3",
+"Y  c #8F7962",
+"T  c #A97A60",
+"R  c #B98269",
+"E  c #B47F66",
+"W  c #B37F67",
+"Q  c #B17B61",
+"!  c #A99067",
+"~  c #DEDEDB",
+"^  c #E2E2E2",
+"/  c gray86",
+"(  c #E6E6E6",
+")  c #E6E6E6",
+"_  c #E3E2E2",
+"`  c #DDDDDD",
+"'  c #E1E3E5",
+"]  c #B6ACA5",
+"[  c #886950",
+"{  c #A67A61",
+"}  c #A78063",
+"|  c #B18266",
+" . c #A88164",
+".. c #8D825C",
+"X. c #947664",
+"o. c #DBDCDB",
+"O. c #E2E2E2",
+"+. c #D8D8D8",
+"@. c gray90",
+"#. c #E8E8E7",
+"$. c #E3E4E6",
+"%. c #DCDBD6",
+"&. c #CDB97D",
+"*. c #CCC5A0",
+"=. c #847A5E",
+"-. c #866F55",
+";. c #788C5E",
+":. c #8C7458",
+">. c #8C8962",
+",. c #799B64",
+"<. c #8A8164",
+"1. c #DFDBDB",
+"2. c gray88",
+"3. c #D8D8D8",
+"4. c gray87",
+"5. c #DADADA",
+"6. c #D5D4D5",
+"7. c #D1CCC0",
+"8. c #C1A95E",
+"9. c #BEA159",
+"0. c #8E805C",
+"q. c #789062",
+"w. c #809565",
+"e. c #7E885D",
+"r. c #7B9262",
+"t. c #7D8E5E",
+"y. c #8D7C63",
+"u. c #DEDCDB",
+"i. c #E1E1E1",
+"p. c #E2E2E1",
+"a. c #E4E3E3",
+"s. c #E6E7E8",
+"d. c #B9B0A6",
+"f. c #886F55",
+"g. c #8D765B",
+"h. c #8D7259",
+"j. c #A77A61",
+"k. c #949462",
+"l. c #819C65",
+"z. c #79875F",
+"x. c #896F57",
+"c. c #887055",
+"v. c #927A64",
+"b. c #DDDCDB",
+"n. c #E1E1E1",
+"m. c #E6E7E8",
+"M. c #ECEEEF",
+"N. c #EEEFF0",
+"B. c #D0CAC7",
+"V. c #8C735A",
+"C. c #8C7359",
+"Z. c #8D755A",
+"A. c #8B6D58",
+"S. c #B7955E",
+"D. c #BFB064",
+"F. c #A7975D",
+"G. c #88815A",
+"H. c #887056",
+"J. c #927C64",
+"K. c #DDDCDB",
+"L. c #DFDFDE",
+"P. c #C8C3BE",
+"I. c #D0CAC5",
+"U. c #B9B3A9",
+"Y. c #847A5C",
+"T. c #897257",
+"R. c #8B7059",
+"E. c #876F58",
+"W. c #866B57",
+"Q. c #AF975E",
+"!. c #D5BA68",
+"~. c #D0B766",
+"^. c #889360",
+"/. c #886E55",
+"(. c #937963",
+"). c #DDDCDB",
+"_. c #DBD9D7",
+"`. c #8A735C",
+"'. c #876B50",
+"]. c #837052",
+"[. c #789461",
+"{. c #7C9062",
+"}. c #90835A",
+"|. c #AA905B",
+" X c #A77C60",
+".X c #B99163",
+"XX c #CAB365",
+"oX c #CDB366",
+"OX c #90945F",
+"+X c #7D7055",
+"@X c #8A8766",
+"#X c #DDDDDB",
+"$X c #DBD9D8",
+"%X c #937B62",
+"&X c #8C7458",
+"*X c #8A6D5A",
+"=X c #987C5F",
+"-X c #7E9967",
+";X c #879D65",
+":X c #CFBA66",
+">X c #C1A065",
+",X c #AD7965",
+"<X c #B39060",
+"1X c #CDB566",
+"2X c #C8B066",
+"3X c #88945E",
+"4X c #7F9C71",
+"5X c #DDDEDC",
+"6X c #DCD7D8",
+"7X c #B48E67",
+"8X c #BEA65C",
+"9X c #A18659",
+"0X c #B67D62",
+"qX c #A37F60",
+"wX c #769061",
+"eX c #989259",
+"rX c #BD985F",
+"tX c #B0865F",
+"yX c #CAB162",
+"uX c #CCB263",
+"iX c #D0B465",
+"pX c #C7AF5F",
+"aX c #A0A169",
+"sX c #DDDEDB",
+"dX c #E1DCDB",
+"fX c #A5856F",
+"gX c #B59F67",
+"hX c #D2BE71",
+"jX c #B5956C",
+"kX c #B58170",
+"lX c #AB926B",
+"zX c #928361",
+"xX c #AC846A",
+"cX c #B3886E",
+"vX c #C4AD6E",
+"bX c #CBB570",
+"nX c #C9B370",
+"mX c #CBB46D",
+"MX c #CDB678",
+"NX c #E0DFDC",
+"BX c #E6E5E5",
+"VX c #DDDBDC",
+"CX c #DCDBDA",
+"ZX c #E0DFDC",
+"AX c #E0DEDB",
+"SX c #DEDCDB",
+"DX c #E2DFDC",
+"FX c #E0DEDB",
+"GX c #DEDBDC",
+"HX c #DFDCDC",
+"JX c #DFDEDB",
+"KX c #E0DFDC",
+"LX c #E0DFDC",
+"PX c #DFDFDB",
+"IX c #DFDFDC",
+"UX c gray90",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+"> , < 1 2 3 4 5 6 7 8 9 0 q w e ",
+"r t y u i p a s d f g h j k l z ",
+"x c v b n m M N B V C Z A S D F ",
+"G H J K L P I U Y T R E W Q ! ~ ",
+"^ / ( ) _ ` ' ] [ { } |  ...X.o.",
+"O.+.@.#.$.%.&.*.=.-.;.:.>.,.<.1.",
+"2.3.4.5.6.7.8.9.0.q.w.e.r.t.y.u.",
+"i.p.a.s.d.f.g.h.j.k.l.z.x.c.v.b.",
+"n.m.M.N.B.V.C.Z.A.S.D.F.G.H.J.K.",
+"L.P.I.U.Y.T.R.E.W.Q.!.~.^./.(.).",
+"_.`.'.].[.{.}.|. X.XXXoXOX+X@X#X",
+"$X%X&X*X=X-X;X:X>X,X<X1X2X3X4X5X",
+"6X7X8X9X0XqXwXeXrXtXyXuXiXpXaXsX",
+"dXfXgXhXjXkXlXzXxXcXvXbXnXmXMXNX",
+"BXVXCXZXAXSXDXFXGXHXJXKXLXPXIXUX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 155 2 ",
+"   c #77734E",
+".  c #7D6C50",
+"X  c #7D7656",
+"o  c #7C7957",
+"O  c #7C7759",
+"+  c #7C7D59",
+"@  c #84674C",
+"#  c #83694E",
+"$  c #856D54",
+"%  c #8A6E55",
+"&  c #856F5A",
+"*  c #8C6F5A",
+"=  c #926D55",
+"-  c #926F58",
+";  c #847255",
+":  c #8B7256",
+">  c #8F7855",
+",  c #86755D",
+"<  c #8C745A",
+"1  c #927956",
+"2  c #9D7B55",
+"3  c #90735B",
+"4  c #9B735B",
+"5  c #947E5E",
+"6  c #9B7C5F",
+"7  c #A4745C",
+"8  c #AC765B",
+"9  c #A47C5D",
+"0  c #AA7A5E",
+"q  c #8D7760",
+"w  c #9F7E60",
+"e  c #927F6B",
+"r  c #A37D61",
+"t  c #AC7C63",
+"y  c #A67A68",
+"u  c #AA7E69",
+"i  c #B17660",
+"p  c #B37E66",
+"a  c #B57F68",
+"s  c #76865C",
+"d  c #7A855C",
+"f  c #748C5C",
+"g  c #7B8B5E",
+"h  c #7B915E",
+"j  c #7C8E60",
+"k  c #749762",
+"l  c #7C9464",
+"z  c #7E9A66",
+"x  c #7E9369",
+"c  c #7D9C68",
+"v  c #7DA069",
+"b  c #8B8256",
+"n  c #84845D",
+"m  c #88835C",
+"M  c #828C5E",
+"N  c #8C945F",
+"B  c #8E995F",
+"V  c #92965C",
+"C  c #92985F",
+"Z  c #AD825F",
+"A  c #A08858",
+"S  c #AB8B59",
+"D  c #B08D5E",
+"F  c #A69057",
+"G  c #A39E5E",
+"H  c #A89F5F",
+"J  c #B4945E",
+"K  c #B29C5D",
+"L  c #BA9E5D",
+"P  c #B4A35F",
+"I  c #B9A15D",
+"U  c #809765",
+"Y  c #819A67",
+"T  c #8D9960",
+"R  c #829B6A",
+"E  c #919B61",
+"W  c #918976",
+"Q  c #879A72",
+"!  c #8C9C7B",
+"~  c #AD8260",
+"^  c #AE836C",
+"/  c #B48066",
+"(  c #B88066",
+")  c #B28B61",
+"_  c #B48269",
+"`  c #BC8169",
+"'  c #A89362",
+"]  c #B69E66",
+"[  c #B99B62",
+"{  c #AF8670",
+"}  c #A68978",
+"|  c #AFA267",
+" . c #B4A560",
+".. c #BCA362",
+"X. c #BFAA60",
+"o. c #B5A56E",
+"O. c #BCA768",
+"+. c #BEAA6C",
+"@. c #BDAB71",
+"#. c #C1A75F",
+"$. c #C3AA5C",
+"%. c #C1A465",
+"&. c #C3AC65",
+"*. c #C8AE63",
+"=. c #C4AE6B",
+"-. c #C6B163",
+";. c #CCB365",
+":. c #C6B16B",
+">. c #CCB46A",
+",. c #CFB868",
+"<. c #D2B666",
+"1. c #D3BA66",
+"2. c #D0B669",
+"3. c #D2BA69",
+"4. c #9F9285",
+"5. c #A79A8C",
+"6. c #B99B8C",
+"7. c #ACA297",
+"8. c #ADA398",
+"9. c #B1A79C",
+"0. c #B3A99E",
+"q. c #B6ADA4",
+"w. c #B8B0A7",
+"e. c #BDB5AE",
+"r. c #BDBAB5",
+"t. c #C6B98F",
+"y. c #C4BEAE",
+"u. c #C5BCB7",
+"i. c #CBBFB9",
+"p. c #C1C5BC",
+"a. c #C8C3BF",
+"s. c #D1C5BF",
+"d. c #CAC6C1",
+"f. c #CDC9C6",
+"g. c #CDCDCC",
+"h. c #D3CEC0",
+"j. c #D6D1C1",
+"k. c #D3D1CF",
+"l. c #D5D5D4",
+"z. c #D9D6D5",
+"x. c #D7D8D6",
+"c. c #DBD9D6",
+"v. c #D6D6D9",
+"b. c #D8D7D9",
+"n. c #DCDCDC",
+"m. c #DEDEE1",
+"M. c #DFE1E2",
+"N. c #E5E5E5",
+"B. c #E8E8E7",
+"V. c #E5E6E9",
+"C. c #E5E8EA",
+"Z. c #E9E9E9",
+"A. c #EEEFF0",
+"S. c #EEF1F3",
+"D. c #F3F6FA",
+/* pixels */
+"N.N.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.C.Z.B.Z.Z.Z.C.Z.Z.Z.Z.Z.Z.Z.Z.Z.B.N.",
+"N.N.x.x.c.x.x.c.x.x.x.z.z.c.c.n.n.n.c.z.c.c.c.c.c.c.c.n.c.c.N.N.",
+"Z.x.x U z z z x z x O < , $ 4.N.b.N.u.7 ] ;.&.&.=.&.&.&.&.+.n.Z.",
+"Z.c.l z U Y z + X o ; < 3 # q.S.N.A.d.8 %.<.;.;.;.;.<.;.<.:.n.Z.",
+"Z.c.! R l Y + * < < 3 < # 8.C.N.N.A.a.7 ..<.;.>.>.;.;.>.;.=.n.B.",
+"Z.n.m.c.Q f . % $ $ % # 7.A.N.N.Z.k._ / ~ #.;.-.*.;.;.;.<.=.n.Z.",
+"Z.n.n.Z.n.p.r.d.d.d.r.f.Z.Z.Z.N.Z.6.8 / p t ~ ~ ~ 0 I 3.;.=.n.Z.",
+"Z.n.n.B.n.z.N.A.Z.A.c.n.v.g.c.Z.C.} p / / / / / / _ t I <.:.n.Z.",
+"Z.n.n.n.c.N.N.N.N.N.N.M.l.x.k.z.5.# 4 / / / / / / / / t L O.n.B.",
+"Z.n.c.v.Z.N.Z.N.N.N.n.l.l.M.0.. : : 4 / ~ / / / / / p _ = , n.B.",
+"Z.n.n.v.Z.N.N.N.N.N.l.B.N.M.u.# < % / _ / ` / / / r n t 4 q n.Z.",
+"Z.n.n.b.N.N.Z.N.B.N.b.Z.n.k.D.w.$ < - 7 6 w 6 / ` 6 k 5 : < n.Z.",
+"C.n.n.b.Z.N.Z.N.N.N.x.C.t.+.n.x.$ < < $ s z f 0 r g z z + < n.Z.",
+"Z.n.c.b.C.N.N.C.B.z.N.s.$.;.:.o.f X = ; z d # % d c Y R + < n.Z.",
+"Z.n.g.k.l.n.Z.c.z.n.S.s.-.1.1.$.n o o l Y d , o g Y Y z o q n.Z.",
+"Z.n.n.Z.N.l.n.g.b.z.v.u.I $.I P i n c Y Y c z Y l g l + % q n.Z.",
+"B.n.n.B.B.N.n.M.g.$ < < : % : $ p 9 l l z U Y d $ $ ; : : q n.Z.",
+"B.n.n.B.N.N.B.B.N.e $ < < < < : 4 ` A G N z l $ 3 < 3 < : q n.Z.",
+"Z.n.n.B.N.N.N.N.Z.c.q : < : < < & 4 9 2.*.V M > ; X < < : q n.Z.",
+"B.n.n.N.N.N.N.N.V.q.: : < < : < < $ > *.;.<.;.;.B s * : : q n.Z.",
+"Z.n.V.S.S.Z.D.y., % : < : < < : < < 1 ;.;.;.>.;.E d : < : 3 n.Z.",
+"Z.b.8.0.9.9.q.W X O ; : < < < < : % 1 ;.;.;.;.;.E d : < 3 q n.Z.",
+"Z.z.$ @ $ # @ X v Y l o $ : > $ = a / ;.;.;.;.;.T s * < $ , n.Z.",
+"Z.z.< < < < < ; g Y Y z g H *.&.D p t J ;.,.;.;. .g O $ g U n.Z.",
+"Z.b.< < < < < < $ M Y Y z G 1.2.-.Z _ t Z J ;.;.3. .g l Y R n.B.",
+"Z.z.: = > % < % t t g Y U l H <.;.) a t t J ;.;.;.<. .l z R n.Z.",
+"Z.c.y D ;.A $ * _ / t g z x C -.;.) i J ;.;.;.;.;.;.<.P g x n.Z.",
+"Z.c.u [ 1.;.P J t / p t M c + : -.) t P ,.;.;.;.:.;.;.>.I o.n.B.",
+"Z.c.t 2 F ;.<.1.L t / ` 7 V b $ S Z / 0 %.;.;.;.;.;.;.;.1.>.n.C.",
+"Z.c.^ < < :.:.:.O.u _ ^ u %.' , y ^ _ u ..:.:.=.:.=.=.:.:.+.n.Z.",
+"Z.N.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.n.B.B.",
+"N.N.Z.Z.Z.C.Z.Z.B.Z.Z.Z.Z.Z.Z.Z.Z.Z.Z.C.Z.Z.Z.Z.B.Z.Z.Z.Z.Z.N.N."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 106 2 ",
+"   c #7B684F",
+".  c #7E6A52",
+"X  c #767554",
+"o  c #787755",
+"O  c #767855",
+"+  c #82674C",
+"@  c #89664F",
+"#  c #82694D",
+"$  c #846D54",
+"%  c #8B6C55",
+"&  c #836E58",
+"*  c #877056",
+"=  c #897157",
+"-  c #86705A",
+";  c #8C735A",
+":  c #867C5A",
+">  c #897A59",
+",  c #90765C",
+"<  c #9E735A",
+"1  c #A2755C",
+"2  c #A6785F",
+"3  c #AA7A5F",
+"4  c #AC765A",
+"5  c #A27761",
+"6  c #A47962",
+"7  c #AB7B63",
+"8  c #A67F6B",
+"9  c #AC7F68",
+"0  c #B27E65",
+"q  c #74865A",
+"w  c #758A5C",
+"e  c #798E5F",
+"r  c #77905D",
+"t  c #79905F",
+"y  c #798E61",
+"u  c #769564",
+"i  c #7B9363",
+"p  c #7D9965",
+"a  c #7E9468",
+"s  c #9B8555",
+"d  c #8F915A",
+"f  c #92925A",
+"g  c #A8875A",
+"h  c #A9895A",
+"j  c #AE9759",
+"k  c #AE9A59",
+"l  c #B29C5C",
+"z  c #B7A15B",
+"x  c #BDA65F",
+"c  c #BEA85F",
+"v  c #819A66",
+"b  c #809669",
+"n  c #839D69",
+"m  c #AF8169",
+"M  c #B48166",
+"N  c #B88267",
+"B  c #B78268",
+"V  c #B98469",
+"C  c #B39E62",
+"Z  c #B5A062",
+"A  c #BEA661",
+"S  c #BFA962",
+"D  c #B7A469",
+"F  c #C0A75F",
+"G  c #C1AA5F",
+"H  c #C8AE5C",
+"J  c #C0A760",
+"K  c #C1AA65",
+"L  c #C8AF60",
+"P  c #C2AC68",
+"I  c #CDB366",
+"U  c #CEB668",
+"Y  c #D1B666",
+"T  c #D2B867",
+"R  c #D0B768",
+"E  c #D3B969",
+"W  c #9F9387",
+"Q  c #A1968A",
+"!  c #A3988E",
+"~  c #A69C92",
+"^  c #A89E94",
+"/  c #B59F94",
+"(  c #9EA993",
+")  c #BEB28E",
+"_  c #B5A095",
+"`  c #BFB493",
+"'  c #C6C5C3",
+"]  c #C8C7C5",
+"[  c #C9C9C7",
+"{  c #CCCCCC",
+"}  c #D2D0CF",
+"|  c #D6D5D5",
+" . c #D8D7D7",
+".. c #D7D8D7",
+"X. c #D9D8D7",
+"o. c #D6D7DA",
+"O. c #D7D8DC",
+"+. c #DADADA",
+"@. c #E0E0DF",
+"#. c #DFDFE0",
+"$. c #E6E6E6",
+"%. c #E8E8E7",
+"&. c #E5E6EA",
+"*. c #E7E9EA",
+"=. c #E9EAEA",
+"-. c gray94",
+/* pixels */
+"$.$.$.%.$.$.$.$.%.$.$.$.$.%.%.$.$.$.$.$.$.%.$.$.$.$.$.$.%.$.$.$.%.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.",
+"$.$.$.%.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.%.$.$.$.%.%.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.&.$.$.",
+"$.%.$.$.%.%.%.=.=.=.=.%.%.%.=.%.=.=.%.=.%.=.%.=.%.*.%.=.=.%.&.*.*.*.=.=.*.*.=.=.%.=.%.=.$.$.$.$.",
+"$.$.$.$.+.o.X.X......... . ... .X.X.X.X.X.o.+.X.O.X.+.X.X.X.X.X.X.X.X.X.X.X.+. .+. .+.X.$.$.$.$.",
+"$.$.%.+.a a a a a a a a a a a y & - - ; ; - ] +...+.+.] 8 6 C P S P S S P S S S P P P C +.=.$.$.",
+"%.$.%...a v v p v v v p t i i q $ ; ; ; ; $ ..=.%.%.=. .7 7 J T I I U U U U U I R L I P +.=.$.$.",
+"$.$.=.+.a v v v v v p O $ . $ $ ; ; ; , $ Q %.$.$.$.%.| 7 3 J U I I I I I I I I I I I K +.=.$.$.",
+"$.$.%...y i i v v p O = , ; , ; ; ; ; # W *.%.$.$.$.=.o.7 7 J T I I I P I I I I I I I P  .=.$.$.",
+"$.$.%.+.' X.( e n i $ ; ; ; ; ; ; ; $ W =.$.$.$.$.$.=./ 0 0 h I E U U U U U I I I I I P +.=.$.$.",
+"$.%.%.X.O.-.*.( e w . = = & & % & # W =.$.$.$.$.$.%./ 4 M M 7 h c c c G G c U I I I I K X.%.$.$.",
+"$.%.=.+.| %.$.$...[ ' | } } | ' [  .*.=.%.%.$.$.%.| 6 V M 0 B 7 3 3 3 3 3 2 h U I L I P X.%.$.$.",
+"$.%.%.+.X.%.$.$.#.| +.=.=.=.=.+.| #.X.X.X.+.$.$.=.X.7 0 M B 0 B B M M M M B 7 h U I I P X.=.$.$.",
+"$.$.%.+.X.=.$.{ ..| $.$.$.$.$.$.| ..+.{ { { +.-.=.! @ 0 M M M M 7 M M M M M V 7 h U T P +.%.$.$.",
+"%.$.%.+.X.%.{ #.=.%.%.$.$.$.$.$.%.%.#.} $.+.[ +.~ # = % 0 M M 7 M M M M M 0 0 N 7 g K C +.%.$.$.",
+"$.$.*.O.+.+.| =.$.$.$.$.$.$.$.%.$.[ X.{ +...- * $ , * % 0 M M M M M M M 0 M M M V 1 # * o.%.$.$.",
+"$.$.*.X.+.#.o.%.$.$.$.$.$.$.%.$.[ #.-.+.+...$ , ; = % M M m M M 0 m M M M 0 6 7 0 6 & ; +.%.$.$.",
+"$.%.%.+.+.+.X.%.$.%.$.$.$.$.=.X.o.%.%.X.o.%.! # , % % 0 V M N M M M M M M 2 w q 0 7 $ ; ..%.$.%.",
+"%.%.%.+.+.+.o.%.$.$.$.$.$.%.%.+.o.%.=.O.+.=.*.Q $ ; * % 3 2 2 7 2 2 M 0 B 2 i i < < $ ; ..=.$.$.",
+"$.$.%.+.+.+.o.%.$.$.$.$.$.%.%.+.X.=.&.` ) &.-.+.; ; ; ; $   q y i q 7 V 0 : p a y q $ ; ..=.$.$.",
+"$.$.%.+.+.#.X.=.$.$.$.$.$.$.%.o.X.*.` H H ` +.' . $ ; ; , $ i v i q < 2 : p p v n i $ - o.%.$.$.",
+"%.$.%.O.+.#.+.=.$.%.$.$.%.%.$.{ %...A T I L P l w w $ , % o a t . * $ . t v a v a i $ ; o.=.$.$.",
+"$.$.*.X.{ } { +.#.%.$.$...o.[ #.%.| K Y I I T A e w   $ o p n e . * * . t v v p v e $ ; o.=.$.$.",
+"$.$.%.+.{ +.o.o.{ #.-.O.} #.%.=.-.+.P T U I T A 1 < q t a v v p e e e t v n v n p O % - o.=.%.$.",
+"$.%.=.O.+.=.%.%.$.{ X.{ { +.| | | ] l J A A J l 7 3 i v v v v v n v n v e e y r O = ; ; ..%.$.$.",
+"%.$.=.+.| %.$.$.%.$.....+.[ - ; = * % $ $ * = # 2 M : i n v v v v v p o $ . * $ ; ; ; -  .=.$.$.",
+"$.$.=.O.X.%.$.%.$.%.%.%.=.+.$ ; ; ; ; ; ; ; ; $ 2 V 0 > t t a v v v o % ; ; ; ; ; ; , ;  .%.$.$.",
+"$.$.%.X.X.%.$.$.$.$.$.$.$.%.~ # ; ; ; ; ; ; ; = % 0 V 3 l G f u n t $ , ; ; ; ; ; ; ; -  .*.$.$.",
+"%.$.%.+.X.%.$.$.$.$.$.$.$.$.=.^ * ; ; ; ; ; ; ; * % 3 < G E I f t q . $ $ $ ; ; % ; , - X.=.$.$.",
+"$.%.%.+.| *.$.&.$.$.$.$.=.=.=.^ # ; ; ; ; = ; ; ; ; $ $ x U I I x A S k w q $ , ; ; ; ;  .=.$.$.",
+"$.$.=.+.| *.$.$.$.$.$.$.} ..! + , ; ; ; ; ; ; ; ; ; ; $ x Y I I U I E S i y $ ; ; ; ; * +.*.$.$.",
+"$.$.%.O.+.-.%.=.*.%.-.+.; * * , ; ; ; ; = ; ; ; ; ; , % A T I I I I Y x t t $ , ; ; ; -  .=.$.$.",
+"$.$.%.X.]  .} } | } ..' . * * # = ; ; ; ; ; ; ; ; % $   A U L I I I Y x i y $ , ; ; ; -  .%.$.$.",
+"%.$.%.X.- & * * * * ; . q i e y O % ; ; ; ; ; ; = % 3 1 x Y I I I I U A a e $ ; ; ; ; ; +.=.%.%.",
+"$.$.*.X.; ; ; ; ; ; ; $ y n v v p o $ * $ * $ $ % M N 3 c Y I I I L T Z i y $ ; ; = $ . o.%.$.$.",
+"$.$.*.X.; ; ; ; ; ; ; ; X p v p v v t w k G c c h 7 M 7 g I T U I I I I f i o = = o i y o.=.$.$.",
+"$.$.*.X.* ; ; ; ; ; ; ; % X p n v v n t K E U T U h 0 B 7 h x c L I I I I f u o X p v a +.%.$.$.",
+"&.$.=. .; , ; ; ; ; ; ; * % > i v v v i d I I I Y S 3 M M M 7 1 A U I P U Y f i v v v a ..%.%.%.",
+"$.$.=. .$ $ % % = ; ; % % 0 0 > p v a v u f L I U x 7 M M 7 3 1 A U I I L I I f i v v a ..%.$.$.",
+"$.$.=. .5 < j P s $ , $ 3 M M 0 > p v a v y S E U x 7 M 7 h K G I I I I I I I I f u v a X.*.$.$.",
+"$.$.=.| 9 0 J T U s $ . 2 V 0 N 0 > p v v i k x I x 3 0 h Y U U I I I I I I I I I f y y X.%.$.$.",
+"$.$.=. .9 7 J R I I A K h 7 0 0 M 0 > p n y . $ L P 7 0 g I R L I R I I I I I I I I F C  .=.$.%.",
+"$.$.=. .9 7 j A L I U U U h 7 B M M 0 > i q $ = l l 6 V 0 g L Y L P I I I I I L L I R P +.=.$.$.",
+"$.$.*.X.9 3 $ # A T I I T G 7 N 0 M V 7 z z $ $ < 3 0 0 0 7 J T R Y I I R I Y I R I Y P +.%.$.$.",
+"$.$.%.X.8 6 - & C P S P P Z 5 9 9 7 9 5 A D $ & 5 0 9 9 9 5 C P P P P S P P P J P P K D  .%.$.$.",
+"$.$.$.$.X.X.X.X.+.X.+.....+.....X.X.o.X.X.+.o.o.X.X.X.X.X.X.X.+.| +. .+.+.| +. .+.X.+.X.$.$.$.$.",
+"&.$.$.$.%.%.*.=.%.=.%.%.%.=.=.=.&.%.%.=.%.%.%.%.=.=.=.=.=.=.%.*.%.*.=.%.=.%.=.=.%.=.%.%.$.%.%.$.",
+"%.$.$.%.$.$.$.$.$.$.$.$.$.$.%.$.$.$.$.$.%.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.%.$.$.",
+"$.$.$.$.$.$.$.$.$.%.$.$.$.$.$.$.$.$.$.%.$.$.$.$.$.$.%.$.$.$.$.$.$.$.$.$.$.$.$.$.$.&.$.$.$.$.$.$."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/map-web.png b/icons/map-web.png
new file mode 100644 (file)
index 0000000..4aef7e8
Binary files /dev/null and b/icons/map-web.png differ
diff --git a/icons/map.ico b/icons/map.ico
new file mode 100644 (file)
index 0000000..9063d3e
Binary files /dev/null and b/icons/map.ico differ
diff --git a/icons/map.rc b/icons/map.rc
new file mode 100644 (file)
index 0000000..3efb391
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "map.ico"
diff --git a/icons/mines-16d24.png b/icons/mines-16d24.png
new file mode 100644 (file)
index 0000000..00c8cbb
Binary files /dev/null and b/icons/mines-16d24.png differ
diff --git a/icons/mines-16d4.png b/icons/mines-16d4.png
new file mode 100644 (file)
index 0000000..fe0aa64
Binary files /dev/null and b/icons/mines-16d4.png differ
diff --git a/icons/mines-16d8.png b/icons/mines-16d8.png
new file mode 100644 (file)
index 0000000..1d68e72
Binary files /dev/null and b/icons/mines-16d8.png differ
diff --git a/icons/mines-32d24.png b/icons/mines-32d24.png
new file mode 100644 (file)
index 0000000..c1106ad
Binary files /dev/null and b/icons/mines-32d24.png differ
diff --git a/icons/mines-32d4.png b/icons/mines-32d4.png
new file mode 100644 (file)
index 0000000..9a7fd49
Binary files /dev/null and b/icons/mines-32d4.png differ
diff --git a/icons/mines-32d8.png b/icons/mines-32d8.png
new file mode 100644 (file)
index 0000000..4041d6a
Binary files /dev/null and b/icons/mines-32d8.png differ
diff --git a/icons/mines-48d24.png b/icons/mines-48d24.png
new file mode 100644 (file)
index 0000000..ff33772
Binary files /dev/null and b/icons/mines-48d24.png differ
diff --git a/icons/mines-48d4.png b/icons/mines-48d4.png
new file mode 100644 (file)
index 0000000..10bcf2e
Binary files /dev/null and b/icons/mines-48d4.png differ
diff --git a/icons/mines-48d8.png b/icons/mines-48d8.png
new file mode 100644 (file)
index 0000000..df628f5
Binary files /dev/null and b/icons/mines-48d8.png differ
diff --git a/icons/mines-base.png b/icons/mines-base.png
new file mode 100644 (file)
index 0000000..16a6f6c
Binary files /dev/null and b/icons/mines-base.png differ
diff --git a/icons/mines-ibase.png b/icons/mines-ibase.png
new file mode 100644 (file)
index 0000000..c741c1d
Binary files /dev/null and b/icons/mines-ibase.png differ
diff --git a/icons/mines-ibase4.png b/icons/mines-ibase4.png
new file mode 100644 (file)
index 0000000..11b3f01
Binary files /dev/null and b/icons/mines-ibase4.png differ
diff --git a/icons/mines-icon.c b/icons/mines-icon.c
new file mode 100644 (file)
index 0000000..b731186
--- /dev/null
@@ -0,0 +1,732 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c #E7E6E6",
+".  c #EBEFEF",
+"X  c #E8FCFC",
+"o  c #EBEEEE",
+"O  c #DFDEDE",
+"+  c #DFDDDF",
+"@  c #E6E0E6",
+"#  c #DADBDA",
+"$  c #DDDCDD",
+"%  c #E5E0E5",
+"&  c #DFDDDF",
+"*  c #DADADA",
+"=  c #E4E4DB",
+"-  c #DDDDDA",
+";  c gray89",
+":  c #E8E8E7",
+">  c #EBEEEE",
+",  c #EFE2E2",
+"<  c #F79E9E",
+"1  c #E3D3D3",
+"2  c #C3C5C7",
+"3  c #93BA92",
+"4  c #8CB78C",
+"5  c #D7D0D7",
+"6  c #B2C5B2",
+"7  c #76AE76",
+"8  c #C4CBC3",
+"9  c #D1CFD0",
+"0  c #7D7DE5",
+"q  c #BCBCD5",
+"w  c #EEEEE8",
+"e  c #EAEAEB",
+"r  c #E9EFEF",
+"t  c #F4DADA",
+"y  c #E65656",
+"u  c #CFBAB9",
+"i  c #CBCCD1",
+"p  c #8EBC8D",
+"a  c #73B072",
+"s  c #E1D8E1",
+"d  c #BECEBE",
+"f  c #56A557",
+"g  c #C4CEC7",
+"h  c #E3E1D5",
+"j  c #7474EE",
+"k  c #A7A7E1",
+"l  c #F6F6EA",
+"z  c #E8E8EB",
+"x  c #EDECEC",
+"c  c #D9E0E0",
+"v  c #648282",
+"b  c #868A8A",
+"n  c #CBC7C9",
+"m  c #79B57A",
+"M  c #9BC39E",
+"N  c #E1D8E1",
+"B  c #9EBE9F",
+"V  c #7AB776",
+"C  c #D0D2CF",
+"Z  c #D4D3D1",
+"A  c #7E81ED",
+"S  c #9FA1E3",
+"D  c #F5F5EB",
+"F  c #E8E9EB",
+"G  c #DFE2E2",
+"H  c #C0B3B3",
+"J  c #C88D8D",
+"K  c #BEB5B6",
+"L  c #DFE2E2",
+"P  c #F8ECF3",
+"I  c #F3E6E9",
+"U  c #CACDCC",
+"Y  c #D6D2D3",
+"T  c #B9B2CD",
+"R  c #CDCDCE",
+"E  c #E9EAEB",
+"W  c #F6EEE3",
+"Q  c #EDE6DF",
+"!  c #E7E8E9",
+"~  c #EBEAEA",
+"^  c #DBDCDC",
+"/  c #D8D5D5",
+"(  c #F85151",
+")  c #E8A7A7",
+"_  c #EAFEFE",
+"`  c #F76866",
+"'  c #F58585",
+"]  c #C5D7D2",
+"[  c #A8A5C0",
+"{  c #373894",
+"}  c #D0D2DA",
+"|  c #F2EBE9",
+" . c #FC5255",
+".. c #EBA2A4",
+"X. c #D8E6E6",
+"o. c #EDEAEA",
+"O. c #DBDFDF",
+"+. c #D8C7C7",
+"@. c #F25D5E",
+"#. c #E1A8A7",
+"$. c #F0FDFD",
+"%. c #B7A8A9",
+"&. c #827273",
+"*. c #C6C8C4",
+"=. c #9D9BBB",
+"-. c #444097",
+";. c #BEBECF",
+":. c #F7F8F4",
+">. c #9D8A8A",
+",. c #897F7F",
+"<. c #E1E3E3",
+"1. c gray92",
+"2. c #DBDDDD",
+"3. c #CAC3C1",
+"4. c #CFBEBC",
+"5. c #D6D5D8",
+"6. c #CDCDCD",
+"7. c #9FA29F",
+"8. c #8E9291",
+"9. c #B8B6B6",
+"0. c #EEF6F2",
+"q. c #E0F3F3",
+"w. c #E6E5E6",
+"e. c #DDDEDE",
+"r. c #A4BCBC",
+"t. c #A4ADAD",
+"y. c #DEDDDD",
+"u. c #ECEDED",
+"i. c #DEDCDE",
+"p. c #C6CFC8",
+"a. c #6BB070",
+"s. c #AAC2AB",
+"d. c #DFDAD9",
+"f. c #999AC1",
+"g. c #8684B8",
+"h. c #F2F9F1",
+"j. c #EDBFC1",
+"k. c #FC7F7F",
+"l. c #DBDADA",
+"z. c #E4E0E0",
+"x. c #FF8A8A",
+"c. c #F0C0C0",
+"v. c #DCE6E6",
+"b. c #ECEAEA",
+"n. c #DFDDDF",
+"m. c #C9CFC8",
+"M. c #55A354",
+"N. c #B5CAB4",
+"B. c #D6D1D7",
+"V. c #4C4D9E",
+"C. c #55549C",
+"Z. c #EDF2ED",
+"A. c #EFCBCC",
+"S. c #C06161",
+"D. c #C8C8C8",
+"F. c #EAE7E7",
+"G. c #D67979",
+"H. c #BA9696",
+"J. c #DEE5E5",
+"K. c #EBEAEA",
+"L. c #E2DEE2",
+"P. c #BFCDBF",
+"I. c #89BB89",
+"U. c #CDD5CD",
+"Y. c #D7D6D6",
+"T. c #C5C5D3",
+"R. c #ADADC8",
+"E. c #EEECEA",
+"W. c #C2CACA",
+"Q. c #647676",
+"!. c #A6A5A5",
+"~. c #E0E1E1",
+"^. c #819393",
+"/. c #787F7F",
+"(. c #DEDDDD",
+"). c #ECECEC",
+"_. c #E8E9E8",
+"`. c #F2F0F2",
+"'. c #FCF3FC",
+"]. c #E6E5E6",
+"[. c gray89",
+"{. c #F4F4F1",
+"}. c #F4F4EF",
+"|. c gray87",
+" X c #E4E3E3",
+".X c #EEEBEB",
+"XX c gainsboro",
+"oX c #E0DFDF",
+"OX c #EBE8E8",
+"+X c #E6E4E4",
+"@X c #DFE0E0",
+"#X c #ECECEC",
+"$X c gray92",
+"%X c gray92",
+"&X c #E6E8E6",
+"*X c #D9DAD9",
+"=X c gray86",
+"-X c #EAEAEA",
+";X c #E3E3E4",
+":X c #D2D2D2",
+">X c gray92",
+",X c #EAEAEA",
+"<X c gray84",
+"1X c gray89",
+"2X c #ECECEC",
+"3X c gray88",
+"4X c gray85",
+"5X c #ECECEC",
+"6X c gray92",
+"7X c #E6E6E6",
+"8X c gray88",
+"9X c LightGray",
+"0X c #D7D7D7",
+"qX c gray89",
+"wX c #DDDDDD",
+"eX c #CECECE",
+"rX c #E2E2E2",
+"tX c #E1E1E1",
+"yX c gray81",
+"uX c gainsboro",
+"iX c #E2E2E2",
+"pX c #D7D7D7",
+"aX c gray84",
+"sX c gray93",
+"dX c #EAEAEA",
+"fX c gray88",
+"gX c #D8D8D8",
+"hX c gray85",
+"jX c #E1E1E1",
+"kX c #DADADA",
+"lX c #D8D8D8",
+"zX c gray87",
+"xX c #DDDDDD",
+"cX c #D8D8D8",
+"vX c #DADADA",
+"bX c gray88",
+"nX c gray85",
+"mX c #D7D7D7",
+"MX c #E7E7E7",
+"NX c gray92",
+"BX c #E6E6E6",
+"VX c gray92",
+"CX c gray93",
+"ZX c gray93",
+"AX c #ECECEC",
+"SX c #ECECEC",
+"DX c gray93",
+"FX c #ECECEC",
+"GX c #ECECEC",
+"HX c gray93",
+"JX c gray93",
+"KX c #ECECEC",
+"LX c #ECECEC",
+"PX c gray93",
+"IX c #E6E6E6",
+"UX c white",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+"> , < 1 2 3 4 5 6 7 8 9 0 q w e ",
+"r t y u i p a s d f g h j k l z ",
+"x c v b n m M N B V C Z A S D F ",
+"G H J K L P I U Y T R E W Q ! ~ ",
+"^ / ( ) _ ` ' ] [ { } |  ...X.o.",
+"O.+.@.#.$.%.&.*.=.-.;.:.>.,.<.1.",
+"2.3.4.5.6.7.8.9.0.q.w.e.r.t.y.u.",
+"i.p.a.s.d.f.g.h.j.k.l.z.x.c.v.b.",
+"n.m.M.N.B.V.C.Z.A.S.D.F.G.H.J.K.",
+"L.P.I.U.Y.T.R.E.W.Q.!.~.^./.(.).",
+"_.`.'.].[.{.}.|. X.XXXoXOX+X@X#X",
+"$X%X&X*X=X-X;X:X>X,X<X1X2X3X4X5X",
+"6X7X8X9X0XqXwXeXrXtXyXuXiXpXaXsX",
+"dXfXgXhXjXkXlXzXxXcXvXbXnXmXMXNX",
+"BXVXCXZXAXSXDXFXGXHXJXKXLXPXNXIX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 169 2 ",
+"   c #131515",
+".  c #1A1D1D",
+"X  c #2F3434",
+"o  c #2F2F2F",
+"O  c #067F06",
+"+  c #00007D",
+"@  c #4D4D4D",
+"#  c #5E5353",
+"$  c #605C5C",
+"%  c #7C5555",
+"&  c #6F6E6F",
+"*  c #726767",
+"=  c #7B7B7B",
+"-  c #777373",
+";  c #FE0000",
+":  c #FB1515",
+">  c #FA1D1D",
+",  c #F62222",
+"<  c #EC3F3F",
+"1  c #F53333",
+"2  c #F63B3B",
+"3  c #A75C5C",
+"4  c #8D6D6D",
+"5  c #F44B4B",
+"6  c #F25757",
+"7  c #EA6666",
+"8  c #ED6D6D",
+"9  c #F26464",
+"0  c #E97A7A",
+"q  c #F07575",
+"w  c #128512",
+"e  c #1C8B1C",
+"r  c #168A16",
+"t  c #2C8F2C",
+"y  c #2C922C",
+"u  c #349334",
+"i  c #3E9A3E",
+"p  c #489D47",
+"a  c #469E46",
+"s  c #4EA14E",
+"d  c #57A357",
+"f  c #68AB68",
+"g  c #63AA63",
+"h  c #7AB37A",
+"j  c #151586",
+"k  c #24248D",
+"l  c #2E2E93",
+"z  c #343495",
+"x  c #383897",
+"c  c #46469D",
+"v  c #4A4AA0",
+"b  c #5A5AA6",
+"n  c #6161A7",
+"m  c #6D6DAD",
+"M  c #797BAF",
+"N  c #7B7BB3",
+"B  c #0606FF",
+"V  c #2525F9",
+"C  c #3F3FF5",
+"Z  c #6969EF",
+"A  c #858585",
+"S  c #8E8E8E",
+"D  c #939393",
+"F  c #9D9D9D",
+"G  c #A09F9F",
+"H  c #82AF82",
+"J  c #85B585",
+"K  c #99BF99",
+"L  c #9898BD",
+"P  c #8888B8",
+"I  c #A3A3A2",
+"U  c #A7A7A8",
+"Y  c #ACACAC",
+"T  c #A5ACAC",
+"R  c #B1ADAD",
+"E  c #A8BFA8",
+"W  c #B4B4B4",
+"Q  c #BAB6B6",
+"!  c #BABABA",
+"~  c #B5B9B9",
+"^  c #ED8282",
+"/  c #E59C9C",
+"(  c #EC9494",
+")  c #CBBBBB",
+"_  c #E6B9B9",
+"`  c #9FC29F",
+"'  c #A4C4A4",
+"]  c #A8C7A8",
+"[  c #B3C6B3",
+"{  c #B5CBB5",
+"}  c #BDCDBD",
+"|  c #BED0BE",
+" . c #C8C8BF",
+".. c #C4C4BF",
+"X. c #9E9EC2",
+"o. c #8D8DDB",
+"O. c #B9B9CC",
+"+. c #A1A1D7",
+"@. c #ACACDD",
+"#. c #A7A7E2",
+"$. c #AFAFE4",
+"%. c #B3B3E1",
+"&. c #B3C7C7",
+"*. c #C3C4C3",
+"=. c #C9C4C5",
+"-. c #C0C0CF",
+";. c #CAC6CA",
+":. c #C6C8C8",
+">. c #CBCBCB",
+",. c #C3CFC3",
+"<. c #DBC6C6",
+"1. c #D1CFCF",
+"2. c #DACAC9",
+"3. c #CDD1CD",
+"4. c #C5D2C5",
+"5. c #DFDFCF",
+"6. c #D1D1CE",
+"7. c #C4C4D1",
+"8. c #CBCBD5",
+"9. c #C7C7DD",
+"0. c #D2CDD3",
+"q. c #D3CED8",
+"w. c #CED4D4",
+"e. c #CEDBDB",
+"r. c #D3D3D3",
+"t. c #D6D9D6",
+"y. c #DCDCD4",
+"u. c #D5D5D9",
+"i. c #D9D5D9",
+"p. c #D4DBDB",
+"a. c #DCDBDB",
+"s. c #D9D4D3",
+"d. c #EDC7C7",
+"f. c #E4CBCB",
+"g. c #E8C5C5",
+"h. c #EDD6D6",
+"j. c #E0D9D7",
+"k. c #ECDBDB",
+"l. c #DFE0D8",
+"z. c #E5E5D7",
+"x. c #E2E2DC",
+"c. c #DEDEE1",
+"v. c #E2DDE2",
+"b. c #D5E3E3",
+"n. c #DCE3E3",
+"m. c #D7E8E8",
+"M. c #E5E5E5",
+"N. c #EBE3E3",
+"B. c #E7E9E7",
+"V. c #EAEAE4",
+"C. c #E7E7EB",
+"Z. c #EBE2EB",
+"A. c #E4EBEB",
+"S. c #EBEBEB",
+"D. c #F0EFEF",
+"F. c #F6F2E7",
+"G. c #F6F7EC",
+"H. c #F7FBEF",
+"J. c #EFEEF0",
+"K. c #F4EEF2",
+"L. c #F1E5F1",
+"P. c #E3F7F7",
+"I. c #EDF3F3",
+"U. c #EBFCFC",
+"Y. c #E7FCFC",
+"T. c #F4F4F4",
+"R. c #F3FBFB",
+"E. c #FBFBFB",
+"W. c #F8F6FD",
+/* pixels */
+"M.M.M.M.M.M.M.v.C.S.B.C.B.B.C.B.B.B.B.B.B.B.S.B.S.C.B.S.S.Z.M.M.",
+"M.B.I.S.S.D.S.G.l.>.i.v.i.r.r.r.r.i.v.i.r.r.r.0.5.y.r.r.t.S.M.M.",
+"M.T.T.I.U.I.T.B.Y r.[ H E r.1.! r.E H [ r.>.! r.+.o.7.r.u.E.B.V.",
+"M.S.T.g.^ 1 d.p.F v.h d r ' Z.*.a.g s e 4.a.:.M.Z B $.z.c.E.V.M.",
+"M.G.T.^ : ; d.p.I a.v.M.e ` v.*.u.Z.3.w &.j.*.a.l.V #.z.a.E.M.M.",
+"M.S.I.A.E.3 <.M.I a.r.i h Z.i.*.j.} y ' Z.t.:.a.z.V $.z.c.E.B.M.",
+"M.S.T.a.~ X = u.I M.s O a ` v.*.c.y w p { a.*.x.Z B C 9.M.E.B.M.",
+"M.J.I.U # $ $ G I t...[ ` ,.a.&.a.| { ' t.i.*.y.@.@.@.q.a.E.B.M.",
+"M.a.Y T &.&.~ I ! T.D.K.W.D.S.) *.;.s.j.:.*.a.I.F.G.H.D.S.E.M.Z.",
+"S.8.w.g.7 0 1.p.S.T.U.U.k.T.t.R i.z.L M t.i.T.I.Y.S.k.I.:.T.B.M.",
+"B.r.w._ ^ > 8 m.N.S.( 2 , N.*.U B.7.j k a.a.T.f.q > 9 P.W T.B.M.",
+"B.1.1.b.0 : / b.D.S.^ > : N.:.U M.n N x a.i.R.d.6 ; 9 P.Q W.B.M.",
+"S.r.w.f.<.2 6 m.S.D.U.E.% S.>.Y 7.k z + L M.J.A.E.) 4 E.W T.B.V.",
+"S.1.e.^ 2 1 ( b.S.T.*.=   A *.Y a.7.P l 8.l.T.B.Y @ o Q ) T.C.M.",
+"S.r.1.a.<.r.n.u.S.u.D & = = F Y a.a.a.r.a.a.D.! = - - A Y E.C.M.",
+"S.0.! >.0.0.=.*.) Y W .. .! Y u.T.S.T.R.T.B.C.y.Z.A.A.M.u.R.V.M.",
+"B.8.i.] p d 4.v.*.i.V.L c u.a.T.T.Y.k._ I...M.R.Y.h.d.T.*.T.Z.M.",
+"S.r.r.] ] u d Z...i.r.z j -.a.I.h.9 ; 2 Y.Q B.g.5 ; 9 P.W T.B.M.",
+"S.r.>.L.a.u ' M.&.z.b N z O.x.T.N.( 2 < I.Q A.h.^ , 9 Y.Q T.B.Z.",
+"B.1.r.{ w f w.a.;.r.c z + m x.S.B.R.n.# E.! M.J.E.&.* E.~ T.V.M.",
+"S.1.i.J y i h Z...u.i.-.c -.x.T.T.I @   A ! C.B.D X . G ! T.B.M.",
+"S.r.1.M.Z.j.c.a.;.r.l.l.M.a.a.S.*.D S F D U a.Q D D D D W E.B.M.",
+"M.S.T.T.T.T.T.J.M.T.T.T.T.T.S.M.M.S.K.S.G.c.B.C.G.K.D.K.a.E.B.M.",
+"M.S.I.V.B.M.S.w.>.T.M.M.M.S.;.t.T.M.B.C.J.! M.J.B.M.M.B.! T.B.M.",
+"M.S.T.M.M.M.B.r.>.T.M.M.M.S.=.i.S.M.M.M.S.! M.M.M.M.M.B.! T.S.Z.",
+"M.T.S.M.M.M.S.>.:.T.x.M.M.S.*.t.T.M.M.M.J.! M.S.M.M.M.M.! T.C.M.",
+"M.S.T.M.M.M.S.r.:.T.M.V.M.S.:.t.S.M.M.M.S.! M.S.M.M.M.M.Q E.B.M.",
+"M.S.T.M.B.M.B.r.:.T.M.Z.M.S.:.u.T.M.B.M.J.! M.S.M.M.B.S.~ T.B.M.",
+"M.T.r.Q ! Q ! Y 1.>.W ! ! ! Y i.*.W ! ~ ! R a.! Q ! ! ! W E.M.M.",
+"M.S.T.T.T.W.T.R.E.W.T.T.T.T.E.E.T.T.T.T.T.E.E.T.T.T.T.T.E.E.Z.M.",
+"M.M.B.B.B.B.S.B.M.S.B.B.B.S.M.M.S.B.B.S.S.B.M.S.B.B.B.B.B.M.V.M.",
+"M.M.M.M.M.M.M.Z.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.A."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 184 2 ",
+"   c #030101",
+".  c #0C0C0C",
+"X  c #131212",
+"o  c #191A1A",
+"O  c #2A2929",
+"+  c #262626",
+"@  c #323232",
+"#  c #393E3E",
+"$  c #4E2B2B",
+"%  c #007500",
+"&  c #027D02",
+"*  c #0A7E0A",
+"=  c #00007C",
+"-  c #4A4949",
+";  c #5B5B5B",
+":  c #545555",
+">  c #656464",
+",  c #6A6A6A",
+"<  c #7B7B7B",
+"1  c #D20F0F",
+"2  c #D01E1E",
+"3  c #FF0101",
+"4  c #FD0B0B",
+"5  c #FD1212",
+"6  c #FB1D1D",
+"7  c #FB2323",
+"8  c #F83434",
+"9  c #A95252",
+"0  c #B85858",
+"q  c #F84545",
+"w  c #F44B4B",
+"e  c #F64848",
+"r  c #EF5757",
+"t  c #F65858",
+"y  c #EA6666",
+"u  c #F46363",
+"i  c #ED7B7B",
+"p  c #F27676",
+"a  c #9C2323",
+"s  c #0C830C",
+"d  c #028102",
+"f  c #168916",
+"g  c #1B8A1B",
+"h  c #118711",
+"j  c #318F31",
+"k  c #359635",
+"l  c #3B973B",
+"z  c #3D993D",
+"x  c #289128",
+"c  c #439C43",
+"v  c #489E48",
+"b  c #4DA14D",
+"n  c #53A253",
+"m  c #5AA55A",
+"M  c #65A965",
+"N  c #6BAC6B",
+"B  c #77B277",
+"V  c #020281",
+"C  c #0A0A83",
+"Z  c #111184",
+"A  c #131388",
+"S  c #1E1E8B",
+"D  c #22228D",
+"F  c #2C2C8E",
+"G  c #2C2C92",
+"H  c #3B3B99",
+"J  c #363695",
+"K  c #42429B",
+"L  c #48489D",
+"P  c #5757A5",
+"I  c #7373AF",
+"U  c #7676B0",
+"Y  c #7D7DB3",
+"T  c #6565AA",
+"R  c #0F0FFC",
+"E  c #1212FC",
+"W  c #2D2DF7",
+"Q  c #3434F6",
+"!  c #3D3DF5",
+"~  c #4B4BF3",
+"^  c #4242F9",
+"/  c #6767EE",
+"(  c #6363F4",
+")  c #7777F0",
+"_  c #7D8686",
+"`  c #949494",
+"'  c #9C9C9C",
+"]  c #9A9696",
+"[  c #8B8B8B",
+"{  c #8CBA8C",
+"}  c #82B682",
+"|  c #91BD91",
+" . c #98BE98",
+".. c #8C8CBA",
+"X. c #9595BD",
+"o. c #9EA1A1",
+"O. c #A4A4A4",
+"+. c #ABABAB",
+"@. c #ABAAA7",
+"#. c #B5B5B5",
+"$. c #BBBBBB",
+"%. c #BEB2B2",
+"&. c #DD9F9F",
+"*. c #C79B9B",
+"=. c #E78C8C",
+"-. c #F08F8F",
+";. c #E69494",
+":. c #ED9494",
+">. c #EA9D9D",
+",. c #C2BFBF",
+"<. c #DFB2B2",
+"1. c #E4A4A4",
+"2. c #ECA6A6",
+"3. c #EBAAAA",
+"4. c #E1AEAE",
+"5. c #E9B4B4",
+"6. c #E9B9B9",
+"7. c #E0B6B6",
+"8. c #AAC6AA",
+"9. c #AECAAE",
+"0. c #B4CAB4",
+"q. c #BFC1BE",
+"w. c #BBCDBB",
+"e. c #D3D3BF",
+"r. c #9797C0",
+"t. c #A4A4C5",
+"y. c #A8A8C6",
+"u. c #B9B9C9",
+"i. c #B9B9DD",
+"p. c #C5BCC3",
+"a. c #C3C3C3",
+"s. c #C8C5C5",
+"d. c #CCC6CC",
+"f. c #CBCBCB",
+"g. c #C7CEC0",
+"h. c #DAC5C5",
+"j. c #C5D1C5",
+"k. c #CCD4CC",
+"l. c #C3C3D1",
+"z. c #CCCCD4",
+"x. c #C5C5DE",
+"c. c #C8C8DD",
+"v. c #D3C9D3",
+"b. c #CFDADA",
+"n. c #D5D5D5",
+"m. c #D6D9D6",
+"M. c #DADAD7",
+"N. c #D7D7D8",
+"B. c #DCDCDC",
+"V. c #D6D9D9",
+"C. c #E7C2C2",
+"Z. c #E9C6C6",
+"A. c #E7D5D5",
+"S. c #EBD5D5",
+"D. c #E3DBDB",
+"F. c #E9E9D4",
+"G. c #E3E3DD",
+"H. c #E4E4D7",
+"J. c #F4F4D6",
+"K. c #CECEE0",
+"L. c #DFDFE0",
+"P. c #E2DEE2",
+"I. c #E9DEE9",
+"U. c #D7E4E4",
+"Y. c #DBE3E3",
+"T. c #DAEAE9",
+"R. c #D6F4F4",
+"E. c #E5E5E5",
+"W. c #EAE6E5",
+"Q. c #EAEAE3",
+"!. c #EAE3EB",
+"~. c #E3ECEC",
+"^. c #EAEAEA",
+"/. c #F0ECEC",
+"(. c #F2E6F2",
+"). c #FFEAFF",
+"_. c #E3F3F3",
+"`. c #ECF5F5",
+"'. c #ECFAFA",
+"]. c #E6FAFA",
+"[. c #F4F4F4",
+"{. c #F4FDFD",
+"}. c #FDFDFD",
+"|. c #F8F7F7",
+/* pixels */
+"E.E.E.E.~.E.E.E.E.W.E.E.~.E.E.E.E.E.E.E.E.W.E.E.E.E.E.E.E.E.E.E.E.E.W.E.E.E.E.E.E.E.E.E.E.E.E.E.",
+"E.E.E.W.W.E.E.W.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.W.E.E.W.",
+"E.E.E.E.E.E.E.E.E.E.E.E.E.W.^.^.^.E.^.^.W.^.^.^.^.W.^.W.^.E.^.^.^.W.^.^.^.E.^.E.^.W.^.E.~.E.E.E.",
+"W.E.E.E.^.^.^.^.^.^.^.W./.E.N.V.m.n.n.N.N.N.V.V.V.N.m.n.m.m.m.V.N.N.N.N.N.N.N.N.V.N.Y.^.E.W.E.E.",
+"E.E.E.^.}.}.|.|.|.}.}.}.}.#.#.a.d.v.v.f.a.e.a.+.$.e.v.v.v.d.q.a.$.+.s.g.e.h.g.a.a.$.V.}.W.E.W.E.",
+"E.E.E.^.}.E.~._._.Z.D.^.f.` V.E.| b b { L.V.D.u.L.n.B c b 9.E.Y.z.e.E.c./ ^ ) G.E.B.W.}.^.E.~.E.",
+"E.E.E.W.}.E.S.2.t 4 6.`.s.` N.M.c m c % { P.N.#.L.9.k M g s j.P.f.u.G.i.~ E Q G.N.N.E.}.^.E.E.E.",
+"E.E.~.W.}.S.q 3 3 3 6.`.s.` N.V.V.(.k.% B I.V.$.V.N.V.).{ % w.P.k.q.L.B.J.Q Q F.V.N.E.}.W.E.E.E.",
+"~.E.E.^.}.E.A.>.w 3 6.`.s.` N.V.D.V.l g k.B.B.$.B.N.P.w.s n P.B.v.q.Y.N.M.W Q H.B.V.W.}.^.E.E.E.",
+"W.E.E.^.|.E.E._.{.$ %.[.a.` n.L.n.z x N.!.m.B.#.V.P.0.f m (.P.N.k.q.B.B.J.Q ! J.B.V.E.}.^.E.E.E.",
+"E.E.E.^.}.E./.^.n.o ' }.s.` n.L.l % v n | L.V.$.P.w.* * n n 0.P.f.p.G.c./ E E / c.V.E.}.^.E.E.~.",
+"E.E.E.^.{./.#.- o   . , s.` n.B.M b v k { P.B.$.L.w.b b c z 0.P.k.p.G.x.! ~ ~ ~ x.D.E.}.W.E.E.E.",
+"W.E.E.^.|.f.O.' O.O.O.' +.] k.B.P.!.I.I.P.V.N.$.B.E.(.!.(.(.E.P.n.$.V.V.F.F.F.F.M.N.E.}.^.E.E.E.",
+"E.~.E.E.$.` ' o.o.' ' o.] +.^.^.W.E.E.W.W.^./.#.$.a.$.$.$.q.$.a.,.V./.^.~.!.E.!.^.^.[.}.W.E.E.E.",
+"E.E.^.N.$.M.N.n.v.n.b.n.n.W.}.[.|.[.{.{.[.}.V.O.n.f.f.n.d.s.f.n.n.|.|.[.[.{.{.|.|.^.k.}.^.E.W.E.",
+"W.E.^.V.a.T.>.5 5 7 1.Y.M.^.[.E._.~.C.:.E.W.+.O.E.V.Q.r.V P E.V.P.|.E._._.D.:.C.`.a.#.}.^.E.E.E.",
+"E.E.W.N.a.Y.<.1.<.4 8 U.N.^.{.A.-.w 4 6 ~.^.+.O.L.B.l.D V K G.N.B.}.E.3.u 7 3 2.].s.#.}.W.E.E.~.",
+"E.E.^.m.a.B.T.;.w 4 =.U.n.^.{.6.8 3 3 7 E.^.+.@.P.G.L U K H E.N.B.}.E.u 4 3 3 3.'.s.#.}.W.E.E.E.",
+"E.E.^.V.a.B.U.=.e 5 p U.M.^.[.E._.Z.r 2 E.^.+.O.Q...S l.G G n.V.L.}.W._.D.>.1 4.'.s.#.}.~.E.E.W.",
+"E.E.E.n.p.E.h.B.R.8 6 M.N./.[.E.E.{.b.+ [.^.+.O.Q...= Z C = T Q.B.}.E.E.W.}.$ o.}.a.$.}.^.E.E.E.",
+"E.E.^.V.,.T.r 5 6 3 y U.N.^.|.E.E.$.> . ' E.+.O.P.z.u.p.D F z.M.B.}.E.E.f.] X ; B.f.#.}.W.E.E.E.",
+"E.E.W.m.a.Y.h.;.=.4.B.B.V.W.|.W.< @ O @ + [ #.O.L.B.Y.G.t.t.G.V.B.}.[.+.- + @ + : $.$.}.W.E.E.E.",
+"E.E.^.V.a.Y.B.T.T.U.V.B.N.^.N.@.+.#.#.#.#.+.] O.B.N.N.n.G.G.N.N.P.^.+.O.+.#.#.#.+.' #.}.^.E.E.W.",
+"E.E.^.V.+.$.$.p.p.p.#.$.$.#.+.O.O.O.@.@.O.O.O.M.|.[.[.[.[.[.|.|./.^.E.Y.D.B.B.L.E.B.E.}.~.E.E.E.",
+"E.E.^.V.a.P.n.8. .0.P.V.D.$.n.P.B.G.u.y.V.E.B.|.[.^./.[.'.[.^.^.#.|.|.[.[.{.'.[.|.B.s.}.^.E.W.W.",
+"E.E.W.N.q.E.N s f & } P.B.a.k.V.E.t.= Z l.M.N.[.^._.~.C.u =._.B.o.|.E._.E.3.w 5.`.a.#.}.~.E.E.E.",
+"W.E.^.N.u.E.0.j.B.g j D.B.a.z.G.n.J G A l.D.N.[.[.>.8 4 3 u '.D.@.{.E.p 6 3 3 2.'.s.$.}.E.E.E.E.",
+"E.E.^.V.e.B.B.!.j.& N I.B.q.f.Q.P I ..= m.L.N.|.`.5.t 6 3 u ].B.O.|.E.:.e 4 3 3.'.s.#.}.W.E.~.E.",
+"E.E.E.N.$.M.P.w.h n I.V.V.e.n.l.= U K = Y L.m.[.^.~._.W.0 9 '.B.O.|.W.].~.S.a *.'.s.#.}.W.E.E.E.",
+"E.E.^.N.u.E.8.s k 9.0.M.L.$.n.l.H G A = K M.N.[.[.E./.}._ : }.D.O.{.W.W.[.}.# O.}.s.#.}.W.E.E.E.",
+"E.E.^.N.e.^.M % g d k V.L.u.f.B.V.Q.Y C z.D.N.[.`.D.+.> X . < n.+.[.^.N.` -   O ' s.#.}.~.E.E.W.",
+"E.E.W.z.$.L.n.j.j.k.k.V.M.$.n.B.M.B.z.z.N.M.N.[.`.s., ; > > ; O.+.[.^.@.; ; , ; , #.$.}.^.E.E.E.",
+"E.E.^.B.f.E.B.E.P.P.P.M.E.s.n.Y.B.L.D.B.B.L.Y.[.#.O.$.$.$.#.q.@.+.E.O.+.#.$.#.$.$.o.s.}.E.E.E.E.",
+"E.E.E.E.}.|.|.|.}.|.}.}.[.E.}.|.}.}.}.}.}.}.^.^.|.|.[.[.[.[.[.{.E.[.|.{.[.[.|.[.[.[.E.}.W.E.E.E.",
+"E.E.E.^.}.E.E.E.E.W.E.^.a.a.}.E.E.E.E.^.E./.#.B.[.E.E.W.^.W.E.E.+.|.^.E.^.~.^.E./.f.$.}.W.E.E.~.",
+"E.E.E.^.}.E.E.E.E.E.E.`.$.a.|.E.~.E.E.E.E.^.@.L.[.E.E.E.E.E.E.D.O.|.E.E.E.E.E.E.^.d.#.}.^.E.E.W.",
+"E.E.E.^.}.E.E.E.E.E.E.`.a.a.}.E.^.E.E.E.E.^.@.E.[.E.E.E.E.E.W.Y.@.|.^.E.E.E.E.E.^.s.$.}.E.E.E.E.",
+"W.E.E.^.}.E.E.E.E.E.E.^.a.$.|.E.E.E.E.E.E.^.@.D.[.Y.E.E.E.E.E.P.O.|.^.E.E.E.E.E.^.s.#.}.^.E.E.E.",
+"~.E.E.^.}.E.E.E.E.E.E.^.u.a.}.E.E.E.E.E.E.^.+.Y.[.E.E.E.E.E.W.Y.O.|.E.E.E.E.E.E.`.f.#.}.W.E.E.E.",
+"E.W.E.^.{.E.E.E.E.E.P.E.e.q.}.B.E.E.E.E.E.^.O.E.[.L.E.E.E.E.E.E.O.}.E.E.E.E.E.E.W.s.#.}.^.E.~.E.",
+"E.E.E.^.}.^./.^.^./.W.[.a.q.}.^.^.^.^.^.^.[.+.B.{.^.^.^.^.W.^.E.O.{.^.^.^.W.^.^.[.f.#.}.W.E.E.E.",
+"E.E.E.^.{.f.s.s.f.f.f.f.+.q.[.a.f.s.f.f.f.f.' E.D.s.f.s.f.f.f.a.' [.n.s.f.f.f.f.f.#.#.}.W.E.E.E.",
+"E.E.E.^.E.#.#.$.#.#.#.$.#.V.n.#.$.#.#.#.#.#.$.E.a.#.$.#.#.#.$.#.s.E.$.#.#.#.#.#.#.#.n.}.W.E.~.W.",
+"E.E.E.W.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.^.E.E.E.",
+"E.~.E.W.^.W.^.W.^.E.^.^.W.W.^.~.^.W.~.W.W.~.W.^.E.W.~.W.^.E.^.E.W.W.^.E.W.^.W.~.~.W.^.^.E.E.~.E.",
+"E.W.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.W.",
+"W.E.E.E.E.E.E.E.E.E.E.E.E.W.E.E.W.E.E.~.E.E.E.E.E.E.E.E.E.E.E.E.W.~.E.E.E.E.E.W.E.E.E.E.~.E.E.E.",
+"E.E.~.W.E.E.~.E.E.E.E.E.W.E.E.E.E.E.E.E.E.W.E.W.~.E.W.E.E.^.E.E.E.E.E.E.~.W.E.E.E.E.W.E.E.E.W.E."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/mines-web.png b/icons/mines-web.png
new file mode 100644 (file)
index 0000000..cb6d00f
Binary files /dev/null and b/icons/mines-web.png differ
diff --git a/icons/mines.ico b/icons/mines.ico
new file mode 100644 (file)
index 0000000..eaca3e7
Binary files /dev/null and b/icons/mines.ico differ
diff --git a/icons/mines.rc b/icons/mines.rc
new file mode 100644 (file)
index 0000000..fd34f5f
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "mines.ico"
diff --git a/icons/net-16d24.png b/icons/net-16d24.png
new file mode 100644 (file)
index 0000000..97896df
Binary files /dev/null and b/icons/net-16d24.png differ
diff --git a/icons/net-16d4.png b/icons/net-16d4.png
new file mode 100644 (file)
index 0000000..c40fda8
Binary files /dev/null and b/icons/net-16d4.png differ
diff --git a/icons/net-16d8.png b/icons/net-16d8.png
new file mode 100644 (file)
index 0000000..b73fd7e
Binary files /dev/null and b/icons/net-16d8.png differ
diff --git a/icons/net-32d24.png b/icons/net-32d24.png
new file mode 100644 (file)
index 0000000..81201d1
Binary files /dev/null and b/icons/net-32d24.png differ
diff --git a/icons/net-32d4.png b/icons/net-32d4.png
new file mode 100644 (file)
index 0000000..6512c66
Binary files /dev/null and b/icons/net-32d4.png differ
diff --git a/icons/net-32d8.png b/icons/net-32d8.png
new file mode 100644 (file)
index 0000000..a31dec3
Binary files /dev/null and b/icons/net-32d8.png differ
diff --git a/icons/net-48d24.png b/icons/net-48d24.png
new file mode 100644 (file)
index 0000000..7b4aea6
Binary files /dev/null and b/icons/net-48d24.png differ
diff --git a/icons/net-48d4.png b/icons/net-48d4.png
new file mode 100644 (file)
index 0000000..ea4dd32
Binary files /dev/null and b/icons/net-48d4.png differ
diff --git a/icons/net-48d8.png b/icons/net-48d8.png
new file mode 100644 (file)
index 0000000..d21a767
Binary files /dev/null and b/icons/net-48d8.png differ
diff --git a/icons/net-base.png b/icons/net-base.png
new file mode 100644 (file)
index 0000000..e4d52f6
Binary files /dev/null and b/icons/net-base.png differ
diff --git a/icons/net-ibase.png b/icons/net-ibase.png
new file mode 100644 (file)
index 0000000..89c59bd
Binary files /dev/null and b/icons/net-ibase.png differ
diff --git a/icons/net-ibase4.png b/icons/net-ibase4.png
new file mode 100644 (file)
index 0000000..7bcc94f
Binary files /dev/null and b/icons/net-ibase4.png differ
diff --git a/icons/net-icon.c b/icons/net-icon.c
new file mode 100644 (file)
index 0000000..8186ac4
--- /dev/null
@@ -0,0 +1,590 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 242 2 ",
+"   c #E5E4E4",
+".  c #DDDBDB",
+"X  c #DDDEDE",
+"o  c #DDDDDD",
+"O  c #DDDDDD",
+"+  c #DDDDDD",
+"@  c #DDDDDD",
+"#  c gainsboro",
+"$  c gainsboro",
+"%  c #DDDDDD",
+"&  c #DDDDDD",
+"*  c #DDDDDD",
+"=  c #DDDDDD",
+"-  c #DDDDDD",
+";  c gray87",
+":  c gray90",
+">  c #D7CBCB",
+",  c #967A7A",
+"<  c #ADB2B2",
+"1  c #ABAAAA",
+"2  c #ADACAC",
+"3  c #B0AFAF",
+"4  c #DDDCDC",
+"5  c #DDDCDC",
+"6  c #DCDBDB",
+"7  c #E0DFDF",
+"8  c #B5B4B4",
+"9  c #ABAAAA",
+"0  c gray68",
+"q  c #ADACAC",
+"w  c #AEADAD",
+"e  c gray87",
+"r  c #D5C8C8",
+"t  c #927474",
+"y  c #B0B4B4",
+"u  c #AAA9A9",
+"i  c #9FA4A4",
+"p  c #A4A9A9",
+"a  c #D6DCDC",
+"s  c #DEE1E1",
+"d  c #DEE1E1",
+"f  c #D8DDDD",
+"g  c #B3B8B8",
+"h  c #565858",
+"j  c #0F0E0E",
+"k  c #464848",
+"l  c #A7ACAC",
+"z  c gray86",
+"x  c #D5C8C8",
+"c  c #927474",
+"v  c #B2B5B5",
+"b  c #5E8686",
+"n  c #618787",
+"m  c #688B8B",
+"M  c #8CACAC",
+"N  c #73A1A1",
+"B  c #6B9D9D",
+"V  c #8DADAD",
+"C  c #729999",
+"Z  c #2C3C3C",
+"A  c black",
+"S  c #1D2929",
+"D  c #739696",
+"F  c #D9DBDB",
+"G  c #D5C8C8",
+"H  c #937575",
+"J  c #AEB4B4",
+"K  c #668888",
+"L  c #B1ADAD",
+"P  c #B4B1B1",
+"I  c #F8F0F0",
+"U  c #B9CBCB",
+"Y  c #A6BEBE",
+"T  c #FDF5F5",
+"R  c #BDBABA",
+"E  c #807F7F",
+"W  c #5D5E5E",
+"Q  c #7A7979",
+"!  c #B2AFAF",
+"~  c #DDDDDD",
+"^  c #D5C9C9",
+"/  c #8E7070",
+"(  c #A6ABAB",
+")  c #5F8383",
+"_  c #A1A2A2",
+"`  c #A3A5A5",
+"'  c #E0DBDB",
+"]  c #B1BDBD",
+"[  c #9FB3B3",
+"{  c #E4DFDF",
+"}  c #B0B2B2",
+"|  c gray74",
+" . c gray65",
+".. c #B9B9B9",
+"X. c #B2B3B3",
+"o. c #DDDDDD",
+"O. c #D5C8C8",
+"+. c #927373",
+"@. c #ADB2B2",
+"#. c #638686",
+"$. c gray66",
+"%. c #AFAFAF",
+"&. c #DFDEDE",
+"*. c #7FB3B3",
+"=. c #72ABAB",
+"-. c #E0DEDE",
+";. c gray84",
+":. c #EFEFEF",
+">. c gray53",
+",. c gray85",
+"<. c gray88",
+"1. c #DDDDDD",
+"2. c #D5C8C8",
+"3. c #937474",
+"4. c #AEB3B3",
+"5. c #648787",
+"6. c #A8A9A9",
+"7. c #B8B4B4",
+"8. c #BECECE",
+"9. c #00EEEE",
+"0. c #00EEEE",
+"q. c #BECECE",
+"w. c #DDD9D9",
+"e. c #EDEEEE",
+"r. c #898989",
+"t. c gray85",
+"y. c #DDDDDD",
+"u. c gainsboro",
+"i. c #D5C8C8",
+"p. c #937474",
+"a. c #AEB4B4",
+"s. c #648787",
+"d. c #A9AAAA",
+"f. c #B8B4B4",
+"g. c #C1CFCF",
+"h. c #11DBDB",
+"j. c #11DBDB",
+"k. c #C1CFCF",
+"l. c #DDD9D9",
+"z. c #EEEFEF",
+"x. c #898989",
+"c. c #DADADA",
+"v. c gray87",
+"b. c gainsboro",
+"n. c #D5C8C8",
+"m. c #917373",
+"M. c #ABB0B0",
+"N. c #628585",
+"B. c #A7A7A7",
+"V. c gray68",
+"C. c #DFDFDF",
+"Z. c #D5D3D3",
+"A. c #D5D3D3",
+"S. c #DFDFDF",
+"D. c LightGray",
+"F. c #ECEDED",
+"G. c #868989",
+"H. c #D6D8D8",
+"J. c #DDDDDD",
+"K. c #DDDDDD",
+"L. c #D5C9C9",
+"P. c #8F7070",
+"I. c #A6ABAB",
+"U. c #608383",
+"Y. c #A5A5A5",
+"T. c gray63",
+"R. c gray68",
+"E. c #B4B4B4",
+"W. c gray70",
+"Q. c #AFAEAE",
+"!. c #A6A7A7",
+"~. c #B6AFAF",
+"^. c #A79292",
+"/. c #B2A8A8",
+"(. c #AEAFAF",
+"). c #DDDDDD",
+"_. c #D5C8C8",
+"`. c #947575",
+"'. c #AFB4B4",
+"]. c #638787",
+"[. c #ACACAC",
+"{. c #A5A5A5",
+"}. c #A7A7A7",
+"|. c #A9AAAA",
+" X c #A9A9A9",
+".X c #A7A9A9",
+"XX c #ABA1A1",
+"oX c #68A3A3",
+"OX c #28CACA",
+"+X c #58A8A8",
+"@X c #B0A6A6",
+"#X c #DCDEDE",
+"$X c #D5C9C9",
+"%X c #927373",
+"&X c #B2B3B3",
+"*X c #668888",
+"=X c #5F8585",
+"-X c #648787",
+";X c #618888",
+":X c #667A7A",
+">X c #2DA6A6",
+",X c cyan",
+"<X c #33C1C1",
+"1X c #B4A1A1",
+"2X c #DBE0E0",
+"3X c #D4C8C8",
+"4X c #947878",
+"5X c #B2BDBD",
+"6X c #B2B3B3",
+"7X c #AFB4B4",
+"8X c #AEB4B4",
+"9X c #ABB2B2",
+"0X c #ACAAAA",
+"qX c #7AAAAA",
+"wX c #42C0C0",
+"eX c #6CACAC",
+"rX c #B2B0B0",
+"tX c #DCDEDE",
+"yX c #DAD1D1",
+"uX c #8C5D5D",
+"iX c #937676",
+"pX c #947575",
+"aX c #927373",
+"sX c #8E7070",
+"dX c #9A7474",
+"fX c #A06D6D",
+"gX c #9A7070",
+"hX c #967B7B",
+"jX c #DEDBDB",
+"kX c #E6E7E7",
+"lX c #D4C7C7",
+"zX c #D4C8C8",
+"xX c #D5C8C8",
+"cX c #D5C8C8",
+"vX c #D5C8C8",
+"bX c #D5C9C9",
+"nX c #D3C8C8",
+"mX c #D1CACA",
+"MX c #D2C8C8",
+"NX c #D7CBCB",
+"BX c #E5E4E4",
+"VX c white",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+"> , < 1 2 3 4 5 6 7 8 9 0 q w e ",
+"r t y u i p a s d f g h j k l z ",
+"x c v b n m M N B V C Z A S D F ",
+"G H J K L P I U Y T R E W Q ! ~ ",
+"^ / ( ) _ ` ' ] [ { } |  ...X.o.",
+"O.+.@.#.$.%.&.*.=.-.;.:.>.,.<.1.",
+"2.3.4.5.6.7.8.9.0.q.w.e.r.t.y.u.",
+"i.p.a.s.d.f.g.h.j.k.l.z.x.c.v.b.",
+"n.m.M.N.B.V.C.Z.A.S.D.F.G.H.J.K.",
+"L.P.I.U.Y.T.R.E.W.Q.!.~.^./.(.).",
+"_.`.'.].[.{.}.|. X.XXXoXOX+X@X#X",
+"$X%X&X*X=XU.N.-X5.;X:X>X,X<X1X2X",
+"3X4X5X6X7XI.M.8X4.9X0XqXwXeXrXtX",
+"yXuXiX%XpXP.m.p.3.aXsXdXfXgXhXjX",
+"kXyXlX$XzXL.n.xXcXvXbXnXmXMXNXBX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 93 2 ",
+"   c #010202",
+".  c #111111",
+"X  c #1D1D1D",
+"o  c #292828",
+"O  c #323232",
+"+  c #702727",
+"@  c #732A2A",
+"#  c #7E2B2B",
+"$  c #783333",
+"%  c #1E4444",
+"&  c #296161",
+"*  c #247171",
+"=  c #2E7474",
+"-  c #327474",
+";  c #317A7A",
+":  c #414141",
+">  c #4C5656",
+",  c gray34",
+"<  c #496B6B",
+"1  c #407777",
+"2  c #4E7A7A",
+"3  c #686262",
+"4  c #737272",
+"5  c #747C7C",
+"6  c #268989",
+"7  c #02AEAE",
+"8  c #418383",
+"9  c #498585",
+"0  c #418C8C",
+"q  c #568282",
+"w  c #5B8585",
+"e  c #558E8E",
+"r  c #5E8888",
+"t  c #409797",
+"y  c #5D9292",
+"u  c #628585",
+"i  c #628C8C",
+"p  c #7F8E8E",
+"a  c #729B9B",
+"s  c #7D9E9E",
+"d  c #63A4A4",
+"f  c #00CACA",
+"g  c #11C9C9",
+"h  c #02D4D4",
+"j  c #00DEDE",
+"k  c #00E2E2",
+"l  c #00EAEA",
+"z  c #01F5F5",
+"x  c #03FFFF",
+"c  c #918E8E",
+"v  c #859696",
+"b  c #8D9595",
+"n  c #959595",
+"m  c #9C9393",
+"M  c #969A9A",
+"N  c #9C9C9C",
+"B  c #8EACAC",
+"V  c #92A3A3",
+"C  c #9DA1A1",
+"Z  c #93B1B1",
+"A  c #9BB6B6",
+"S  c #A3A3A3",
+"D  c #AAA1A1",
+"F  c #A6AAAA",
+"G  c #ABACAC",
+"H  c #B4ADAD",
+"J  c #B9AFAF",
+"K  c #A4B3B3",
+"L  c #ACB1B1",
+"P  c #B3B3B3",
+"I  c #BBB2B2",
+"U  c #BBBBBB",
+"Y  c #C3B7B7",
+"T  c #C5BDBD",
+"R  c #CCB8B8",
+"E  c #AFC1C1",
+"W  c #B2C3C3",
+"Q  c #BEC3C3",
+"!  c #B7C8C8",
+"~  c #C5C5C5",
+"^  c #C1CACA",
+"/  c #CCCCCC",
+"(  c #D6CACA",
+")  c #D6D1D1",
+"_  c #DBDBDB",
+"`  c #E4E4E4",
+"'  c #EAEBEB",
+"]  c #F3E7E7",
+"[  c #F3EAEA",
+"{  c #FAEFEF",
+"}  c #F3F2F2",
+"|  c #FAF3F3",
+" . c #FCF8F8",
+/* pixels */
+"` ` ' ' ` ' ' ' ' ' ' ' ' ' ' ' ' ` ' ' ' ' ' ' ` ' ' ' ' ` ` ' ",
+"' ` _ _ _ _ _ _ _ _ _ _ ) _ _ _ ) _ ) _ _ _ _ _ _ _ _ _ _ _ ` ` ",
+"' ) $ C S S S S S S S S ( / / / / / / / G N S S S C C C S N _ ' ",
+"' ) @ G G H G G G G F H ' ' ' ' ' ' ' } ~ S P P I U U H H S _ ' ",
+"' ) @ F H G G G F G F G ` ` ` ` ` ` ` ' U F M O O O o 4 P C _ ' ",
+"' ) @ F G G H H H H H H } ] ] ] ] [ ] | T H m         3 T D _ ' ",
+"' ) @ F G H v = = - = - 6 9 8 0 6 8 8 8 - ; &         % ; - _ ' ",
+"' ) @ F G Y w ; n v v v ! U ^ a 9 / W ! V v 5         > V p _ ' ",
+"' ) @ G G I q w R P H P [ '  .A y  .' | ~ H N X o X . 4 T F _ ' ",
+"' ) @ F G I q q I F F G ` ` | Z e { ` ' T S G P L G L H G S _ ' ",
+"' ) @ F F J q q J F F F ` _ ] B e ] _ ` U N F S F H S S S N _ ' ",
+"' ) @ M N D 2 2 D N m N / ^ ( s 9 ( ^ / L I U ~ N , ~ U ~ H _ ' ",
+"' ) @ K G I q q Y G G H ' '  .K y  .' ' / ` '  .P :  .` [ / _ ' ",
+"' ) @ F G I q q I F F G [ Q d t 6 d Q } ~ _ ` } P : } ` ' / _ ' ",
+"' ) @ F G I q q I G F G } K k x x j K | ^ _ ` } P : } ` ' / _ ` ",
+"' ) @ F G I q q Y F D G } K k x x k K | ^ ` ` } P : } ` ' / ) ' ",
+"' ) @ F G I q q I G F G } K k x x k K | ^ _ ` } P : } ` ' / ) ' ",
+"' ) @ F G I q q I G D G } L 7 g g 7 L } / _ ` } P : } ` ' / _ ' ",
+"' ) @ F G I q q I G F G ' ` ( ( ( ( ` ' ~ _ ` } P : } ` ' / ) ' ",
+"' ) @ F F I q q I G F G ' ' ' } ' ' ' ' / ` ' } P : | ' ' / _ ' ",
+"' ) + N N D 2 2 D N N n H G G G G G G H N F H G N 4 L F L S _ ' ",
+"' ) @ F G I q q I G G N F F F D G F F G N F G J H Y J H F S _ ' ",
+"' ) @ F G I q q J F F N G G F G G G F G N F N u i i w b P S _ ` ",
+"' ) @ F F I q u R I I D I I I I I I I Y D Y m f x z l i J S _ ' ",
+"' ) @ F L I q * w q q 2 q q q q q q q q 2 q < h x x z i I S _ ' ",
+"' ) @ F G P C q q q q 2 q q q q q q q q 2 q < h x x z i J S _ ` ",
+"} ) + F H F P I I I I D I I I I I I I I D I m 7 j h f u I S _ ' ",
+"' ) @ F G H G F G G G M F G G G G G G G C G F b c c c N H S _ ' ",
+"' ) @ C G F F F F F F M F F F F G F F G M C F L L L P G F C _ ' ",
+"' _ # + @ @ @ @ @ @ @ @ @ @ + $ + @ @ @ @ @ @ @ @ + @ @ + $ _ ' ",
+"' ` _ ) ) ) ) ) _ ) ) ) ) ) ) ) ) ) ) ) _ ) ) ) ) ) ) ) ) ) ` ` ",
+"` ' ' ' ' } ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ` ` "
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 132 2 ",
+"   c #010101",
+".  c #090909",
+"X  c #2A2A2A",
+"o  c #313131",
+"O  c #660404",
+"+  c #680000",
+"@  c #670808",
+"#  c #6B0A0A",
+"$  c #721212",
+"%  c #7F2121",
+"&  c #004343",
+"*  c #074C4C",
+"=  c #005252",
+"-  c #006464",
+";  c #006969",
+":  c #0A6B6B",
+">  c #1E6F6F",
+",  c #007373",
+"<  c #0B7070",
+"1  c #007A7A",
+"2  c #1E7171",
+"3  c #1E7878",
+"4  c #226D6D",
+"5  c #217272",
+"6  c #337878",
+"7  c #3F7D7D",
+"8  c gray30",
+"9  c #475E5E",
+"0  c #515151",
+"q  c #5C5E5E",
+"w  c #745C5C",
+"e  c #467373",
+"r  c #497676",
+"t  c #447D7D",
+"y  c #4E7C7C",
+"u  c #517777",
+"i  c #5F7777",
+"p  c #507E7E",
+"a  c #656464",
+"s  c #696969",
+"d  c #7B6D6D",
+"f  c #6F7878",
+"g  c #717272",
+"h  c #7A7777",
+"j  c #777A7A",
+"k  c #7B7F7F",
+"l  c #822F2F",
+"z  c #846C6C",
+"x  c #877E7E",
+"c  c #887E7E",
+"v  c #0B8B8B",
+"b  c #258585",
+"n  c #298484",
+"m  c #268B8B",
+"M  c #298888",
+"N  c #249F9F",
+"B  c #05AEAE",
+"V  c #1FA1A1",
+"C  c #468686",
+"Z  c #4A8B8B",
+"A  c #4D9191",
+"S  c #6E8686",
+"D  c #7E8181",
+"F  c #758D8D",
+"G  c #769292",
+"H  c #789393",
+"J  c #00C2C2",
+"K  c #00DBDB",
+"L  c #00E4E4",
+"P  c #00E9E9",
+"I  c #02FDFD",
+"U  c #08FFFF",
+"Y  c #878B8B",
+"T  c #8B8C8C",
+"R  c #938D8D",
+"E  c #869494",
+"W  c #8E9292",
+"Q  c #8E9A9A",
+"!  c #959494",
+"~  c #999696",
+"^  c #949B9B",
+"/  c #9C9C9C",
+"(  c #A49595",
+")  c #A29D9D",
+"_  c #AC9B9B",
+"`  c #B09B9B",
+"'  c #BD9F9F",
+"]  c #97A3A3",
+"[  c #9CA1A1",
+"{  c #9FAAAA",
+"}  c #A5A5A5",
+"|  c #AEA1A1",
+" . c #A1ADAD",
+".. c #ABACAC",
+"X. c #B2A2A2",
+"o. c #BEA5A5",
+"O. c #B1ADAD",
+"+. c #B9A9A9",
+"@. c #A4B0B0",
+"#. c #ADB1B1",
+"$. c #A7B9B9",
+"%. c #B3B3B3",
+"&. c #BBB2B2",
+"*. c #B3BABA",
+"=. c #BABABA",
+"-. c #C1B7B7",
+";. c #C6BDBD",
+":. c #CDBBBB",
+">. c #BEC1C1",
+",. c #C4C4C4",
+"<. c #C7CACA",
+"1. c #CBCBCB",
+"2. c #D3CECE",
+"3. c #DBCDCD",
+"4. c #D5D5D5",
+"5. c gainsboro",
+"6. c #E0CECE",
+"7. c #E1D6D6",
+"8. c #F9D6D6",
+"9. c #DBE7E7",
+"0. c #DBE8E8",
+"q. c #E5E5E5",
+"w. c #EAE7E7",
+"e. c #E6E9E9",
+"r. c #EBEBEB",
+"t. c #F5E7E7",
+"y. c #F1EEEE",
+"u. c #FAECEC",
+"i. c #ECF1F1",
+"p. c #F2F5F5",
+"a. c #FFF4F4",
+"s. c #FCFBFB",
+/* pixels */
+"q.q.q.q.q.q.q.q.q.e.q.q.q.w.e.q.w.q.q.q.q.w.q.q.q.q.q.q.w.q.q.q.q.w.q.q.q.e.w.q.q.q.e.q.e.w.q.q.",
+"q.q.q.w.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.q.e.q.q.q.q.q.q.q.q.q.q.q.q.q.q.",
+"e.w.q.e.p.r.r.r.r.y.r.r.r.r.r.r.r.r.r.r.y.r.r.r.r.r.p.r.r.r.r.r.r.r.r.y.r.r.r.r.r.r.r.r.e.q.w.q.",
+"q.q.e.4.o.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.=.=.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.<.q.q.q.q.",
+"q.q.p.` + ^ } / / ) [ / / / / / / / 4.1.4.2.4.<.,.4.4.2.4.4.~ ~ / / ~ / / / / ~ / ) / ~ 9.w.q.e.",
+"e.q.p.` @  .%.....O.O.#.%...%.%.....i.w.r.e.r.e.y.e.e.e.e.p.....%.%.%.%.%.%.%.%.%...O.} 7.q.q.q.",
+"q.q.i.` @  .....................} ..w.q.q.q.q.q.q.q.q.q.q.r...} ..} [ / [ ) / } ....../ q.q.q.w.",
+"q.9.p.` +  .O...................} ..e.q.q.q.q.q.q.q.q.q.q.e.} } =.g   . . . .   Y %...~ 9.w.q.q.",
+"q.q.i.` @ { ..........%.%.%.%.%...%.p.r.y.y.y.p.r.p.p.y.r.p.%...>.g             T =.O.} q.w.q.q.",
+"q.q.p.` +  .O.....%.} T W W W W Y ! ,.>.>.>.>.=.;.>.=.,.>.,.T Y / q             g ^ T Y 9.e.q.w.",
+"q.q.p._ @ { O.....+.t , - - ; ; ; ; - ; ; ; - 1 1 - - ; ; - ; - ; &             = : - 3 q.q.q.e.",
+"q.q.p.` @  .O.....+.4 e _ ~ ~ ~ ! ! 2.1.1.<.6.7 7 6.<.1.<.4.~ R } a   .     .   h [ ~ ! 7.q.q.q.",
+"q.q.p.` @  .O.....O.2 p -.#.%.%...%.p.r.e.r.a.Z Z a.e.r.r.p.O...;.g             T =.%.} q.e.q.q.",
+"q.q.p.` @  .O.....+.2 y +.......} } w.q.q.q.u.C C u.q.q.q.e.} } %.Y 8 8 8 8 8 8 ~ #.../ 7.q.w.q.",
+"q.q.i.` + { ......+.2 y &.......} } e.q.q.q.u.C C u.q.q.q.w...} ..%.=.=.=.=.=.=......./ 9.q.e.q.",
+"q.q.i._ @  .%.O...+.2 y &.#...%.....p.r.r.e.a.Z Z a.e.r.e.p.....%...............%...%./ q.q.w.q.",
+"q.q.p.` O ^ ) [ ^ _ > r | / ) [ ~ ) 4.<.1.1.3.n y 6.<.1.1.2./ ~ ~ / / ~ ) / } ~ / / / ~ q.e.q.q.",
+"q.q.p.` O ] ) / / _ > r | / / / ~ / 1.,.,.,.3.7 7 3.,.<.<.<.} <.1.<.<.5.a o 4.,.<.<.1...7.e.e.q.",
+"q.q.p._ @  .%.O.#.+.2 y &.#.O.%.....p.r.r.i.s.Z Z s.r.r.r.y.=.e.r.r.e.s.s X s.e.r.e.p.=.5.e.q.e.",
+"q.9.p._ @ { ......+.> y &.....O.} ..e.q.q.6.8.t t 8.7.q.q.w.%.q.q.q.q.p.s X s.q.w.q.r.=.5.e.w.q.",
+"q.q.p._ O { #.....+.2 y &.......} ..e.p.E v N v v V 5 2.r.q.=.q.e.q.q.s.s X p.7.q.q.r.=.5.e.q.q.",
+"q.q.p.` O @.O...@.+.> y &.......} ..e.u.H P I I I I B :.i.e.%.q.e.q.q.s.s X p.q.q.q.e.=.5.r.e.q.",
+"q.q.p._ + { ......+.> y &.......} ..w.p.H L U I I I B :.i.w.%.q.q.q.q.s.s X p.q.q.q.r.=.7.e.q.q.",
+"q.q.p.` @ { %.....+.4 y &.......} ..e.u.H L U I I I B :.r.e.%.q.q.q.q.s.s X a.q.q.q.r...5.e.q.w.",
+"q.q.p._ @  .......+.> y &.........} e.y.H P U I I I B :.r.e.=.q.e.q.q.s.a X p.q.q.q.r.=.5.e.q.e.",
+"e.7.p.` @  .O.....O.> y +.......} ..e.a.G P I I I I B :.i.q.%.q.q.q.q.s.s X p.q.q.q.r.=.7.e.q.q.",
+"q.q.i.` @  .O.....+.4 p &.......} ..e.y.[ C A Z Z A y 4.e.w.%.q.q.q.q.s.s X p.q.q.q.r.=.9.w.q.q.",
+"q.q.p._ +  .O.....o.> p &.......} ..e.q.r.t.t.t.t.t.u.e.q.e.%.q.q.q.q.s.a X p.q.q.q.e.=.5.w.w.q.",
+"e.q.p._ @  .O.....+.2 p &.....#.} ..r.e.q.e.e.e.e.e.q.e.e.r.=.w.r.r.q.s.s X s.e.e.r.y.=.5.e.w.q.",
+"q.q.p.` O ] } } } | 2 t X.} } } ) } 5.4.5.4.4.5.4.4.5.5.4.5...4.4.4.4.r.s X e.4.4.4.5.%.5.q.q.q.",
+"q.q.p.` + Q ~ ~ ^ ( > r ) ~ ~ / ~ Y / / / / / ~ / ~ ~ / / / T ~ / / ~ / ! Y [ ~ / ~ / ~ q.q.q.e.",
+"q.q.i._ @ @.%.%.#.+.> p -.#...%...~ %.%.O.#.#.%.#.#.%...#.%.~ ..#.#.#.#.%.%.#.#...%.O.[ q.e.q.q.",
+"q.9.p._ @ { ......+.4 y &.........! ........................~ ......+.` ` X.X.+......./ q.q.q.q.",
+"q.q.p.` @  .O.....+.2 y &.........! ........................! ..#.D 2 M n b n 4 R %.../ q.q.q.q.",
+"q.q.p._ + { O.....+.> y %.........^ #.#.......#.#.#.......#.! ..=.f K I I I I J x %...) q.w.e.q.",
+"q.q.p.` @  .O.....O.> u o.| | | | R | | | | X.| | | | | | | R _ +.g K U I I I J c %...[ 5.e.q.q.",
+"q.q.p._ @  .O.....+.6 , : : : : ; : : : : : : : : : : : : : : : : * L I I I I J Y %.../ q.q.q.q.",
+"e.7.p.` @  .%.....%.^ f F S S S S f S S S S S S S S S S S S i S F 9 K I I I I B c %...} q.q.q.q.",
+"e.q.i.` @  .O.........=.+.%.&.%.&.~ &.%.=.&.%.&.=.&.&.%.%.&.) O.;.j K I I I I J x %.../ q.e.q.q.",
+"q.q.i.` + { ....................} ! ......} ....} ..........! } %.D 3 m b b b > R %...[ 7.e.q.q.",
+"q.q.p.` O [ ......} ..} ..} ....| ! ..........} ............! ......X._ X.X._ X...} ../ q.w.q.q.",
+"q.q.p.` # $.=.*.*.*.*.*.*.*.*.%.*.[ *.*.*.%.*.*.%.*.#.*.%.*./ *.*.*.*.*.*.*.*.*.*.*.*.} 9.q.q.w.",
+"q.q.p.` + d z z z z z z z z z z z w z z z z z z z z z z z z w z z z z z z z z z z z z z q.q.q.q.",
+"q.q.e.;.l $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ # l q.w.q.q.",
+"q.q.q.e.9.9.9.0.0.0.0.0.0.9.9.0.0.0.0.0.0.0.0.0.0.0.0.0.9.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.q.q.q.w.",
+"q.q.q.q.w.r.w.w.w.w.w.e.r.w.w.w.w.e.w.w.w.w.w.e.e.e.w.w.w.r.w.w.q.e.w.w.w.w.w.w.w.w.w.e.q.q.q.q.",
+"q.q.q.w.q.q.q.q.w.q.q.q.q.q.q.w.q.q.q.w.w.q.w.q.q.q.q.q.q.q.w.e.w.q.w.q.q.e.q.q.w.w.q.q.q.q.q.e.",
+"q.e.q.q.e.q.q.w.q.q.w.q.e.q.q.q.e.q.q.q.q.q.q.q.e.q.q.w.q.q.q.q.q.q.q.q.q.q.w.q.q.q.q.e.q.w.q.q."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/net-web.png b/icons/net-web.png
new file mode 100644 (file)
index 0000000..116d689
Binary files /dev/null and b/icons/net-web.png differ
diff --git a/icons/net.ico b/icons/net.ico
new file mode 100644 (file)
index 0000000..57d8423
Binary files /dev/null and b/icons/net.ico differ
diff --git a/icons/net.rc b/icons/net.rc
new file mode 100644 (file)
index 0000000..7a2933a
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "net.ico"
diff --git a/icons/netslide-16d24.png b/icons/netslide-16d24.png
new file mode 100644 (file)
index 0000000..e55f80c
Binary files /dev/null and b/icons/netslide-16d24.png differ
diff --git a/icons/netslide-16d4.png b/icons/netslide-16d4.png
new file mode 100644 (file)
index 0000000..ee70e8b
Binary files /dev/null and b/icons/netslide-16d4.png differ
diff --git a/icons/netslide-16d8.png b/icons/netslide-16d8.png
new file mode 100644 (file)
index 0000000..4e1a22e
Binary files /dev/null and b/icons/netslide-16d8.png differ
diff --git a/icons/netslide-32d24.png b/icons/netslide-32d24.png
new file mode 100644 (file)
index 0000000..eb140d2
Binary files /dev/null and b/icons/netslide-32d24.png differ
diff --git a/icons/netslide-32d4.png b/icons/netslide-32d4.png
new file mode 100644 (file)
index 0000000..f91af92
Binary files /dev/null and b/icons/netslide-32d4.png differ
diff --git a/icons/netslide-32d8.png b/icons/netslide-32d8.png
new file mode 100644 (file)
index 0000000..5c0a9fa
Binary files /dev/null and b/icons/netslide-32d8.png differ
diff --git a/icons/netslide-48d24.png b/icons/netslide-48d24.png
new file mode 100644 (file)
index 0000000..55bdebf
Binary files /dev/null and b/icons/netslide-48d24.png differ
diff --git a/icons/netslide-48d4.png b/icons/netslide-48d4.png
new file mode 100644 (file)
index 0000000..31c06ca
Binary files /dev/null and b/icons/netslide-48d4.png differ
diff --git a/icons/netslide-48d8.png b/icons/netslide-48d8.png
new file mode 100644 (file)
index 0000000..5dd7771
Binary files /dev/null and b/icons/netslide-48d8.png differ
diff --git a/icons/netslide-base.png b/icons/netslide-base.png
new file mode 100644 (file)
index 0000000..3cc197e
Binary files /dev/null and b/icons/netslide-base.png differ
diff --git a/icons/netslide-ibase.png b/icons/netslide-ibase.png
new file mode 100644 (file)
index 0000000..01ae0e9
Binary files /dev/null and b/icons/netslide-ibase.png differ
diff --git a/icons/netslide-ibase4.png b/icons/netslide-ibase4.png
new file mode 100644 (file)
index 0000000..5b02e2f
Binary files /dev/null and b/icons/netslide-ibase4.png differ
diff --git a/icons/netslide-icon.c b/icons/netslide-icon.c
new file mode 100644 (file)
index 0000000..f537aad
--- /dev/null
@@ -0,0 +1,520 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 237 2 ",
+"   c #E6E6E6",
+".  c #E6E6E6",
+"X  c #E6E6E6",
+"o  c #E6E6E6",
+"O  c #EAEAEA",
+"+  c gray88",
+"@  c #EAEAEA",
+"#  c #E6E6E6",
+"$  c #E6E6E6",
+"%  c #EAEAEA",
+"&  c gray88",
+"*  c #EAEAEA",
+"=  c #E6E6E6",
+"-  c #E6E6E6",
+";  c #E6E6E6",
+":  c #E6E6E6",
+">  c gray91",
+",  c #C8C8C8",
+"<  c gray66",
+"1  c gray82",
+"2  c gray91",
+"3  c gray91",
+"4  c #CECECE",
+"5  c gray66",
+"6  c #CBCBCB",
+"7  c #E9E9E9",
+"8  c gray90",
+"9  c #E6E6E6",
+"0  c #E6E6E6",
+"q  c gray90",
+"w  c #E7E6E6",
+"e  c #B0AFAF",
+"r  c #A2A1A1",
+"t  c #B9B8B8",
+"y  c #E9E8E8",
+"u  c #E8E7E7",
+"i  c #B6B5B5",
+"p  c #A2A1A1",
+"a  c #B2B2B2",
+"s  c #E8E7E7",
+"d  c gray90",
+"f  c #E6E5E5",
+"g  c #E7E9E9",
+"h  c #F1F6F6",
+"j  c #DBDEDE",
+"k  c #B3B7B7",
+"l  c #E4E8E8",
+"z  c #EFF3F3",
+"x  c #EFF3F3",
+"c  c #E1E5E5",
+"v  c #B2B6B6",
+"b  c #DEE2E2",
+"n  c #F0F4F4",
+"m  c #E6E6E6",
+"M  c #E6E6E6",
+"N  c gray90",
+"B  c #E7E9E9",
+"V  c #DAD3D3",
+"C  c #BFA8A8",
+"Z  c #C3AEAE",
+"A  c #C1ABAB",
+"S  c #C3ADAD",
+"D  c #C1ACAC",
+"F  c #C1ACAC",
+"G  c #C3ADAD",
+"H  c #C2ADAD",
+"J  c #C2ACAC",
+"K  c #C4B0B0",
+"L  c #E2E0E0",
+"P  c gray91",
+"I  c #E7E6E6",
+"U  c #F1F5F5",
+"Y  c #C0AAAA",
+"T  c #C3ADAD",
+"R  c #D1C8C8",
+"E  c #908888",
+"W  c #D8CDCD",
+"Q  c #CBC0C0",
+"!  c #CCC1C1",
+"~  c #D5CACA",
+"^  c #8F8888",
+"/  c #CFC4C4",
+"(  c #D4CACA",
+")  c #E4E3E3",
+"_  c #EAEAEA",
+"`  c #C8C8C8",
+"'  c #B0AFAF",
+"]  c #DADEDE",
+"[  c #C3AEAE",
+"{  c #D8D0D0",
+"}  c #E8EEEE",
+"|  c #A0A3A3",
+" . c #F0F3F3",
+".. c #E1E3E3",
+"X. c #D6D9D9",
+"o. c #DEE1E1",
+"O. c #BDC0C0",
+"+. c #DDE0E0",
+"@. c #DFE2E2",
+"#. c gray90",
+"$. c gray88",
+"%. c gray66",
+"&. c #A2A1A1",
+"*. c #B2B6B6",
+"=. c #C5AFAF",
+"-. c #D3C7C7",
+";. c #E3E5E5",
+":. c #9D9C9C",
+">. c #EAEAEA",
+",. c #DDDCDC",
+"<. c #E7E7E7",
+"1. c #F2F1F1",
+"2. c #F1F0F0",
+"3. c gray90",
+"4. c #E6E6E6",
+"5. c #E6E6E6",
+"6. c #EAEAEA",
+"7. c gray82",
+"8. c #B9B8B8",
+"9. c #E4E8E8",
+"0. c #C2ADAD",
+"q. c #D6CBCB",
+"w. c #E6E8E8",
+"e. c gray62",
+"r. c #EEEEEE",
+"t. c gainsboro",
+"y. c #B7B7B7",
+"u. c #B9B9B9",
+"i. c #CACACA",
+"p. c #E9E9E9",
+"a. c gray90",
+"s. c #E6E6E6",
+"d. c #E6E6E6",
+"f. c #E9E8E8",
+"g. c #EFF3F3",
+"h. c #C1ACAC",
+"j. c #CDC2C2",
+"k. c #DCDEE1",
+"l. c #9C9B9F",
+"z. c #E3E3E5",
+"x. c LightGray",
+"c. c gray71",
+"v. c #B7B7B7",
+"b. c #8D8D8D",
+"n. c #E6E6E6",
+"m. c #E6E6E6",
+"M. c #E6E6E6",
+"N. c gray91",
+"B. c #E8E7E7",
+"V. c #EFF3F3",
+"C. c #C1ACAC",
+"Z. c #CDC2C2",
+"A. c #E9EBE0",
+"S. c #E3E2D2",
+"D. c #E4E4DD",
+"F. c #D8D8D9",
+"G. c gray91",
+"H. c #F4F4F4",
+"J. c gray63",
+"K. c gray89",
+"L. c #E7E7E7",
+"P. c #CECECE",
+"I. c #B6B5B5",
+"U. c #E1E5E5",
+"Y. c #C4AEAF",
+"T. c #D0C5C1",
+"R. c #5255DC",
+"E. c #2424E4",
+"W. c #7A7AD4",
+"Q. c #EBEBDF",
+"!. c #CFCFD2",
+"~. c #DADADA",
+"^. c #979797",
+"/. c #D7D7D7",
+"(. c gray86",
+"). c gray90",
+"_. c gray66",
+"`. c #A2A1A1",
+"'. c #B1B5B6",
+"]. c #C7B1B2",
+"[. c #CDC2BC",
+"{. c #2325EC",
+"}. c blue",
+"|. c #3A3ABF",
+" X c #A8A895",
+".X c #DADADE",
+"XX c #E9E9E9",
+"oX c #9D9D9D",
+"OX c #E2E2E2",
+"+X c #E6E6E6",
+"@X c #E6E6E6",
+"#X c #EAEAEA",
+"$X c #CBCBCB",
+"%X c #B2B2B2",
+"&X c #DDE1E1",
+"*X c #C4AEAF",
+"=X c #CFC4C0",
+"-X c #5759D9",
+";X c #2A29E0",
+":X c #7B7BD0",
+">X c #E6E6DA",
+",X c #DCDCDF",
+"<X c #E9E9E9",
+"1X c #9D9D9D",
+"2X c gray89",
+"3X c #E7E7E7",
+"4X c #E6E6E6",
+"5X c #E9E9E9",
+"6X c #E8E7E7",
+"7X c #F0F4F4",
+"8X c #C4AFAF",
+"9X c #D4CACA",
+"0X c #F2F5E8",
+"qX c #EFEEDD",
+"wX c #EEEEE5",
+"eX c #DFDFE0",
+"rX c #DFDFDF",
+"tX c #E9E9E9",
+"yX c gray63",
+"uX c gray89",
+"iX c #E7E7E7",
+"pX c #E6E6E6",
+"aX c gray90",
+"sX c #E6E6E6",
+"dX c #E3E0E0",
+"fX c #E4E3E3",
+"gX c #E5E5E8",
+"hX c #E4E4E8",
+"jX c #E5E5E7",
+"kX c gray90",
+"lX c gray90",
+"zX c #E6E6E6",
+"xX c #DFDFDF",
+"cX c #E6E6E6",
+"vX c #E6E6E6",
+"bX c #E6E6E6",
+"nX c white",
+/* pixels */
+"      . X o O + @ # $ % & * = - ",
+"      ; : > , < 1 2 3 4 5 6 7 8 ",
+"    9 0 q w e r t y u i p a s d ",
+". ; 0 f g h j k l z x c v b n m ",
+"X M N B V C Z A S D F G H J K L ",
+"o P I U Y T R E W Q ! ~ ^ / ( ) ",
+"_ ` ' ] [ { } |  ...X.o.O.+.@.#.",
+"$.%.&.*.=.-.;.:.>.,.<.1.2.3.4.5.",
+"6.7.8.9.0.q.w.e.r.t.y.u.i.p.a.s.",
+"d.3 f.g.h.j.k.l.z.x.c.v.b.n.m.M.",
+"m.N.B.V.C.Z.A.S.D.F.G.H.J.K.L.- ",
+"% P.I.U.Y.T.R.E.W.Q.!.~.^./.(.).",
+"+ _.`.'.].[.{.}.|. X.XXXoXOX+X@X",
+"#X$X%X&X*X=X-X;X:X>X,X<X1X2X3XX ",
+"4X5X6X7X8X9X0XqXwXeXrXtXyXuXiXpX",
+"- 8 aXsXdXfXgXhXjXkXlXzXxXcXvXbX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 73 1 ",
+"  c #565656",
+". c #5F5F7A",
+"X c #676161",
+"o c #756F6F",
+"O c #737373",
+"+ c #757878",
+"@ c gray49",
+"# c #8F5D5D",
+"$ c #915D5D",
+"% c #966464",
+"& c #986767",
+"* c #6F6F8B",
+"= c #5555B4",
+"- c #5656BF",
+"; c #5C5CBD",
+": c #6969B5",
+"> c #6C6CBE",
+", c #7474B1",
+"< c #7070BF",
+"1 c #2828C6",
+"2 c #2A2AC8",
+"3 c #0000EA",
+"4 c #0000F1",
+"5 c #0303FE",
+"6 c #5D5DC0",
+"7 c #838383",
+"8 c #8A8282",
+"9 c #8A8A83",
+"0 c #8B8B8B",
+"q c #949494",
+"w c #9B9B9B",
+"e c #9C9393",
+"r c #B99B9B",
+"t c #A3A39D",
+"y c #8383B5",
+"u c #A4A5A5",
+"i c #ADADAD",
+"p c #BAA3A3",
+"a c #B4B4B4",
+"s c #B9B7B7",
+"d c #BBBBBB",
+"f c #C1B5B5",
+"g c #CBBFBF",
+"h c #AFAFCB",
+"j c #BCBCC7",
+"k c #B1B1CC",
+"l c #C3C3C3",
+"z c #CEC2C3",
+"x c #C1C1CA",
+"c c #CBCACA",
+"v c #D2C6C6",
+"b c #D4CBCB",
+"n c #DACECE",
+"m c #D3D3D3",
+"M c #DCD5D5",
+"N c #D5D5D9",
+"B c #DBDBDB",
+"V c #DFDFE0",
+"C c #DEE1E1",
+"Z c #E5E5E5",
+"A c #E8E7E7",
+"S c #E7EAEA",
+"D c #EBEBEB",
+"F c #EFF2E1",
+"G c #EDF0EA",
+"H c #F7F7E7",
+"J c #F9F9E7",
+"K c #F5F5E9",
+"L c #F9F9E9",
+"P c #EDF3F3",
+"I c #F4F5F5",
+"U c #F5FBFB",
+"Y c #FBFBFB",
+/* pixels */
+"ZZZZZZZAZAAZAZAAZZZZAZZZAAZAZZZZ",
+"ZZAZAZZZAZZAZDBZAZZAZZZSZVSZZAZA",
+"AZAAZSZAZAAZDN0uSSZZZZSAwqVDZZZZ",
+"ZAAZZZZZZZZAmwsiuZZSZAZwiawBSZZA",
+"SZZZAAZZZZZSw0da7dDZZDa7sd0uDZZZ",
+"ZAZAZZSZZAAZDidilGZZZZGsisiPZAZA",
+"ZZZZAZZZZZZZDwuqdDZZZZDawtuGZZZA",
+"AZSZZZZAZZZZAcaaBZZZZZAmsacZZZAZ",
+"ZZZAZZAZZPPPPIUUIPPPPPPIUUIPPPAZ",
+"ZSZZZZZZGr$&%%$%%%&%%%%&$$%%%&BS",
+"AZZZZZZZP%pbzMXengvsfvgn8oMzzzZZ",
+"ZZASAZZZP&bIDY+aYSPVCIPYu0YDPPAZ",
+"ZZGNwDDSP%zDCIOiIBSmcmmBq7VmmmVA",
+"ZDNw0uwcU%zPZIOiIZSNmBBBBBBBBBZA",
+"SC0dddusU%zDVIOiIZDmBSAASAASASZA",
+"ZZuusuwsU%zSZIOiGZDmmZZZZZAAAZAZ",
+"ZSDu7dfmP%vDZYOiIVDMDYIIIDZZZZZZ",
+"AZSZdIPZP%zDBIOiIVAm0qqqqMAZZZZZ",
+"ZZZZDZZVP%vIZYOaIZDm700q 0IZZAAZ",
+"ZAZZZZZZP%sBmZOuVmBcSYIYu7YZAAZA",
+"ZZZZZAAZP%fCNNNNNBBcNZBKq7UZZAZZ",
+"ZAZSDZZZP%vPKKKHLDDNBDZYw7YAAAZA",
+"AZSZaDGZP%vD,6;>=jDmmVBDq7SNBVZZ",
+"ZAAw7aamP%zH15553hYZlmmVq@CmmmZA",
+"ZZwisiwsU%zF25553*tqBGZYw7YZADZZ",
+"AVqadsusU%zF25554.97BDVIw7YVZZAZ",
+"ZSVw0iucP%vF15553kYZBAZIw7YZAZAZ",
+"ZZDBtPGAP&zGy>>>:xGmBACYw7UVZAAZ",
+"ZZZADZZVP%zDKKKKLAANNSZIw7UCAZAZ",
+"ZAAZAAZZP%zPZZZZZZSNBSCIw7YZAZZZ",
+"AZZAZAZZABZZZZZAZSZZZZAABBSZZZAZ",
+"ZZAZAZAZAAZZZZZZAZZZAZAAAAZAZAZZ"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 87 1 ",
+"  c #3C1616",
+". c #2D2D2D",
+"X c #333333",
+"o c #353B3B",
+"O c #4F2626",
+"+ c #752121",
+"@ c #633838",
+"# c #494949",
+"$ c #5B5B47",
+"% c #545454",
+"& c #5A5A5A",
+"* c #7F5050",
+"= c #5D6363",
+"- c #666666",
+"; c #6A6A6A",
+": c #747474",
+"> c #7D7D7D",
+", c #855252",
+"< c #976363",
+"1 c #996666",
+"2 c #9A6A6A",
+"3 c #817F7F",
+"4 c #9E7373",
+"5 c #A16D6D",
+"6 c #A07575",
+"7 c #A37A7A",
+"8 c #AA7E7E",
+"9 c #848470",
+"0 c #111195",
+"q c #19199D",
+"w c #1212A9",
+"e c #1818B8",
+"r c #2B2BA6",
+"t c #2121B5",
+"y c #2B2BB0",
+"u c #2424B8",
+"i c #3333B5",
+"p c #474795",
+"a c #7A7AA5",
+"s c #7B7BA9",
+"d c #0000DF",
+"f c #0202EC",
+"g c #0000F2",
+"h c #0202FE",
+"j c #0808FF",
+"k c #828283",
+"l c #868E8E",
+"z c #8B8B8B",
+"x c #949494",
+"c c #9C9C9C",
+"v c #AE8282",
+"b c #8282A5",
+"n c #8A8AA6",
+"m c #8585A9",
+"M c #8A8AAB",
+"N c #9C9CAE",
+"B c #A3A3A3",
+"V c #ABABAB",
+"C c #B4B4B4",
+"Z c #BBBBBB",
+"A c #BBBBC2",
+"S c #C3C3C3",
+"D c #C0CACA",
+"F c #CBCBCB",
+"G c #CCD7D7",
+"H c #D6D5D5",
+"J c #DCDBDB",
+"K c #E1DEDE",
+"L c #E5E5D3",
+"P c #E8E8D6",
+"I c #E6E6DC",
+"U c #E6E5E5",
+"Y c #E9E7E7",
+"T c #EAE9E4",
+"R c #E7E7EA",
+"E c #E7E8E8",
+"W c #EAEAEA",
+"Q c #F5F4EC",
+"! c #FFFFED",
+"~ c #EDF7F7",
+"^ c #ECF7FA",
+"/ c #EFF9F9",
+"( c #F2F1F1",
+") c #F8F6F6",
+"_ c #F8F8F0",
+"` c #F1FBFB",
+"' c #FBFBFB",
+/* pixels */
+"UUUUUUUUUUUUUEUUUUUUUUEUUUUYUUUUURUUUYUUUUUUEUUU",
+"UUYUUEUEUEEUUUEUUEUEUUUUEUUUUEEUUUUEUUUUEUUEUUYU",
+"UUUUYUUUUUUEUUUUEUUURUERUUUEUUUUUUYUEUUUYUUUEUUE",
+"UEUEUUEUUYUUUEYUUUUYEEJWUUUUUEUUUUUEUUUUUUEUUUUU",
+"UUUUUUUUUUEUUUUUUUEUQB:FWUUEEYUUUUEUkzEYUUUUURUU",
+"UUEUUEEUUUUUEUEUUEUWBzZ3SQUUUUUUUEJkVBzYEUUUUUUE",
+"EUUYUUUUUEUUUUYUUEWVxSZZzFWEUUEUEUzVZSBxERUUUUEU",
+"UUUEUUEUUUYEUUUUUWC-cZCCk;JEUUUUW>:VZZV-xQUUUUUU",
+"UUYUUEUUUEUUUUUEUYKKzCZBBRKRUUUEUUZzSZzFUUUUYUUU",
+"EUUUUUUYUUEUUUUURURWxCSBC(UUUUUUU(FxSZxJEUEUUUEU",
+"UUEUUEEUUUUUUYUUUUUYzVCxV(UUEUUEUWFzCCkHEYUEUUUU",
+"UEUUUUUUYEUUUUUUUUYWBxczSWUUUUUUUWHzxxcUEUUUUEUU",
+"UEUUUUEUUUUUYUUUUUIKWWWWYKIUUUUKUUUWWWWUUIKUUUUY",
+"UUEUUEUUEUUEUUE`````/^~/``/``/````~^(^/````/UUUU",
+"UUEUUUUUUUEUUEH7466647v6666666664644v8466666KYUE",
+"YUUUUEUYUUUUU~8+4<<<1, 1<<<<<,<<<<<5O@5<<<<1KEUU",
+"UUUUUEUUUUUYU`45'^`/'Do'`````G~`/`~'-l'/`^``EUUU",
+"UUEUUUU(YUUUU`4<^KUK(CXWKUKUYSJUUUJ)&>)KUIKUUUUU",
+"EUUUUUWCJEUUU^6</UUU(CX(UUUUWSUYEEU'&k'UEEYYUUUY",
+"UUUUU(B-UWEEU`6<`KUU(ZXWUUUUWZZSSSSF>xFSSSSSUEUU",
+"EYUU(BxckxzBW)6<`KUUWZX(UUUUWSUUUUUJWEIUUUUUUUEU",
+"UUUEVzSZCCVxW/6<`UUU(CXWUUUUESUUYEUURUUUUREEUUUU",
+"UYEJ:ZZCZSZcW/6<`KYU(CX(UUUUESUUEUUUUUUUUURUUUUU",
+"UEEWF>ZCBBxzW/6<`UUU(ZXWUUYUESKUUUUUURUUUUUUUUUU",
+"UEUUQSzkcCBSY`6<^UUU(ZX(UUUUUSJUUUKUUUUUUUUUUUUU",
+"UUEUUWF;U((WU`6<`KUUWCX~UUUUEF)'''`''EUUUEUUUUEU",
+"UUUUUUWJUUUUK`6<`URU(ZXWUUUUWc#%%%%%&FWUEUUEEUUE",
+"UEYUURUWUUUUU`6<`KUUWZXWUUUUWV>zkzkx.k'UUUUYUUUU",
+"EUUEUURUUUUUU`41`YYY(ZX(EEEEWF)'))('-3)UUUUYUEUY",
+"UUUUUUUUUUUYK`6,GSSSFV-FSSSSSCKUUUK)%3'KEUUUUUUU",
+"UUUUUUUUYUUUU`6<~KUKUUWKUUUKUSUUUUU'&3'UUEEUUEEU",
+"UEEUUUUUUUUUU`6<`URRWRRWRREUEDKUUUU`&3)UUUUUUUUU",
+"UEUUYUEWUUUUU/4</UULLLLLLPUUESUEEEU'&3'EEWEWEUUE",
+"UUEUUWJ3U((EI^6<~QnwttttepTUESHJJJHW&>WHHJJHUUUU",
+"UEUUEJz:ZFSJU`6<^QsghhhhhyLKUZSFFFFJ&>JSFFFFUEEU",
+"UUUEUkVVzxkzW`6<^Qsfjhhhhi_''HUWEWE'&k'UWWWWUEUU",
+"UYEU3VZZZSZxW/6<^Qaghhhhh0$&%3WUUUU)&3'UUUUUUUUU",
+"UUEUzBSCZZCcW/6<~Qsghhhhhq3k>xEUUYJ'&3`KUUUUUUUU",
+"EUUEWzBVkx3xW/6<^Qsgjjhjhi!`'FKYUUU'&3'UUUEUEUUE",
+"UUUUEEx:FJHUY`6<^QadffffgrPUUSUUUUU'&3'KUEUUUUUU",
+"UUUEUEUxUWEYU`4</EAmMMmMmNUUESUUUUU'&3)IUUUUEUUE",
+"UYUUUUE(YUUYU`6<`KW_QQQQ_QUUESKRUUU'&k)UUEUEUUUU",
+"EUUUUUUUUURUU`6</UUUUUUUUUUUWSIUUUK`&3)UUEUUEUUE",
+"UUUEUUUUUUUUK`71/UUYEUUUUURUWSUEUUU)=k)UUUUUUUUU",
+"EUUEUEUYUUUUUYJKEUEUUUUUUUUUUUUUURUEHJEYUUUUUEUU",
+"UUUUUUUUEURUUUYYUUUUUUEUUURUUEUUUUUUEEEEEUYUUUUY",
+"UUUYUEEUUUUUUUUUUUUUEUUEUUUUEUUEYUUUUUUUUUUEUUUU",
+"UEUUUUUUUYYUUUUUEUUEUUUUUURUUUUUUUEUUEUUEUUUEUUE"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/netslide-web.png b/icons/netslide-web.png
new file mode 100644 (file)
index 0000000..5334b83
Binary files /dev/null and b/icons/netslide-web.png differ
diff --git a/icons/netslide.ico b/icons/netslide.ico
new file mode 100644 (file)
index 0000000..6944e56
Binary files /dev/null and b/icons/netslide.ico differ
diff --git a/icons/netslide.rc b/icons/netslide.rc
new file mode 100644 (file)
index 0000000..127702f
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "netslide.ico"
diff --git a/icons/palisade-16d24.png b/icons/palisade-16d24.png
new file mode 100644 (file)
index 0000000..33eb5f8
Binary files /dev/null and b/icons/palisade-16d24.png differ
diff --git a/icons/palisade-16d4.png b/icons/palisade-16d4.png
new file mode 100644 (file)
index 0000000..de73dfe
Binary files /dev/null and b/icons/palisade-16d4.png differ
diff --git a/icons/palisade-16d8.png b/icons/palisade-16d8.png
new file mode 100644 (file)
index 0000000..5f3d1cd
Binary files /dev/null and b/icons/palisade-16d8.png differ
diff --git a/icons/palisade-32d24.png b/icons/palisade-32d24.png
new file mode 100644 (file)
index 0000000..224a616
Binary files /dev/null and b/icons/palisade-32d24.png differ
diff --git a/icons/palisade-32d4.png b/icons/palisade-32d4.png
new file mode 100644 (file)
index 0000000..8e12ba3
Binary files /dev/null and b/icons/palisade-32d4.png differ
diff --git a/icons/palisade-32d8.png b/icons/palisade-32d8.png
new file mode 100644 (file)
index 0000000..48ef984
Binary files /dev/null and b/icons/palisade-32d8.png differ
diff --git a/icons/palisade-48d24.png b/icons/palisade-48d24.png
new file mode 100644 (file)
index 0000000..cdea9da
Binary files /dev/null and b/icons/palisade-48d24.png differ
diff --git a/icons/palisade-48d4.png b/icons/palisade-48d4.png
new file mode 100644 (file)
index 0000000..14f17d1
Binary files /dev/null and b/icons/palisade-48d4.png differ
diff --git a/icons/palisade-48d8.png b/icons/palisade-48d8.png
new file mode 100644 (file)
index 0000000..18a2ec8
Binary files /dev/null and b/icons/palisade-48d8.png differ
diff --git a/icons/palisade-base.png b/icons/palisade-base.png
new file mode 100644 (file)
index 0000000..eb7c1d3
Binary files /dev/null and b/icons/palisade-base.png differ
diff --git a/icons/palisade-ibase.png b/icons/palisade-ibase.png
new file mode 100644 (file)
index 0000000..e01cde2
Binary files /dev/null and b/icons/palisade-ibase.png differ
diff --git a/icons/palisade-ibase4.png b/icons/palisade-ibase4.png
new file mode 100644 (file)
index 0000000..38b9214
Binary files /dev/null and b/icons/palisade-ibase4.png differ
diff --git a/icons/palisade-icon.c b/icons/palisade-icon.c
new file mode 100644 (file)
index 0000000..4c0562d
--- /dev/null
@@ -0,0 +1,677 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 253 2 ",
+"   c gray83",
+".  c #C0C0C0",
+"X  c #BBBBBB",
+"o  c #BBBBBB",
+"O  c #BCBCBC",
+"+  c #BCBCBC",
+"@  c #BCBCBC",
+"#  c #BCBCBC",
+"$  c #BCBCBC",
+"%  c #BCBCBC",
+"&  c #BCBCBC",
+"*  c gray74",
+"=  c gray74",
+"-  c gray",
+";  c LightGray",
+":  c #C0C0C0",
+">  c gray58",
+",  c #B1B1B1",
+"<  c gray69",
+"1  c gray67",
+"2  c #AAAAAA",
+"3  c #AEAEAE",
+"4  c gray68",
+"5  c gray67",
+"6  c #AAAAAA",
+"7  c gray68",
+"8  c #B1B1B1",
+"9  c gray61",
+"0  c gray56",
+"q  c #B6B6B6",
+"w  c gray82",
+"e  c gray73",
+"r  c #B9B9B9",
+"t  c #C0C0C0",
+"y  c #959595",
+"u  c #E2E2E2",
+"i  c gray84",
+"p  c #DDDDDD",
+"a  c gainsboro",
+"s  c gray85",
+"d  c #D7D7D7",
+"f  c gainsboro",
+"g  c #E1E1E1",
+"h  c gray77",
+"j  c #B3B3B2",
+"k  c #E4E4E3",
+"l  c gray83",
+"z  c gray73",
+"x  c #B6B6B6",
+"c  c #AAAAAA",
+"v  c gray54",
+"b  c gray86",
+"n  c #D2D2D2",
+"m  c #DADADA",
+"M  c gray85",
+"N  c #D7D7D6",
+"B  c #D5D5D4",
+"V  c gray85",
+"C  c gray87",
+"Z  c #C2C2C1",
+"A  c #ACACB0",
+"S  c #DBDBE0",
+"D  c #D3D3D4",
+"F  c #BCBCBC",
+"G  c gray67",
+"H  c #DADADA",
+"J  c #D2D2D2",
+"K  c #D0D0D0",
+"L  c gray74",
+"P  c gray",
+"I  c gray74",
+"U  c #BBBBBC",
+"Y  c #BABABB",
+"T  c #BEBEBD",
+"R  c #C3C3C2",
+"E  c #A8A8A9",
+"W  c #A9A999",
+"Q  c #DBDBC6",
+"!  c #D3D3D2",
+"~  c #BCBCBC",
+"^  c #AAAAAA",
+"/  c #D7D7D7",
+"(  c #D7D7D7",
+")  c gray74",
+"_  c #909090",
+"`  c #B1B1B1",
+"'  c #B1B1B4",
+"]  c #AAAA9B",
+"[  c #A9A98E",
+"{  c #ADADB1",
+"}  c #ADADB0",
+"|  c #A8A89A",
+" . c #C1C18B",
+".. c #D4D4B6",
+"X. c #D4D4D1",
+"o. c #BBBBBB",
+"O. c #B4B4B4",
+"+. c gray72",
+"@. c gray58",
+"#. c #C5C5C5",
+"$. c #B8B8B7",
+"%. c #BFBFBD",
+"&. c #8D8D91",
+"*. c #E3E3CC",
+"=. c #D6D6B0",
+"-. c #DDDDE3",
+";. c #DDDDE0",
+":. c #DBDBC4",
+">. c #D4D4B2",
+",. c #D6D6E3",
+"<. c #D5D5D4",
+"1. c gray73",
+"2. c #B6B6B6",
+"3. c gray67",
+"4. c gray57",
+"5. c #C6C6C6",
+"6. c #B1B1B5",
+"7. c #B4B4B8",
+"8. c #84848E",
+"9. c #DADAC9",
+"0. c #CFCFAE",
+"q. c #D5D5E0",
+"w. c #D4D4DD",
+"e. c #D2D2C1",
+"r. c #D2D2B0",
+"t. c #D6D6E0",
+"y. c #D5D5D4",
+"u. c #BCBCBC",
+"i. c gray67",
+"p. c gray85",
+"a. c #D7D7D7",
+"s. c #BBBBBC",
+"d. c #ABAB9B",
+"f. c #D9D9C3",
+"g. c #D6D6C5",
+"h. c #CECEA9",
+"j. c #CBCB9A",
+"k. c #D4D4C4",
+"l. c #D3D3C1",
+"z. c #CECEA9",
+"x. c #CBCB99",
+"c. c #D4D4C6",
+"v. c #D5D5D2",
+"b. c #AAAAAA",
+"n. c #D7D7D7",
+"m. c #DADAD9",
+"M. c #BABABB",
+"N. c #A9A98E",
+"B. c #D8D8B1",
+"V. c #D5D5B4",
+"C. c #CBCB99",
+"Z. c #C7C78C",
+"A. c #D3D3B2",
+"S. c #D2D2B0",
+"D. c #CBCB9A",
+"F. c #C6C68B",
+"G. c #D3D3B6",
+"H. c #D4D4D1",
+"J. c #BBBBBB",
+"K. c #B4B4B4",
+"L. c #B6B6B6",
+"P. c gray54",
+"I. c #C5C5C5",
+"U. c #B2B2B7",
+"Y. c #B7B7BD",
+"T. c #858591",
+"R. c #DCDCCC",
+"E. c #D1D1B1",
+"W. c #D6D6E4",
+"Q. c #D6D6E1",
+"!. c #D4D4C4",
+"~. c #D3D3B2",
+"^. c #D6D6E3",
+"/. c #D5D5D4",
+"(. c gray73",
+"). c gray72",
+"_. c gray73",
+"`. c #909090",
+"'. c gray79",
+"]. c #B7B7B6",
+"[. c #BBBBB8",
+"{. c #8B8B8F",
+"}. c #E0E0C9",
+"|. c #D0D0AA",
+" X c #D6D6DB",
+".X c #D6D6D8",
+"XX c #D3D3BD",
+"oX c #D2D2B0",
+"OX c #D6D6E0",
+"+X c #D5D5D4",
+"@X c gray74",
+"#X c gray61",
+"$X c #C3C3C3",
+"%X c #C6C6C6",
+"&X c #A9A9A9",
+"*X c #9A9A9A",
+"=X c #C4C4C3",
+"-X c #C1C1C6",
+";X c #BBBBA8",
+":X c #CBCBA9",
+">X c #D4D4DA",
+",X c #D3D3D6",
+"<X c #CECEBC",
+"1X c #CBCB9A",
+"2X c #D4D4C6",
+"3X c #D5D5D2",
+"4X c gray",
+"5X c gray56",
+"6X c #B2B2B2",
+"7X c gray67",
+"8X c #A9A9A9",
+"9X c gray65",
+"0X c gray68",
+"qX c gray69",
+"wX c #999998",
+"eX c #A8A8A7",
+"rX c #D7D7D7",
+"tX c #D2D2D2",
+"yX c #CBCBCB",
+"uX c #C6C6A8",
+"iX c #D3D3B0",
+"pX c #D4D4D2",
+"aX c #B6B6B6",
+"sX c #E4E4E4",
+"dX c gray86",
+"fX c gray86",
+"gX c gray85",
+"hX c gainsboro",
+"jX c #E2E2E2",
+"kX c #C5C5C6",
+"lX c #B6B6B7",
+"zX c gray74",
+"xX c gray59",
+"cX c gray86",
+"vX c #D2D2D8",
+"bX c #D6D6DD",
+"nX c #D5D5D5",
+"mX c gray82",
+"MX c gray83",
+"NX c LightGray",
+"BX c LightGray",
+"VX c LightGray",
+"CX c LightGray",
+"ZX c gray83",
+"AX c #D2D2D2",
+"SX c #D2D2D2",
+"DX c #D5D5D5",
+"FX c #CBCBCB",
+"GX c #D5D5D5",
+"HX c #D4D4D3",
+"JX c #D5D5D4",
+"KX c #D5D5D5",
+"LX c white",
+/* pixels */
+"  . X o O + @ # $ + % & * = - ; ",
+": > , < 1 2 3 4 5 6 7 8 9 0 q w ",
+"e r t y u i p a s d f g h j k l ",
+"z x c v b n m M N B V C Z A S D ",
+"F G H J K L P I U Y T R E W Q ! ",
+"~ ^ / ( ) _ ` ' ] [ { } |  ...X.",
+"o.O.+.@.#.$.%.&.*.=.-.;.:.>.,.<.",
+"1.2.3.4.5.6.7.8.9.0.q.w.e.r.t.y.",
+"u.i.p.a.s.d.f.g.h.j.k.l.z.x.c.v.",
+"+ b.n.m.M.N.B.V.C.Z.A.S.D.F.G.H.",
+"J.K.L.P.I.U.Y.T.R.E.W.Q.!.~.^./.",
+"(.)._.`.'.].[.{.}.|. X.XXXoXOX+X",
+"@X#X$X%X&X*X=X-X;X:X>X,X<X1X2X3X",
+"4X5X6X7X8X9X0XqXwXeXrXtXyXuXiXpX",
+"- aXsXdXfXgXhXjXkXlXzXxXcXvXbXnX",
+"; mXMXNXBXVXCXZXAXSXDXFXGXHXJXKX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 221 2 ",
+"   c #252525",
+".  c #323232",
+"X  c gray26",
+"o  c gray27",
+"O  c gray29",
+"+  c #4C4C4C",
+"@  c gray31",
+"#  c #505050",
+"$  c #73734A",
+"%  c #636362",
+"&  c #686868",
+"*  c DimGray",
+"=  c #6F6F68",
+"-  c #6D6D6D",
+";  c gray43",
+":  c #757568",
+">  c #777769",
+",  c #77776A",
+"<  c #73736E",
+"1  c gray45",
+"2  c #747474",
+"3  c gray46",
+"4  c #767676",
+"5  c #777777",
+"6  c #787877",
+"7  c #797977",
+"8  c gray47",
+"9  c #797978",
+"0  c #797979",
+"q  c #7B7B78",
+"w  c gray48",
+"e  c #7A7A7B",
+"r  c #7B7B7B",
+"t  c #79797C",
+"y  c #79797D",
+"u  c #7B7B7D",
+"i  c #79797F",
+"p  c #7C7C7C",
+"a  c gray49",
+"s  c #7E7E7D",
+"d  c #7E7E7E",
+"f  c gray50",
+"g  c #979744",
+"h  c #A2A244",
+"j  c #BEBE68",
+"k  c #BEBE6A",
+"l  c #A2A273",
+"z  c #C2C275",
+"x  c #C8C875",
+"c  c #C9C977",
+"v  c #CACA76",
+"b  c #CACA77",
+"n  c #C9C978",
+"m  c #CBCB78",
+"M  c #CBCB79",
+"N  c #CECE7A",
+"B  c #CFCF7D",
+"V  c #CCCC7E",
+"C  c #CFCF7E",
+"Z  c #D1D179",
+"A  c #D7D77E",
+"S  c #808080",
+"D  c #848484",
+"F  c gray53",
+"G  c #888888",
+"H  c #898988",
+"J  c #929292",
+"K  c #949492",
+"L  c gray58",
+"P  c #9B9B9D",
+"I  c #9D9D9D",
+"U  c #9E9E9D",
+"Y  c #9F9F9F",
+"T  c #B4B49B",
+"R  c gray63",
+"E  c #A4A4A4",
+"W  c #AAAAAA",
+"Q  c #AEAEAE",
+"!  c #AFAFB5",
+"~  c #B4B4B4",
+"^  c gray71",
+"/  c #B4B4B6",
+"(  c #B6B6B6",
+")  c #B7B7B7",
+"_  c #B8B8B7",
+"`  c gray72",
+"'  c #B9B9B9",
+"]  c gray73",
+"[  c #BBBBBB",
+"{  c #B8B8BE",
+"}  c #BCBCBC",
+"|  c gray74",
+" . c #BEBEBD",
+".. c gray",
+"X. c #D1D180",
+"o. c #D3D380",
+"O. c #D7D780",
+"+. c #CBCB9D",
+"@. c #CBCBB6",
+"#. c #CFCFB4",
+"$. c #CFCFB5",
+"%. c #D1D1B4",
+"&. c #D0D0B5",
+"*. c #D1D1B5",
+"=. c #D1D1B6",
+"-. c #D2D2B6",
+";. c #D2D2B7",
+":. c #D3D3B8",
+">. c #D2D2B9",
+",. c #D3D3BD",
+"<. c #D4D4BD",
+"1. c #D9D9BE",
+"2. c #BEBEC2",
+"3. c #C0C0C0",
+"4. c #C1C1C1",
+"5. c gray76",
+"6. c #C6C6C5",
+"7. c gray78",
+"8. c #C8C8C5",
+"9. c #C8C8C7",
+"0. c #C9C9C7",
+"q. c #C8C8C8",
+"w. c gray79",
+"e. c #CACAC9",
+"r. c #CACACA",
+"t. c #CBCBCB",
+"y. c gray80",
+"u. c #CECECE",
+"i. c #CFCFCE",
+"p. c gray81",
+"a. c #D4D4C1",
+"s. c #D5D5C1",
+"d. c #D5D5C2",
+"f. c #DEDEC1",
+"g. c #DFDFC1",
+"h. c #DEDEC2",
+"j. c #D1D1CF",
+"k. c #D4D4CF",
+"l. c #D0D0D0",
+"z. c #D1D1D0",
+"x. c gray82",
+"c. c #D2D2D0",
+"v. c #D2D2D1",
+"b. c #D3D3D1",
+"n. c #D2D2D2",
+"m. c LightGray",
+"M. c #D4D4D0",
+"N. c #D5D5D1",
+"B. c #D4D4D2",
+"V. c #D5D5D2",
+"C. c #D5D5D3",
+"Z. c #D6D6D3",
+"A. c gray83",
+"S. c #D5D5D4",
+"D. c #D5D5D5",
+"F. c #D6D6D4",
+"G. c #D6D6D5",
+"H. c #D5D5D6",
+"J. c #D5D5D7",
+"K. c gray84",
+"L. c #D7D7D7",
+"P. c #D1D1D8",
+"I. c #D3D3D9",
+"U. c #D3D3DA",
+"Y. c #D4D4DA",
+"T. c #D6D6DA",
+"R. c #D6D6DB",
+"E. c #D3D3DE",
+"W. c #D6D6DC",
+"Q. c #D6D6DD",
+"!. c #D4D4DE",
+"~. c #D6D6DE",
+"^. c #D6D6DF",
+"/. c #D8D8D8",
+"(. c #D8D8D9",
+"). c gray85",
+"_. c #DADADA",
+"`. c gray86",
+"'. c #D8D8DC",
+"]. c #D8D8DE",
+"[. c #D9D9DE",
+"{. c gainsboro",
+"}. c #DDDDDD",
+"|. c gray87",
+" X c #DFDFDE",
+".X c #DFDFDF",
+"XX c #E0E0DE",
+"oX c #E1E1DE",
+"OX c #D6D6E0",
+"+X c #D6D6E1",
+"@X c #D7D7E2",
+"#X c #D6D6E3",
+"$X c #D6D6E4",
+"%X c #D9D9E3",
+"&X c #DCDCE3",
+"*X c #DFDFE5",
+"=X c #D6D6E8",
+"-X c #D7D7E9",
+";X c #D7D7EE",
+":X c #DFDFEA",
+">X c gray88",
+",X c #E1E1E0",
+"<X c #E1E1E1",
+"1X c #E2E2E2",
+"2X c gray89",
+"3X c #E4E4E3",
+"4X c #E1E1E7",
+"5X c #E4E4E4",
+"6X c gray90",
+"7X c #E7E7E7",
+"8X c #E1E1E8",
+"9X c #E2E2E9",
+"0X c #E3E3EA",
+"qX c #E2E2EE",
+"wX c #E4E4EF",
+"eX c gray91",
+"rX c #E9E9E9",
+"tX c #EAEAEA",
+"yX c gray93",
+"uX c #EEEEEE",
+"iX c #EFEFEF",
+/* pixels */
+"D.D.`.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.`.}.}.}.D.D.",
+"D.D...) ` ` ` ` ) ` ` ) ` ` ` ` ` ` ` ) ` ` ` ` ` ` ..` ) ` D.D.",
+"`.3.# d 8 3 3 8 8 8 3 8 8 3 3 3 8 8 3 8 3 3 8 3 d * O d 3 d p.D.",
+"}.) d uX}.uXuX2X2X}.D.2X2X2X2X2X2X}.D.2X2X2X2X}.tX3.S uX}.2XD.D.",
+"}.` 8 }.m.D 8 w.m.p.w.D.m.m.m.m.D.p.w.m.m.m.m.m.`.) 6 }.m.m.D.D.",
+"}.` 8 }.p.3.X R 2Xp.w.D.m.D.D.D.D.m.p.D.D.D.D.D.`._ 8 2Xm.D.D.D.",
+"}.` 8 2X}.8 + p.D.m.p.D.D.D.D.D.D.m.w.D.D.D.D.m.`.) 8 2Xm.D.D.D.",
+"}.` 3 2Xm.1 - ..`.m.w.D.m.m.m.D.D.m.w.D.m.m.D.m.`.) 8 }.m.B.D.D.",
+"}.` 8 2Xm.5X5X`.D.m.p.}.}.`.}.`.{.R.m.}.`.}.`.`.2X..u 0XU.W.D.D.",
+"}.` 8 }.p.p.p.m.m.p.) ) ) _ ) ) _ ) ! ` ) ) ) ) ..P : h.$.>.D.D.",
+"}.` 1 D.w.w.w.w.m.) + d 8 8 3 6 8 , $ i 6 8 8 8 8 < g o.c V k.D.",
+"}.` 8 2Xm.2X5X`.}.` S uX}.tXuX3X0Xh.A qXoX2X2XoX0Xg.Z ;XW.+XD.D.",
+"}.` 8 2XD.D 8 w.}.) 8 }.m.J 6 6.R.$.c W.k.B.m.m.U.&.m W.m.B.D.D.",
+"}.` 3 2Xm.3.X Y 5X) 8 }.`.E   Q *X&.m +XB.D.D.B.R.>.M +XB.D.D.D.",
+"}.` 8 }.`.8 + p.}.) 3 2Xm.W . Y 0X$.m +XZ.D.D.D.W.&.M +XB.D.D.D.",
+"}.` 8 2XD.1 - ..2X) 8 2Xp.G d 8.W.>.m +XB.B.D.B.].&.M ].B.D.D.D.",
+"}.) 8 3Xm.3X3XR.].) t 0XR.4X0X].+X,.C -XR.W.W.R.$X<.X.-XW.W.D.D.",
+"}.` 8 }.p.p.p.m.`./ : h.$.&.%.&.,.+.j a.&.>.>.&.<.+.j d.$.>.D.D.",
+"}.` 2 D.w.w.8.w.k.! $ A c c c m C j h o.m m M M C j h o.c V k.D.",
+"}.) 8 2XD.}.2X`.}._ u qXE.:XwX%X-Xa.o.;XW.W.%X].-Xa.Z ;XW.+XD.D.",
+"}.` 8 2Xm.J u 6.}.) 6 oXB.K 6 8.W.&.m W.m.B.B.B.R.&.m W.B.D.D.D.",
+"}.` 8 }.`.R   Q 5X) 8 }.`.R   Q *X$.m +XB.D.L.B.W.>.m W.B.D.D.D.",
+"}.` 8 2Xm.W . Y 5X) 8 2Xm.W . Y 4X&.m +XB.D.D.D.W.&.M %XB.D.D.D.",
+"}.` 3 2Xm.D d w.}.) 8 2Xm.D d 8.].&.m +XB.D.D.D.W.>.c %XB.B.D.D.",
+"}.) u tX].5XtX}.2X..d 7X`.5XtX}.&X1.M +XB.D.D.D.W.:.C -XR.R.D.D.",
+"}.` * 5.) ) ~ ) ..Y & 2.) ) ~ ) { T z E.k.m.m.m.U.$.j a.&.>.D.D.",
+"].@.O u 8 8 8 8 8 3 - 8 3 8 8 3 d % < `.w.w.8.y.p.2.l Z m C k.D.",
+"}._ i uX}.}.2X2X2X}.`.2X2XoX2X2XtX3.8 2Xm.2X3XR.D.D.U.+X+X+XD.D.",
+"}.` 3 }.m.m.m.m.m.p.q.D.m.m.m.m.{.) 6 2XD.D 8 p.D.m.w.D.m.B.D.D.",
+"}.` d 2Xm.D.D.m.D.m.y.D.A.D.B.B.{.` d oXl._ o Y 2Xp.p.D.A.D.D.D.",
+"D.D.l.D.D.D.D.D.D.D.m.D.D.D.D.D.D.m.p.D.D.}.m.m.D.D.A.D.D.D.D.D.",
+"D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.R.D.D.m.D.D.D.D.D.D.D.D.D.D."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 80 1 ",
+"  c #050505",
+". c gray6",
+"X c #161616",
+"o c #1D1D1D",
+"O c #303019",
+"+ c #252525",
+"@ c #2C2C2C",
+"# c #343426",
+"$ c #323232",
+"% c #3B3B3B",
+"& c #464646",
+"* c #484845",
+"= c #4B4B4B",
+"- c #555555",
+"; c #5E5E5E",
+": c #6D6D42",
+"> c #646464",
+", c #6A6A6A",
+"< c #7D7D67",
+"1 c #757575",
+"2 c #828223",
+"3 c #99992F",
+"4 c #939334",
+"5 c #BBBB3F",
+"6 c #A6A646",
+"7 c #BFBF46",
+"8 c #B1B156",
+"9 c #B2B25D",
+"0 c #B4B47B",
+"q c #C6C647",
+"w c #C6C649",
+"e c #C9C94A",
+"r c #D1D14D",
+"t c #C8C856",
+"y c #C8C859",
+"u c #C2C261",
+"i c #C9C967",
+"p c #CACA69",
+"a c #D0D06D",
+"s c #CBCB74",
+"d c #D3D371",
+"f c #828282",
+"g c #8E8E8E",
+"h c #939393",
+"j c #9C9C9C",
+"k c #A4A4A4",
+"l c gray67",
+"z c gray71",
+"x c #BABAB7",
+"c c #BBBBBB",
+"v c #C8C884",
+"b c #CECE8E",
+"n c #D0D08E",
+"m c #CFCF93",
+"M c #D4D493",
+"N c #D4D499",
+"B c #D1D1AD",
+"V c #D3D3BC",
+"C c #BDBDC1",
+"Z c #BCBCCA",
+"A c #C5C5C5",
+"S c #C7C7CC",
+"D c #CCCCCC",
+"F c #D3D3C6",
+"G c #D4D4CE",
+"H c #D5D5D4",
+"J c #D9D9D7",
+"K c #D5D5DA",
+"L c #DBDBDB",
+"P c #E2E2DF",
+"I c #D7D7E5",
+"U c #DADAE1",
+"Y c #D7D7E9",
+"T c #DDDDED",
+"R c #D7D7F6",
+"E c #D8D8FA",
+"W c #E3E3E3",
+"Q c #E9E9E9",
+"! c gray95",
+"~ c #F8F8F8",
+/* pixels */
+"HHHHHHHHJHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH",
+"HHHJHHHHDHHHHHHHHHDHHHHHHHHHHHHHHHHHDHHHHHDHHHHH",
+"HHJJUWUWWWWWUWWWWWWWWUWWWUWWWWLWWWWUWWUWWLWWHHHH",
+"HHJDkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjljjjjkHJHH",
+"HHPk+>;;;;;;;;;-;;;;;;;;;;;-;>;;;;;;;;o-;;;,DHHH",
+"HHWj>~WQWWWWQWQHWWQWWQWWWWLLWWWWWWQQQQ=HQWQWJHHJ",
+"HHUj;WDHLWLHHDHADHDHHDHHHHDAHHHHHHDHHH&AHHDHHHHH",
+"HHWj;WGLh&1HJHJAHHJHHHJHHJDDHHHHHHHHHH=ALHHHHJHH",
+"HHLj;WHLgjXgWHHAHJHHHHHHHJDDJHHHHHHJHJ&AKHJHKHHH",
+"HHWj;QHD!z$CLHHADJHJHHHHHJDDJHHHHHHHHH=AKHHHHHHH",
+"HHWj;WGLg fDHHHAHJHHHJHHHJDSKHHHHHHHHH&ALHHHJHHH",
+"HHWj;QDL,%&jWHHAHHHHHHHHHJDDJJHHHHHHJH&AKHHHHHJH",
+"HHUj;QHHWULLHHHDDHHHHJHHHHDDJHHHHHHHHH&ALHHHHHHH",
+"HDWj;WHHHHHHHHHAHHHHHHHHHHDAHHHHHHHHHH=ALHHHHJHH",
+"HHWj;QHHHJHHHHHDLLLULULPLLJHULKULWLLLU=AIIJKHHHH",
+"HHWj-JAAAAADDAD>&=========**==========O7wwqyHKHH",
+"HHWj;WDHHHDHHHL=kcccxcccxZ09Zccccccccc5BVVVVHHJH",
+"HHWj;WHHJULHHHL=CWLLWWLLLTNpTLLLKLLLLUeGKKKKHHHH",
+"HHWj;QDHAkALHHL=xLHHllHHHIviIGHHHHHHHHwFJHHHHHHK",
+"HHWj;WHU,%olLGL=cLLc;$=WGImiIHHHHHHHHHwFHHHJHHJH",
+"HDWj;QHHJWohUHL=cLHKk@;UHInpYHHHHHHHHHqFKHHHHHHH",
+"HHWj;WDJH&1WHHL=xLHLA-%LGIbpIHHHJHHJHJqFKHJHKHHH",
+"HDWj;QDW- =kLHL=cLLk-%&LHIbiIHJHHHHHHHqFKHHHHHJH",
+"HHWj;WHJxljcJHP=cLHDkkJJGInpIHHHHJHJHHqFHHHHHHHH",
+"HHWj;WHHLWWLHHL=xJHHPLHHGIbiIHHHHHGHHHqFHHHHHHHH",
+"HHWj;QHHHHHHHHL=ZTIIIKIIKRNdRKIIIIUIIUeHIIIIHHJH",
+"HHWj;LDDDDDDDDH&0MmbbbmbbN96NbbbmbbbbM3vmbmmHHHH",
+"HHUj-LADADDDDAH&8aipiiiiid64diiipiiiii2upiisHHHH",
+"HHLj;QHHHHHHJHW=ZTIIIIIIURNdEIIIIIYIIYrHTIIIHHHH",
+"HHWj;WHHLWWLHHL=xJGJPPLGGIbiUGHHHHHHHHqFHHHHJHJH",
+"HHWj>WDLh=>AHHU=xLLA;=jLHIniIHHHHJJHHHqFJHHHHHHH",
+"HHWj;WHLlf.jLHL=cLHAj%%UGInpIHHHHHHHHHqFJHHHHJHH",
+"HHUj;QHJU>+zLHL=cLDQk+,UHIbiIHHHJHHHHJwFJHHHHHHJ",
+"HHWj;WDHjkXfWGL=xLLzj,oLHIbiIHHHHHHHHJqFHHHJHHHH",
+"HHPj;QDLf&,DHHL=cLLz--kLHIbiYHHJHHHHHHqFKHHHKHHH",
+"HHWj;WHHWWWLHHL=cLHKWWLHHImpIHHHHHHJHHqFKHHHHHHH",
+"HHWj;WHHHHHHHHL=cLJHDHHHGUbiYHHHJHHHHJqFHHHHJHHH",
+"HHWj>WHHHHHHJHU=cLHJJHJHHInpIHHHHHHHHHqFKHJHHHHH",
+"HHLko=&&&&&=&&=+%==&&&=&*=#<HAAAAAAAAS:5wwqtHKHH",
+"HHWj-HAAAAAAAAAAAAASAAAAAHf,WHHDHHHHHHCDFFFFHHHJ",
+"HHWj;QHKLJLJJKLAHKKLJJKKJQg,QDHLWLHHJHSHKKKHHJHH",
+"HHWj;WHHHHHHHHJAHHHHHHHHHWg,QHJchCLHHHAHHJHHHHHH",
+"HDWj;QHHHHHHHHJAHHKHHHHHDWg,QDL,&XzLHHAHHHJHJHHK",
+"HHUk,WHHHHHHHHJAHJHHHHHJHWh1WHHKL@kUHHSHHHHHHHHH",
+"HHJHHHHHHJHHHJHHJHHHHHHJHJHHJHHKDDLHHHHHHHHHHHHH",
+"HHHHKHHHHKHHHHHHHHHHHHHHHHHHHHHHHLHHJHHHHHHJHHHK",
+"HHHHHHHHHHHHJHHHHHHHHHHKHHHHHHHJHHHHHHHHHHHKHHHJ",
+"HHHJHHJHHHHHHHHKKHHHHJHHHHHHHHHHHHHHKHHHHJHHHHHH"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/palisade-web.png b/icons/palisade-web.png
new file mode 100644 (file)
index 0000000..35e8e27
Binary files /dev/null and b/icons/palisade-web.png differ
diff --git a/icons/palisade.ico b/icons/palisade.ico
new file mode 100644 (file)
index 0000000..b6269ef
Binary files /dev/null and b/icons/palisade.ico differ
diff --git a/icons/palisade.rc b/icons/palisade.rc
new file mode 100644 (file)
index 0000000..62e613b
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "palisade.ico"
diff --git a/icons/pattern-16d24.png b/icons/pattern-16d24.png
new file mode 100644 (file)
index 0000000..1d6e463
Binary files /dev/null and b/icons/pattern-16d24.png differ
diff --git a/icons/pattern-16d4.png b/icons/pattern-16d4.png
new file mode 100644 (file)
index 0000000..8c96b62
Binary files /dev/null and b/icons/pattern-16d4.png differ
diff --git a/icons/pattern-16d8.png b/icons/pattern-16d8.png
new file mode 100644 (file)
index 0000000..1d6e463
Binary files /dev/null and b/icons/pattern-16d8.png differ
diff --git a/icons/pattern-32d24.png b/icons/pattern-32d24.png
new file mode 100644 (file)
index 0000000..71a2aae
Binary files /dev/null and b/icons/pattern-32d24.png differ
diff --git a/icons/pattern-32d4.png b/icons/pattern-32d4.png
new file mode 100644 (file)
index 0000000..52472f5
Binary files /dev/null and b/icons/pattern-32d4.png differ
diff --git a/icons/pattern-32d8.png b/icons/pattern-32d8.png
new file mode 100644 (file)
index 0000000..71a2aae
Binary files /dev/null and b/icons/pattern-32d8.png differ
diff --git a/icons/pattern-48d24.png b/icons/pattern-48d24.png
new file mode 100644 (file)
index 0000000..70b5d25
Binary files /dev/null and b/icons/pattern-48d24.png differ
diff --git a/icons/pattern-48d4.png b/icons/pattern-48d4.png
new file mode 100644 (file)
index 0000000..ab51779
Binary files /dev/null and b/icons/pattern-48d4.png differ
diff --git a/icons/pattern-48d8.png b/icons/pattern-48d8.png
new file mode 100644 (file)
index 0000000..70b5d25
Binary files /dev/null and b/icons/pattern-48d8.png differ
diff --git a/icons/pattern-base.png b/icons/pattern-base.png
new file mode 100644 (file)
index 0000000..afe2f78
Binary files /dev/null and b/icons/pattern-base.png differ
diff --git a/icons/pattern-ibase.png b/icons/pattern-ibase.png
new file mode 100644 (file)
index 0000000..7763ce4
Binary files /dev/null and b/icons/pattern-ibase.png differ
diff --git a/icons/pattern-ibase4.png b/icons/pattern-ibase4.png
new file mode 100644 (file)
index 0000000..ac8094d
Binary files /dev/null and b/icons/pattern-ibase4.png differ
diff --git a/icons/pattern-icon.c b/icons/pattern-icon.c
new file mode 100644 (file)
index 0000000..384a508
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"lXlXlXlXlXxXpXsXhXuXzXtXzXyXhXzX",
+"lXlXlXlXkXmX%X<XtX XxXW.bX].yXcX",
+"lXlXlXlXlXlXxXxXkXlXlXcXlXlXlXlX",
+"lXlXlXlXkXmXoX-XrX{.zX`.bX).wXvX",
+"lXlXlXkXkXcXlXxXcXhXMXgXMXjXvXzX",
+"lXlXlXnXcXiX;X>X:X,X=X;X=X=X<XlX",
+"lXlXzX XbXoX;.7.2.r.j   ;   z xX",
+"lXlXzX-XvX@Xw.f.i.v.z   =   k xX",
+"lXlXlX8XNX{.3 w t t 2 O , X n xX",
+"lXzXzX).bX[.  O +   #   %   j xX",
+"kXgXlXjXVX[.+ - q.Z.M   G v.M.hX",
+"iX|.nX_.nX[.  o eXUX`   =.UXvXsX",
+"kXgXlXjXNX}.p k (.rXY   E (.E.gX",
+"lXzXxX^.zX+Xw.g.4.r.f   &   j xX",
+"lXlXzX0XbX%Xr.g.d.n.J 2 s 6 P xX",
+"lXlXlXvXzXhXpXaXaXaXaXpXaXpXsXlX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"lXlXlXlXlXlXlXlXlXlXlXlXkXnXcXlXlXxXmXlXlXkXxXcXkXlXxXmXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXxX6XuXxXzXaX3XlXlXcXdXiXxXzXpX3XlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXjXZXl.l.AXzX8X;.aXzXBX:.v.AXxX6X;.dXxXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXkXbX~. XmXvX2Xm.lXlXvX(.{.mXvX<XM.zXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXvXnXkXlXcXmXkXlXlXNXmXkXlXcXmXkXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXkXmXvXkXlXkXvXzXlXkXxXzXlXlXkXnXzXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXjXNXW.`.NXzXrXB.fXlXmXW.1XnXcXwXx.hXzXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXkXNX2.k.ZXcX1X*.gXkXZXx.T.VXxX8X@.iXcXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXzXzXfXzXxXiX4XlXlXxX9XeXxXzXpXeXzXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXkXhXjXkXhXhXlXvXjXjXhXxXzXhXhXlXxXhXjXlXlX",
+"lXlXlXlXlXlXlXlXlXlXkXnXCXBXBXVXVXVXBXVXVXVXBXBXVXVXBXBXVXMXlXlX",
+"lXlXlXlXlXlXzXzXlXkXvX&XY.Q.W.W.W.W.W.W.Q.!.!.!.!.!.!.~.E..XxXkX",
+"lXlXlXlXlXzXgXgXzXhXVXk.X.1.>.-.%.,.;.4.E   O X $ - . #   U VXhX",
+"lXlXlXlXjXCXG.i.BXgXBXM.9.j.f.p.r.g.a.x.|   X   @ =   O   Y CXhX",
+"lXlXlXlXkXMX|.g.bXhXBXn.2.p.y.w.8.u.r.f.]   X   @ =   O   U CXhX",
+"lXlXlXlXlXlXjXxXzXjXBXm.w.z.k.d.u.l.g.n.X.  o   # -   +   Y CXhX",
+"lXlXlXlXlXkXMXmXkXjXCXl.f m v n M v v n l - ; - < 5 = , . ~ VXhX",
+"lXlXlXlXkXmXOX}.nXgXZXg.  X   + =   .   - o     + =   O   U CXhX",
+"lXlXlXlXjXCXJ.=.MXgXCXg.  O . # : X + X > o     @ -   @   Y CXhX",
+"lXlXlXlXkXcX0X*XxXhXZXg.  X   + =   .   - o     + =   O   U CXhX",
+"lXlXxXlXlXkXbXNXkXhXCXh.o - * ; a y u u i = * & : a y p 5 | NXjX",
+"lXkXsXlXlXzXsXfXzXhXCXg.  $ $   #XUXAXUXP.  & #   *XUXFXUXwXdXxX",
+"kXvXg.qXcXNX|.D.ZXfXZXg.  X X   &XUXGXUXU.  O .   ;XUXKXUXtXdXxX",
+"kXnXd.-XnXmXOXl.MXgXCXg.  O O   %XUXFXUXI.  O .   *XUXGXUXwXdXxX",
+"lXkXkXkXlXlXjXjXlXhXZXg.  X X   &XUXGXUXU.  @ o   ;XUXKXUXtXdXxX",
+"lXlXlXlXlXkXcXNXkXjXVXc.T ] ` ^ d.H.C.P.;.@ > - : T _ _ E 8.nXkX",
+"lXlXlXlXkXvXwX}.bXhXBXm.w.z.k.f.7.e.0.p.`   .   + =   O   U CXhX",
+"lXlXlXlXjXCXV.} BXgXBXn.3.a.u.e.q.s.i.k.}   O . # > o %   R VXhX",
+"lXlXlXlXlXzXaX1XzXjXBXv.3.a.i.e.8.i.t.g.]   X   + *   o   I CXhX",
+"lXlXlXlXlXlXxXnXlXjXNXA.9.f.s.i.r.s.p.j.%.w i y a h t p 5 X.BXjX",
+"lXlXlXlXlXlXlXkXlXlXlXhXsXsXsXsXsXsXsXsXfXjXjXjXjXjXjXjXjXjXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXzXxXxXxXxXxXxXxXxXxXzXzXzXzXzXzXzXzXzXlXlX"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXkXkXlXlXlXlXlXkXlXlXlXlXlXlXkXlXlXlXlXlXkXlXlXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXvXcXlXlXlXlXxXbXlXlXlXlXlXlXcXlXlXlXkXvXvXkXlXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXzXqXiXzXlXlXxXiX5XcXlXlXlXxXkXuXzXlXlXcXqXqXvXkXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXNXG.` zXlXkXvX9X@./.CXjXjXBXi.6.SXhXkXvX%X{ 1XmXkXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXkXbX(.P pXcXjXbX6X/ $XMXhXvXeXU / nXkXjXMX{._ tXcXkXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXxX~.~.zXlXjXmX%Xs.7XvXkXlXcX9X[.vXkXjXMX^.x.pXxXkXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXBXVXlXlXlXkXmXFXcXkXlXlXlXvXNXkXlXlXkXBXSXzXlXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXhXfXlXlXlXlXjXdXjXlXlXlXlXhXhXlXlXlXlXhXdXkXlXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXkXvXVXkXlXlXlXcXVXnXkXlXlXkXBXbXkXlXlXlXvXCXxXkXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXkXMX3Xl.nXkXkXbX<Xw.;XmXjXkXvXl..XNXjXjXmX.Xe.pXcXkXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXkXvX$.V fXxXkXzXfX$.).VXjXhXSXz.Z.DXhXkXvX6XD *XMXkXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX^.>.pXxXhXBX[.E 2XbXkXkXMXe.e.MXkXjXnX_.=.6XbXkXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXVXBXxXlXlXlXlXlXgXzXlXlXkXjXkXkXlXlXzXgXxXvXkXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXjXlXlXlXlXlXlXzXlXlXlXlXzXzXlXlXlXlXzXlXkXlXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXxXmXnXnXnXnXnXnXnXnXnXnXnXnXbXbXbXbXbXbXbXbXbXbXvXbXvXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXkXlXlXlXlXxXpX<X1X<X<X<X<X1X<X<X<X<X<X2X9X9X9X9X9X8X8X9X9X9X9X8XeXzXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXzXbXzXlXlXjXVXE.E O. ..... .[ .. ... .X._ c v v v c n B c v v n s -.BXjXlXlX",
+"lXlXlXlXlXlXlXlXlXzXgX7XdXzXlXjXCXT.@.l.a.s.d.a.7.d.s.s.a.k.-.          # ,   .   o   ( ZXhXlXlX",
+"lXlXlXlXlXlXlXlXhXCXQ.J 6XbXkXjXCXT.O.g.u.i.i.y.4.p.u.i.y.f.&.  . X X   $ <   X . +   ) ZXhXlXlX",
+"lXlXlXlXlXlXlXlXjXnX,X~ D.AXhXjXCXT.O.g.u.i.i.u.4.p.i.i.u.f.&.          # ,   .   o   ( ZXhXlXlX",
+"lXlXlXlXlXlXlXlXkXvX7XF.0XvXkXjXCXT.o.d.y.y.u.t.3.u.y.y.t.d.%.  . . .   # <   . . O   ) ZXhXlXlX",
+"lXlXlXlXlXlXlXlXlXkXvXZXvXkXlXjXCXY.%.v.g.h.j.g.0.k.h.h.g.c.:.          # ,   .   o   ( ZXhXlXlX",
+"lXlXlXlXlXlXlXlXlXlXjXdXkXlXlXjXVXW.Y | ] [ [ ] ` [ [ [ ] } ! 2 1 1 1 < 6 r , 2 1 4 @ | CXhXlXlX",
+"lXlXlXlXlXlXlXlXlXkXnXCXlXlXlXjXBX(.1   .     X 2       .   < & X O O X & 2 . O o #   _ ZXhXlXlX",
+"lXlXlXlXlXlXlXlXjXNXXX<.rXcXkXjXBX(.2   o . . o 3   X . X   < #         # ,   .   o   ( ZXhXlXlX",
+"lXlXlXlXlXlXlXlXjXNX.XK /.VXjXjXBX(.1   .     X 2       .   , #         # ,   .   o   ( ZXhXlXlX",
+"lXlXlXlXlXlXlXlXkXbX4X>._.BXjXjXBX(.2   X     X 2   . . .   < #   . .   # <   . . O   ) ZXhXlXlX",
+"lXlXlXlXlXlXlXlXlXzXhXkXmXkXlXjXBX(.1   .     X 2       .   , #         # ,   .   o   ( ZXhXlXlX",
+"lXlXlXlXkXkXlXlXlXlXlXjXkXlXlXjXBX/.8 $ = * & - 6 . o o o   2 , % * * % , 2   o o @   _ ZXhXlXlX",
+"lXlXlXkXMXnXkXlXlXkXcXNXlXlXlXjXBX/.0 = : ; , . r.kX0XeXqXgXI.# > ; ; > # I.gXqXeXeXtX|.hXzXlXlX",
+"lXlXkXvX&X<XvXkXkXcXeXXXkXlXlXjXBX(.1   .   O   z.UXKXUXLXUXoX  X     X   oXUXLXUXIXUX,XdXzXlXlX",
+"lXlXjXCXF.y.FXhXkXcXrX..aXcXlXjXBX(.2   X . O   l.UXHXPXJXUXXX  X . . X   XXUXJXPXLXUX>XdXzXlXlX",
+"lXlXjXCXP.| nXkXkXxXpXW #XmXkXjXBX(.1   .   O   z.UXKXUXLXUXoX  X     X   oXUXLXUXIXUX,XdXzXlXlX",
+"lXlXkXcX*X'.gXzXkXcXrX^.6XvXkXjXBX(.2   o X @   z.UXHXPXJXUXXX  X     X   .XUXGXKXJXUX:XfXzXlXlX",
+"lXlXlXkXmXVXzXlXlXkXcXCXbXkXlXjXBX(.1   .   O   z.UXKXUXLXUXoX  o . . o   oXUXLXUXIXUX,XdXzXlXlX",
+"lXlXlXlXkXjXlXlXlXlXkXgXkXlXlXjXVXQ.D R U U T H 2.U.F.H.F.U.r., 3 2 2 2 2 } ,.-.-.:.#.s.bXkXlXlX",
+"lXlXlXlXlXlXlXlXlXlXzXnXlXlXlXjXCXY.%.b.j.k.k.j.3.0.0.0.9.t.+.          # ,   .   o   ( ZXhXlXlX",
+"lXlXlXlXlXlXlXlXlXlXxX:.*XMXkXjXCXT.o.d.t.y.y.t.5.s.p.a.p.h.=.          # 2 . O O #   _ ZXhXlXlX",
+"lXlXlXlXlXlXlXlXhXVXU.e K.ZXhXjXCXT.O.g.u.i.i.u.4.p.i.i.u.f.&.          # ,   .   o   ( ZXhXlXlX",
+"lXlXlXlXlXlXlXlXlXzXsXC.oXMXkXjXCXT.+.g.u.i.i.u.5.p.i.i.u.f.*.  X X X   $ 1   X X +   ) ZXhXlXlX",
+"lXlXlXlXlXlXlXlXlXlXcXZXnXkXlXhXCXY.o.h.u.i.p.u.4.p.i.i.u.g.&.          # ,   .   o   ( ZXhXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXhXkXlXlXjXVX!.@.p.e.r.r.e.4.t.r.r.e.i.-.w e e e q u h 0 e e t < #.VXjXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXzXgXyXtXyXyXyXyXyXtXyXyXyXtXuXdXdXdXdXdXdXsXdXdXdXdXdXfXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXzXcXcXcXcXcXcXcXcXcXcXcXcXcXxXxXxXxXxXxXxXxXxXxXxXxXxXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/pattern-web.png b/icons/pattern-web.png
new file mode 100644 (file)
index 0000000..c957409
Binary files /dev/null and b/icons/pattern-web.png differ
diff --git a/icons/pattern.ico b/icons/pattern.ico
new file mode 100644 (file)
index 0000000..568dcf7
Binary files /dev/null and b/icons/pattern.ico differ
diff --git a/icons/pattern.rc b/icons/pattern.rc
new file mode 100644 (file)
index 0000000..965dbd8
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "pattern.ico"
diff --git a/icons/pearl-16d24.png b/icons/pearl-16d24.png
new file mode 100644 (file)
index 0000000..f99ad2b
Binary files /dev/null and b/icons/pearl-16d24.png differ
diff --git a/icons/pearl-16d4.png b/icons/pearl-16d4.png
new file mode 100644 (file)
index 0000000..97da5db
Binary files /dev/null and b/icons/pearl-16d4.png differ
diff --git a/icons/pearl-16d8.png b/icons/pearl-16d8.png
new file mode 100644 (file)
index 0000000..f99ad2b
Binary files /dev/null and b/icons/pearl-16d8.png differ
diff --git a/icons/pearl-32d24.png b/icons/pearl-32d24.png
new file mode 100644 (file)
index 0000000..f96b218
Binary files /dev/null and b/icons/pearl-32d24.png differ
diff --git a/icons/pearl-32d4.png b/icons/pearl-32d4.png
new file mode 100644 (file)
index 0000000..94b19e1
Binary files /dev/null and b/icons/pearl-32d4.png differ
diff --git a/icons/pearl-32d8.png b/icons/pearl-32d8.png
new file mode 100644 (file)
index 0000000..f96b218
Binary files /dev/null and b/icons/pearl-32d8.png differ
diff --git a/icons/pearl-48d24.png b/icons/pearl-48d24.png
new file mode 100644 (file)
index 0000000..249a7f1
Binary files /dev/null and b/icons/pearl-48d24.png differ
diff --git a/icons/pearl-48d4.png b/icons/pearl-48d4.png
new file mode 100644 (file)
index 0000000..063b998
Binary files /dev/null and b/icons/pearl-48d4.png differ
diff --git a/icons/pearl-48d8.png b/icons/pearl-48d8.png
new file mode 100644 (file)
index 0000000..249a7f1
Binary files /dev/null and b/icons/pearl-48d8.png differ
diff --git a/icons/pearl-base.png b/icons/pearl-base.png
new file mode 100644 (file)
index 0000000..9502aed
Binary files /dev/null and b/icons/pearl-base.png differ
diff --git a/icons/pearl-ibase.png b/icons/pearl-ibase.png
new file mode 100644 (file)
index 0000000..9f8dd60
Binary files /dev/null and b/icons/pearl-ibase.png differ
diff --git a/icons/pearl-ibase4.png b/icons/pearl-ibase4.png
new file mode 100644 (file)
index 0000000..d32a0ac
Binary files /dev/null and b/icons/pearl-ibase4.png differ
diff --git a/icons/pearl-icon.c b/icons/pearl-icon.c
new file mode 100644 (file)
index 0000000..d238f3f
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"&.2.8.q.6.5.7.5.4.4.2.4.4.7.6.*.",
+":.rXtX;XtX%X4XuXjXfX9XkXdXeX=X;.",
+"O.>.C % ^.3XeXL.:.;.#.>.9.1X2X-.",
+" .K 8   F.3XsX^ 3 Y A F @ [.6X=.",
+"=.xXB.i hX$XjXY 5.FX0XhXq `.7X=.",
+"*.*Xd.p 5X'.9XJ X.6X'.+X3 I.%X=.",
+"*.wXn.a dX%XaX .8.sX=X7X5 _.7X=.",
+"*.wXn.a dX>XoXmXdX$X1X6X5 _.7X=.",
+"*.rXm.s gX:X<X}.|.4X,X8X6 '.8X=.",
+"*.7Xx.p tXXXaXJ #.sX@X1X8 ^.1X=.",
+"*.,Xg.s tXoXiXI +.qX X-X4 R.=X=.",
+"*.rXN.r -XW.>XZ ;.zX;X,Xe.XX4X-.",
+"*.7XJ.@ 5 1 6 o e.sX%X+XIX>X$X>.",
+";.4XuX3X5X+X1X4XwXrX3X4X#.XX9X-.",
+"-.`.@X@X$X'.+X#X+X X_..X4 G..X=.",
+"&.#.@.+.+.@.@.+.@.#.#.@.&.#.#.&."
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"&.&.+.O.+.+.+.+.+.+.+.@.O.+.+.+.+.+.+.O.@.+.+.+.+.+.+.+.O.+.&.&.",
+"&.&.q.t.r.r.e.r.r.r.e.8.t.r.r.r.r.r.r.t.8.e.r.r.r.r.r.r.t.q.&.&.",
+"&.&.>XiXwXtXsXtXeXyX8X XiXrXrXrXrXrXeXiX X8XyXrXrXrXrXrXiX,X&.&.",
+"&.&.;XeXuXqXoXwXyXqX5X{.rX0X0XqXqXqX0XrX{.4XwX0XqXqX0X0XrX-X&.&.",
+"&.&.-XsX Xj . z @XiX3X{.tX0XqXwXwXwXqXyX}.6XrXwXwXwXqX0XtX;X&.&.",
+";.` q s 1   o   ^ hX2X{.eXpX(.9 u u u i w y u u u 6 T.aXwX;X&.&.",
+":.(   .   . o   Z fX3X{.wXaXE.  .               X   G.dXwX;X&.&.",
+"*.+.N.^.0..     N.fX2X{.wXaXW.  5 L.P.Y.k.G.I.U.e   J.dXwX;X&.&.",
+"%.*.6XfXbX'   | zX8X4X{.wXaXW.  w pXdXhX@XtXfXhXd   H.sXqX-X&.&.",
+"&.&.:XeXzX$.  =.cXeX9X XuXhX^.  q qXeXyX}.6XrXyXs   P.kXuX<X&.&.",
+"&.&.{.%X5X'   } 6X#XOXE.&X<XS.  8 #X&X=XE.OX&X=Xu   b.2X&X{.&.&.",
+"&.&.].#X3X'   } 4X@XoXR.%X>XZ.  0 +X$X&XR.oX%X&Xu   v.<X$X].&.&.",
+"&.&.<XyXcX@.  &.vXrX9X.XuXhX'.  e iXtXpX.X9XuXpXs   P.kXuX<X&.&.",
+"&.&.-X0XhXo.  #.jX8X4X{.wXiXn.' { [.yXwX{.4XqXeXa   H.sXqX-X&.&.",
+"&.&.;XqXjXO.  $.kX9X5X[.dX).oXUXPXP.:XiX{.5XwXrXs   J.dXwX;X&.&.",
+"&.&.;XqXjXO.  $.kX9X5X[.dXH.cXKXUX-X).fX[.5XwXrXs   J.dXwX;X&.&.",
+"&.&.;XqXjXO.  $.kX9X5X[.dX^.%XUXUXT.*XpX{.5XwXrXs   J.dXwX;X&.&.",
+"&.&.;XqXjXO.  $.kX9X5X{.rXyXb.1.:.).uXeX{.5XwXrXs   J.dXwX;X&.&.",
+"&.&.:XwXkXO.  $.lX0X6X}.eXdX).  w tXqXtX}.6XeXtXs   J.fXeX:X&.&.",
+"&.&.&X7XdXX.  @.fX5X1X'.8XyXY.  e 4X7X0X'.1X8X0Xa   F.iX8X&X&.&.",
+"&.&.!.[.%X/   ` &X'._.J.{.OXv.  6 '.{.|.J._.{.}.t   f.@X{.!.&.&.",
+"&.&.>XrXzX+.  $.lX0X6X}.eXsXQ.  q wXrXuX|.7XtXiXf   I.gXtX>X&.&.",
+"&.&.-X0XhXO.  *.mXuXwXOXaXlX(.  0 8X0XrX{.3XrX7Xj O B.gXqX-X&.&.",
+"&.&.;XqXjXO.  ` #X_./.Z.].XXc.  q 9XqXrX{.5XrXS.wXDXP.+XaX-X&.&.",
+"&.&.;XqXjX .  O             .   9 9XqXrX[.wXXXoXUXUXvXJ.dX=X&.&.",
+"&.&.;XqXhX*.O 4 1 1 < > 1 1 2 - h 9XqXrX{.qX@X[.UXUXgXL.dX=X&.&.",
+"&.&.;XtXqX6X2X3X2X4X:X(.6X2X3X2X3XqX0XtX{.4XuXK.].6XB.>XiX-X&.&.",
+"&.&.=XeX8XqXwXwXwXeX6X}.tXqXwXwXqX9X8XeX[.3XqXrXi   G.fX0X=X&.&.",
+"&.&.3XfXiXpXiXiXiXaXwXXXdXuXiXiXiXpXiXfXoXwXaXdXf   Y.xXaX3X&.&.",
+"&.&.J.!.E.E.E.E.E.W.Y.V.!.E.E.E.E.E.E.!.V.U.W.Q.g . u.).W.J.&.&.",
+"&.&.o.X.X.X.X.X.X.X.X.O.X.X.X.X.X.X.X.X.O.X.X.X.$.&.O.X.X.o.&.&.",
+"&.&.=.=.=.=.=.=.=.=.=.*.=.=.=.=.=.=.=.=.*.=.=.=.*.&.=.=.=.=.&.&."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.",
+"&.&.&.&.*.*.*.*.*.*.*.*.*.*.*.*.*.&.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.&.&.&.&.",
+"&.&.&.&.$.@.@.@.@.@.@.@.@.@.@.@.@.$.@.@.@.@.@.@.@.@.@.@.@.@.#.#.@.@.@.@.@.@.@.@.@.@.@.@.&.&.&.&.",
+"&.&.&.%.2.8.6.7.7.7.7.7.7.7.7.7.7.<.7.7.7.7.7.7.7.7.7.7.6.8.2.4.7.7.7.7.7.7.7.7.7.7.7.7.=.&.&.&.",
+"&.&.=.X.`.iX9XqXqX0X0X0XqXqXqXqXwXT.qXqXqXqXqXqXqXqXqXqX0XiX].+XuX0XqXqXqXqXqXqXqXqXqXqX7.@.*.&.",
+"&.&.=.X.`.iX0XqX9XeXiXrX9XqXqXqXwXT.qXqXqXqXqXqXqXqXqXqX0XiX].+XuX0XqXqXqXqXqXqXqXqXqXqX7.@.*.&.",
+"&.&.=.X.(.tX6X7XsX7XoX1XdX0XqXqXqXT.0XqXqXqX9X7X8X8X8X8X6XrX_.XXeX7X8X8X8X7X8XqXqXqXqXqX7.@.*.&.",
+"&.&.=.o.+XbXfXxXN.t o 4 w.uX0XqXwXT.0XqXqX0XpXkXhXjXjXjXgXbX#X<XvXhXjXjXjXjXgXqXqXqXqXqX7.@.*.&.",
+"&.&.=. .5.v.v.q.$   . .   l.dX8XwXT.0XqX0XuX).f.x.z.z.z.l.b.6.e.v.l.z.z.z.k.N.0XqXqXqXqX7.@.*.&.",
+"&.%.-.{         X X   O   m iX0XqXT.0XqX7XlX=.  O                       .   6 8XwX0XqXqX7.@.*.&.",
+"&.%.-.{         X     X   d yX0XqXT.0XqX7XlX-.  $ X                     +   9 8XwX0XqXqX7.@.*.&.",
+"&.&.-.} V I U N       o   *.fX8XqXT.0XqX7XlX=.    t R K L U C S I L U A .   6 8XwX0XqXqX7.@.*.&.",
+"&.&.=.o.+XbXgXfX]   o   C 4XrX0XwXT.0XqX7XlX=.    1.DXsXgXbX#X<XcXfXbX-X.   6 8XwX0XqXqX7.@.*.&.",
+"&.&.=.X.).tX5XwXrX4     +XsX8XqXwXT.0XqX7XlX=.    &.hX4X6XtX_.XXeX5XtX}..   6 8XwX0XqXqX7.@.*.&.",
+"&.&.=.o.`.uX8X0X6X7   X |.yX9X0XqXY.0X0X6XkX*.    *.kX6X9XuX'.OXyX8XuX X.   6 8XqX9X0X0X7.@.*.&.",
+"&.&.=.X.{.gXrXiXrX7   . +XgXtXuXuXW.yXuXeXnX;.    ;.nXeXtXgX|.%XfXrXgX@X.   7 rXiXyXuXuX7.@.*.&.",
+"&.&.*.O.P.*XoX@XoX3   . Y.*XOX+X+XZ.+X+XXX2X .     .2XXXOX*XI.!.%XoX*XY..   3 oX@XOX+X+X3.#.*.&.",
+"&.&.*.+.D. X`.[.`.2   . F..X`.].].m.'.].).%X]     ] %X).'. XF.I.|.`..XF..   2 `.[.'.].].2.#.*.&.",
+"&.&.=.X.}.jXyXpXtX7   . #XhXyXiXpXQ.uXiXrXmX:.    :.mXrXuXhX X*XgXtXhX#X.   7 tXpXuXiXiX8.@.*.&.",
+"&.&.=.o._.uX8XqX7X6   .  XuX8X9X0XY.9X0X5XlX>.    >.lX5X8XuX'.OXtX7XuX X.   6 7XqX9X0X0X6.@.*.&.",
+"&.&.=.X.`.iX9XwX8X6   . .XiX9XqXwXT.0XqX0XdX` l l ` fX0X9XiX].+XuX9XiX.X.   6 8XwX0XqXqX7.@.*.&.",
+"&.&.=.X.`.iX9XwX8X6   . .XiX9XqXwXT.0X0XuXd.[.UXUX[.f.iX9XiX].+XuX9XiX.X.   6 8XwX0XqXqX7.@.*.&.",
+"&.&.=.X.`.iX9XwX8X6   . .XiX9XqXwXT.9XpX_.D.UXLXLXUXS._.iXuX].+XuX9XiX.X.   6 8XwX0XqXqX7.@.*.&.",
+"&.&.=.X.`.iX9XwX8X6   . .XiX9XqXwXT.8XgXS.&XUXLXLXUX&XS.fXyX].+XuX9XiX.X.   6 8XwX0XqXqX7.@.*.&.",
+"&.&.=.X.`.iX9XwX8X6   . .XiX9XqXwXT.9XaX~.P.UXJXJXUXL.~.pXuX].+XuX9XiX.X.   6 8XwX0XqXqX7.@.*.&.",
+"&.&.=.X.`.iX9XwX8X6   . .XiX9XqXwXT.0XqXrXt.<XUXUX,Xt.rX9XiX].+XuX9XiX.X.   6 8XwX0XqXqX7.@.*.&.",
+"&.&.=.X.`.iX9XwX8X6   . .XiX9XqXwXT.0X0XwXrX' ! ! ' rXwX9XiX].+XuX9XiX.X.   6 8XwX0XqXqX7.@.*.&.",
+"&.&.=.X.`.iX9XwX8X6   . .XiX9XqXwXT.0XqX6XcX<.    <.cX6X0XiX].+XuX9XiX.X.   6 8XwX0XqXqX7.@.*.&.",
+"&.&.=.X.`.iX9XwX9X6   . .XiX0XqXwXT.qXqX7XkX*.    *.kX7X0XiX].+XuX9XiX.X.   6 9XwXqXqXqX7.@.*.&.",
+"&.&.=.o.`.iX8XqX8X6   .  XuX9X0XqXT.0XqX7XkX*.    *.kX7X9XuX'.+XyX8XuX X.   6 8XqX0XqXqX7.@.*.&.",
+"&.&.*.@.m.Q.Y.R.U.1   . b.!.Y.T.T.l.T.T.I.'.^     ^ '.I.Y.Q.m.Z.W.U.!.b..   1 U.R.Y.T.T.<.$.&.&.",
+"&.&.=.X.'.pX9XeX9X6   . .XpX0XqXwXT.qXwX8XzX=.    =.zX8X0XpX].+XuX9XpX.X.   6 9XeXqXwXwX7.@.*.&.",
+"&.&.=.X.`.iX9XwX8X6   . .XiX9XqXqXT.0XqX7XlX*.    *.lX7X9XiX].+XyX9XuX.Xo   9 8XqX0XqXqX7.@.*.&.",
+"&.&.=.X.`.iX9XwX8X6   . {.rX6X7X8XI.7X7X3XgX&.    =.lX7X0XiX].+XuX8XsXOX    5 eXeX0XqXqX7.@.*.&.",
+"&.&.=.X.`.iX9XwX8X6   . >XMXjXlXzX'.kXlXgXGX2.    =.lX7X0XiX].+XyXeX4X9.Y.wXM.s.rXqXqXqX7.@.*.&.",
+"&.&.=.X.`.iX9XwX8X6   . ` %.+.@.@.W +.@.O.-.z     =.lX7X0XiX].+XtXiXg.<XUXKXUX/.A.sX9XqX7.@.*.&.",
+"&.&.=.X.`.iX9XwX8X9   + .                   X $   ;.lX7X0XiX].+XpX<Xl.UXKXLXUXCXd.tX0XqX7.@.*.&.",
+"&.&.=.X.`.iX9XwX8X6   .                       O   =.lX7X0XiX].+XpX<Xj.UXKXKXUXNXd.tX0XqX7.@.*.&.",
+"&.&.=.X.`.iX9XqX0Xq.:.<.,.,.,.,.<.` ,.<.,.,.,.1.%.L.pX9X0XiX].+XtXpXk.*XUXKXUXR.F.sX9XqX7.@.*.&.",
+"&.&.=.X.`.iX9XqXqXjXlXlXlXlXlXlXlX'.kXlXlXlXlXlXzXaX0XqX0XiX].+XyXwX7X0.C.<Xf.h.yXqXqXqX7.@.*.&.",
+"&.&.=.X.`.iX9XqXqX8X7X7X7X7X7X7X8XI.7X7X7X7X7X7X7X9XqXqX0XiX].+XuX8XaX@X    6 tXeX0XqXqX7.@.*.&.",
+"&.&.=.o._.uX8X9X9X9X9X9X9X9X9X9X0XY.9X0X9X9X9X9X9X9X9X9X8XyX'.OXtX7XyX|.O   9 6X0X9X0X9X6.@.*.&.",
+"&.&.=.X.}.jXuXiXiXiXiXiXiXiXiXiXpXQ.iXiXiXiXiXiXiXiXiXiXuXjX X*XgXyXhX#X.   7 yXpXiXiXiX8.@.*.&.",
+"&.&.*.+.S.}._.`.`.`.`.`.`.`.`.`.'.m.`.`.`.`.`.`.`.`.`.`._.}.D.P.{.).|.D..   2 ).'.`.`.`.2.$.*.&.",
+"&.&.&.*.+.X.o.X.X.X.X.X.X.X.X.X.X.@.o.X.X.X.X.X.X.X.X.X.o.X.+.O.X.X.o.X.{ [ { X.o.X.X.X.%.&.&.&.",
+"&.&.&.&.*.=.=.=.=.=.=.=.=.=.=.=.=.*.=.=.=.=.=.=.=.=.=.=.=.=.*.*.=.=.=.=.-.-.-.=.=.=.=.=.&.&.&.&.",
+"&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.%.%.%.&.&.&.&.&.&.&.&.&.",
+"&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/pearl-web.png b/icons/pearl-web.png
new file mode 100644 (file)
index 0000000..df8f8d1
Binary files /dev/null and b/icons/pearl-web.png differ
diff --git a/icons/pearl.ico b/icons/pearl.ico
new file mode 100644 (file)
index 0000000..642695b
Binary files /dev/null and b/icons/pearl.ico differ
diff --git a/icons/pearl.rc b/icons/pearl.rc
new file mode 100644 (file)
index 0000000..8b7eca9
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "pearl.ico"
diff --git a/icons/pegs-16d24.png b/icons/pegs-16d24.png
new file mode 100644 (file)
index 0000000..0151991
Binary files /dev/null and b/icons/pegs-16d24.png differ
diff --git a/icons/pegs-16d4.png b/icons/pegs-16d4.png
new file mode 100644 (file)
index 0000000..397c712
Binary files /dev/null and b/icons/pegs-16d4.png differ
diff --git a/icons/pegs-16d8.png b/icons/pegs-16d8.png
new file mode 100644 (file)
index 0000000..13845b1
Binary files /dev/null and b/icons/pegs-16d8.png differ
diff --git a/icons/pegs-32d24.png b/icons/pegs-32d24.png
new file mode 100644 (file)
index 0000000..1f63698
Binary files /dev/null and b/icons/pegs-32d24.png differ
diff --git a/icons/pegs-32d4.png b/icons/pegs-32d4.png
new file mode 100644 (file)
index 0000000..cbfc0ef
Binary files /dev/null and b/icons/pegs-32d4.png differ
diff --git a/icons/pegs-32d8.png b/icons/pegs-32d8.png
new file mode 100644 (file)
index 0000000..841d5d2
Binary files /dev/null and b/icons/pegs-32d8.png differ
diff --git a/icons/pegs-48d24.png b/icons/pegs-48d24.png
new file mode 100644 (file)
index 0000000..8fcae14
Binary files /dev/null and b/icons/pegs-48d24.png differ
diff --git a/icons/pegs-48d4.png b/icons/pegs-48d4.png
new file mode 100644 (file)
index 0000000..51b3433
Binary files /dev/null and b/icons/pegs-48d4.png differ
diff --git a/icons/pegs-48d8.png b/icons/pegs-48d8.png
new file mode 100644 (file)
index 0000000..f320782
Binary files /dev/null and b/icons/pegs-48d8.png differ
diff --git a/icons/pegs-base.png b/icons/pegs-base.png
new file mode 100644 (file)
index 0000000..0b28a99
Binary files /dev/null and b/icons/pegs-base.png differ
diff --git a/icons/pegs-ibase.png b/icons/pegs-ibase.png
new file mode 100644 (file)
index 0000000..78e009d
Binary files /dev/null and b/icons/pegs-ibase.png differ
diff --git a/icons/pegs-ibase4.png b/icons/pegs-ibase4.png
new file mode 100644 (file)
index 0000000..9d0e317
Binary files /dev/null and b/icons/pegs-ibase4.png differ
diff --git a/icons/pegs-icon.c b/icons/pegs-icon.c
new file mode 100644 (file)
index 0000000..de73396
--- /dev/null
@@ -0,0 +1,656 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 225 2 ",
+"   c gray84",
+".  c #DADADA",
+"X  c gray86",
+"o  c #DADADA",
+"O  c #D9D9DA",
+"+  c #E3E3D8",
+"@  c #E5E5D8",
+"#  c #D8D8D9",
+"$  c #D5D5D5",
+"%  c #D5D5D5",
+"&  c #D5D5D5",
+"*  c #D5D5D5",
+"=  c #D5D5D5",
+"-  c gray86",
+";  c #DBDBDA",
+":  c #DADADC",
+">  c #E1E1DA",
+",  c #B5B5E2",
+"<  c #B0B0E5",
+"1  c #DADAD2",
+"2  c #D0D0D1",
+"3  c gray84",
+"4  c #D5D5D5",
+"5  c #D7D7D7",
+"6  c #CBCBCB",
+"7  c #A6A6A8",
+"8  c #CBCBC4",
+"9  c #BEBEDB",
+"0  c #0808FC",
+"q  c blue",
+"w  c #A4A4D5",
+"e  c #DADACF",
+"r  c #D4D4D6",
+"t  c #D5D5D5",
+"y  c #D7D7D7",
+"u  c gray81",
+"i  c #B1B1B2",
+"p  c #CECEC9",
+"a  c #C9C9DA",
+"s  c #1D1DF8",
+"d  c #1111FD",
+"f  c #B4B4D4",
+"g  c #D7D7D0",
+"h  c #D4D4D6",
+"j  c #D5D5D5",
+"k  c #D5D5D5",
+"l  c #D7D7D7",
+"z  c gray86",
+"x  c #D6D6D8",
+"c  c #DADAD3",
+"v  c #CDCDD9",
+"b  c #CBCBDC",
+"n  c #D5D5CD",
+"m  c #D0D0D1",
+"M  c gray84",
+"N  c #D5D5D5",
+"B  c gray84",
+"V  c #D2D2D2",
+"C  c #C0C0C0",
+"Z  c gray81",
+"A  c #D6D6D8",
+"S  c #C9C9C6",
+"D  c #CACAC6",
+"F  c #CECED0",
+"G  c gray82",
+"H  c gray84",
+"J  c #D5D5D5",
+"K  c #D5D5D5",
+"L  c #D5D5D5",
+"P  c #D5D5D5",
+"I  c #D5D5D5",
+"U  c #D5D5D5",
+"Y  c #D8D8D7",
+"T  c #CACACB",
+"R  c #9E9EA2",
+"E  c #C2C2C3",
+"W  c #DBDBDA",
+"Q  c #ACACB0",
+"!  c #AAAAAE",
+"~  c #CFCFCE",
+"^  c #CFCFD0",
+"/  c #D2D2D5",
+"(  c #D3D3D4",
+")  c gray83",
+"_  c #D1D1D4",
+"`  c #D1D1D4",
+"'  c gray83",
+"]  c #D5D5D5",
+"[  c #D5D5D5",
+"{  c #D7D7D4",
+"}  c #DBDBCA",
+"|  c #D7D7D2",
+" . c #D4D4D7",
+".. c #D9D9CE",
+"X. c #DBDBCE",
+"o. c #CFCFD1",
+"O. c #D9D9D6",
+"+. c #E9E9D9",
+"@. c #DEDEDA",
+"#. c #D9D9DB",
+"$. c #E5E5D8",
+"%. c #E5E5D9",
+"&. c #D7D7D9",
+"*. c #D5D5D4",
+"=. c #D7D7D4",
+"-. c #CECED6",
+";. c #8F8FE5",
+":. c #C3C3D9",
+">. c #E0E0D3",
+",. c #A7A7E0",
+"<. c #9F9FE1",
+"1. c #DEDED4",
+"2. c #CFCFDC",
+"3. c #9292E9",
+"4. c #CCCCDD",
+"5. c #E4E4D8",
+"6. c #A6A6E4",
+"7. c #A9A9E6",
+"8. c #D8D8D1",
+"9. c #D0D0D1",
+"0. c #E5E5D2",
+"q. c #6464EB",
+"w. c #4949F1",
+"e. c #C5C5D8",
+"r. c #0505FE",
+"t. c #B8B8DB",
+"y. c #6060EB",
+"u. c #5454ED",
+"i. c #BEBED8",
+"p. c blue",
+"a. c #0101FF",
+"s. c #ABABD3",
+"d. c #D9D9D0",
+"f. c #E2E2D2",
+"g. c #8383E5",
+"h. c #6868EA",
+"j. c #D3D3D5",
+"k. c #2323F8",
+"l. c #1515FB",
+"z. c #C8C8D8",
+"x. c #7F7FE6",
+"c. c #7575E8",
+"v. c #CECED7",
+"b. c #1C1CF9",
+"n. c #1F1FFB",
+"m. c #BCBCD2",
+"M. c #D6D6D0",
+"N. c #D4D4D5",
+"B. c #E2E2D2",
+"V. c #CACAD7",
+"C. c #DFDFD3",
+"Z. c #DEDED3",
+"A. c #D6D6D5",
+"S. c #D2D2D6",
+"D. c #E0E0D3",
+"F. c #D9D9D5",
+"G. c #CACADB",
+"H. c #D9D9D5",
+"J. c #DFDFD3",
+"K. c #D4D4D5",
+"L. c #D5D5D6",
+"P. c #D7D7CC",
+"I. c #CFCFD2",
+"U. c #DFDFD3",
+"Y. c #9898E1",
+"T. c #1B1BFA",
+"R. c #7F7FE6",
+"E. c #D8D8D4",
+"W. c #4242F2",
+"Q. c #3737F4",
+"!. c #C7C7D9",
+"~. c #D3D3D0",
+"^. c #BFBFBD",
+"/. c #D1D1CF",
+"(. c #CBCBD8",
+"). c #3D3DF2",
+"_. c #3E3EF4",
+"`. c #C4C4D0",
+"'. c #D4D4D1",
+"]. c #E5E5D2",
+"[. c #5F5FEC",
+"{. c #4545F1",
+"}. c #C0C0D9",
+"|. c #0202FF",
+" X c #A8A8E1",
+".X c #D2D2C6",
+"XX c #9D9DA3",
+"oX c #CECEC4",
+"OX c #B2B2DF",
+"+X c #0000FE",
+"@X c #A8A8D5",
+"#X c #DADACF",
+"$X c #D9D9D4",
+"%X c #C2C2D9",
+"&X c #6B6BEA",
+"*X c #B2B2DC",
+"=X c #E0E0D3",
+"-X c #8A8AE4",
+";X c #8282E5",
+":X c #D8D8D5",
+">X c #D5D5D5",
+",X c #CECECF",
+"<X c #D4D4D5",
+"1X c #D9D9D4",
+"2X c #8686E4",
+"3X c #8787E6",
+"4X c #D3D3CE",
+"5X c #D1D1D2",
+"6X c #D4D4D5",
+"7X c #D9D9D4",
+"8X c #E7E7D1",
+"9X c #DCDCD4",
+"0X c #D4D4D5",
+"qX c #E3E3D2",
+"wX c #E4E4D2",
+"eX c #D5D5D5",
+"rX c #D5D5D5",
+"tX c #D7D7D7",
+"yX c #D5D5D5",
+"uX c #D5D5D5",
+"iX c #E3E3D2",
+"pX c #E3E3D2",
+"aX c #D5D5D5",
+"sX c #D5D5D5",
+"dX c white",
+/* pixels */
+"  . X o O + @ # $ % & * * * * * ",
+"= - ; : > , < 1 2 3 4 * * * * * ",
+"5 6 7 8 9 0 q w e r t * * * * * ",
+"y u i p a s d f g h j * * * * * ",
+"k l z x c v b n m M N * * * * * ",
+"B V C Z A S D F G H J K L P I U ",
+"Y T R E W Q ! ~ ^ / ( ) _ ` ' ] ",
+"[ { } |  ...X.o.O.+.@.#.$.%.&.*.",
+"=.-.;.:.>.,.<.1.2.3.4.5.6.7.8.9.",
+"0.q.q w.e.r.q t.y.q u.i.p.a.s.d.",
+"f.g.q h.j.k.l.z.x.q c.v.b.n.m.M.",
+"N.B.V.C.Z.A.S.D.F.G.H.J.K.L.P.I.",
+"U.Y.T.R.E.W.Q.!.~.^./.(.)._.`.'.",
+"].[.q {.}.|.q  X.XXXoXOX+Xq @X#X",
+"$X%X&X*X=X-X;X:X>X,X<X1X2X3X4X5X",
+"6X7X8X9X0XqXwXeXrXtXyXuXiXpXaXsX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 54 1 ",
+"  c #0202FF",
+". c #0A0AFD",
+"X c #1313FC",
+"o c #1B1BFA",
+"O c #2323F9",
+"+ c #3434F5",
+"@ c #3D3DF2",
+"# c #4343EF",
+"$ c #4F4FEF",
+"% c #5454ED",
+"& c #5C5CEC",
+"* c #4141F1",
+"= c #4B4BF1",
+"- c #6565EB",
+"; c #6C6CEB",
+": c #7B7BE7",
+"> c #7171E9",
+", c #A6A6A6",
+"< c #ABABAB",
+"1 c #B3B3B3",
+"2 c #BBBBBB",
+"3 c #9F9FDF",
+"4 c #A4A4DE",
+"5 c #ABABDC",
+"6 c #BEBED7",
+"7 c #B4B4DC",
+"8 c #BCBCDA",
+"9 c #8383E5",
+"0 c #8B8BE3",
+"q c #8181E8",
+"w c #9393E2",
+"e c #9C9CE1",
+"r c #A1A1E1",
+"t c #C4C4C4",
+"y c #CDCDC3",
+"u c #CDCDCE",
+"i c #D4D4C2",
+"p c #D0D0CF",
+"a c #CDCDD3",
+"s c #C3C3D8",
+"d c #C8C8D8",
+"f c #D5D5D5",
+"g c #DCDCD3",
+"h c #D5D5D8",
+"j c #DADADA",
+"k c #F2F2CF",
+"l c #E2E2D2",
+"z c #EBEBD1",
+"x c #E7E7DE",
+"c c #EBEBDD",
+"v c #F1F1DF",
+"b c #DEDEE0",
+"n c #E2E2E2",
+"m c #E9E9E0",
+/* pixels */
+"ffffffffffffffffffffffffffffffff",
+"ffjjjjjjjjjjjjjhffffffffffffffjg",
+"fjnxnnnnxncvmmnfpfffffffffffffff",
+"ffffffffff6&%5gtpjffffffffffffff",
+"fffu<<tjfaO  .7yuffjfffjffffffff",
+"ffj2,<<ff3    ;iafffffffjfffffff",
+"ffht,,1hg5    qiuhffffffffffffff",
+"fffft2fffj-  *hyufffffffffffffff",
+"ffffjjffffg75jjtujffffffffgfffff",
+"fffffffffffggfftpfffffffffffffff",
+"fffjffjfffffffhyufffffffffffjfff",
+"fffu<<tffju<<tjtujffjfffffffffff",
+"ffj2,,<jfj1,,<ftufffffffffffffff",
+"ffft,,1ffft,,2jtpjffffffffffffff",
+"fffjttpffffttfftuffpffffffffffff",
+"fffffhffffffjffujbnjbnjbbjbjxgff",
+"fffjllgfffjglgffbxcccjnjmcccnuuf",
+"ffg8$@wgfg7=@3gfg5##3gag5*#4gtff",
+"ffao   3lso   5l8X   7l7.  .8yaf",
+"fl4    &z3 .  -k9 .  >k:  . qiaf",
+"fj7.   :z5    9z4    0ze    eiaf",
+"ffg:. $faf:. %jfg>. -ffg-  ;gtff",
+"fffgd8gfffgs8gfffgs6gfffgs6fftff",
+"fffflllffffllgffffjgffffglzfftff",
+"fff7*+0ffg5@+wgffjaufffl4++4gtff",
+"ffao   elsX   4lft<<tjf7.   7yff",
+"fl3 .  &k0    -lf1<<<hl:  . qiaf",
+"fg8.   :z7    0lft,,2jlr    4yaf",
+"ffl0X &ffg9..-jfffttfffg;..>gtff",
+"ffflasgjfflaslffffjjfffflaagjtff",
+"ffffffffffffffffffffffffffffffff",
+"ffffffffffffffffffffffffffffffff"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 254 2 ",
+"   c blue",
+".  c #0101FF",
+"X  c #0303FE",
+"o  c #0202FF",
+"O  c #0404FE",
+"+  c #0505FE",
+"@  c #0606FE",
+"#  c #0808FD",
+"$  c #0909FD",
+"%  c #0A0AFC",
+"&  c #0B0BFD",
+"*  c #0A0AFE",
+"=  c #0C0CFD",
+"-  c #0F0FFC",
+";  c #1212FB",
+":  c #1414FA",
+">  c #1414FB",
+",  c #1717FA",
+"<  c #1616FB",
+"1  c #1010FC",
+"2  c #1212FC",
+"3  c #1313FC",
+"4  c #1919FA",
+"5  c #1A1AFA",
+"6  c #1B1BFA",
+"7  c #1C1CF9",
+"8  c #1D1DF9",
+"9  c #1E1EF9",
+"0  c #1F1FF9",
+"q  c #1E1EFA",
+"w  c #1F1FFA",
+"e  c #2323F7",
+"r  c #2727F7",
+"t  c #2828F7",
+"y  c #2929F7",
+"u  c #2A2AF6",
+"i  c #2B2BF7",
+"p  c #2C2CF6",
+"a  c #2D2DF6",
+"s  c #2F2FF6",
+"d  c #2121F8",
+"f  c #2020F9",
+"g  c #2121F9",
+"h  c #2222F8",
+"j  c #2323F8",
+"k  c #2525F8",
+"l  c #2626F8",
+"z  c #2929F8",
+"x  c #3737F3",
+"c  c #3131F5",
+"v  c #3232F5",
+"b  c #3333F5",
+"n  c #3131F6",
+"m  c #3535F4",
+"M  c #3434F5",
+"N  c #3636F4",
+"B  c #3737F4",
+"V  c #3B3BF3",
+"C  c #3C3CF3",
+"Z  c #3D3DF3",
+"A  c #3F3FF2",
+"S  c #3E3EF3",
+"D  c #3F3FF3",
+"F  c #3838F4",
+"G  c #3939F4",
+"H  c #3A3AF4",
+"J  c #4242F2",
+"K  c #4343F2",
+"L  c #4646F1",
+"P  c #4747F1",
+"I  c #4A4AF0",
+"U  c #7878E7",
+"Y  c #7979E7",
+"T  c #7D7DE6",
+"R  c #7E7EE6",
+"E  c #7171E9",
+"W  c #7676E8",
+"Q  c gray65",
+"!  c #A7A7A7",
+"~  c #A9A9A9",
+"^  c #AAAAAA",
+"/  c gray67",
+"(  c #ACACAC",
+")  c gray68",
+"_  c #AEAEAE",
+"`  c #AFAFAF",
+"'  c gray69",
+"]  c #B1B1B1",
+"[  c #B2B2B2",
+"{  c gray70",
+"}  c #B4B4B4",
+"|  c gray71",
+" . c #B6B6B6",
+".. c gray74",
+"X. c gray",
+"o. c #BEBEBF",
+"O. c gray75",
+"+. c #C2C2BF",
+"@. c #9C9CDF",
+"#. c #BCBCC0",
+"$. c #BDBDC0",
+"%. c #BEBEC2",
+"&. c #A1A1DF",
+"*. c #A2A2DF",
+"=. c #A4A4DF",
+"-. c #A6A6DE",
+";. c #A7A7DE",
+":. c #AAAADD",
+">. c #ABABDD",
+",. c #ACACDD",
+"<. c #ADADDD",
+"1. c #BEBED6",
+"2. c #B0B0DC",
+"3. c #B1B1DC",
+"4. c #BBBBDA",
+"5. c #BCBCDA",
+"6. c #8383E5",
+"7. c #8181E6",
+"8. c #8585E4",
+"9. c #8484E5",
+"0. c #8686E4",
+"q. c #8686E5",
+"w. c #8484E6",
+"e. c #8B8BE3",
+"r. c #8E8EE3",
+"t. c #8F8FE3",
+"y. c #8888E4",
+"u. c #8989E4",
+"i. c #8989E5",
+"p. c #8A8AE4",
+"a. c #8B8BE4",
+"s. c #8D8DE4",
+"d. c #9191E2",
+"f. c #9090E3",
+"g. c #9393E2",
+"h. c #9696E1",
+"j. c #9494E2",
+"k. c #9595E2",
+"l. c #9898E1",
+"z. c #9999E1",
+"x. c #9A9AE1",
+"c. c #9C9CE0",
+"v. c #9D9DE0",
+"b. c #9D9DE1",
+"n. c #9E9EE0",
+"m. c #9F9FE0",
+"M. c #C0C0C0",
+"N. c #C1C1C1",
+"B. c #C2C2C1",
+"V. c #C1C1C2",
+"C. c #C6C6C0",
+"Z. c gray77",
+"A. c #C8C8C8",
+"S. c #C9C9CB",
+"D. c #CACACA",
+"F. c #CACACB",
+"G. c #CBCBCB",
+"H. c gray80",
+"J. c #CCCCCD",
+"K. c #CDCDCD",
+"L. c #CECECE",
+"P. c gray81",
+"I. c #DDDDCF",
+"U. c #DEDECF",
+"Y. c #CFCFD2",
+"T. c #C8C8D4",
+"R. c #C9C9D7",
+"E. c #CACAD7",
+"W. c #CBCBD7",
+"Q. c #CCCCD7",
+"!. c #CDCDD7",
+"~. c #CFCFD6",
+"^. c #C1C1D9",
+"/. c #C2C2D9",
+"(. c #C6C6D8",
+"). c #C5C5DC",
+"_. c #CFCFDA",
+"`. c #D0D0D0",
+"'. c #D0D0D1",
+"]. c gray82",
+"[. c #D0D0D2",
+"{. c #D1D1D2",
+"}. c #D2D2D2",
+"|. c LightGray",
+" X c #D5D5D2",
+".X c #D2D2D5",
+"XX c #D3D3D5",
+"oX c #D0D0D6",
+"OX c #D1D1D6",
+"+X c #D2D2D6",
+"@X c #D3D3D6",
+"#X c gray83",
+"$X c #D4D4D5",
+"%X c #D5D5D5",
+"&X c #D6D6D4",
+"*X c #D6D6D5",
+"=X c #D7D7D5",
+"-X c #D4D4D6",
+";X c #D5D5D6",
+":X c gray84",
+">X c #D6D6D7",
+",X c #D7D7D7",
+"<X c #D8D8D1",
+"1X c #DCDCD0",
+"2X c #DEDED0",
+"3X c #DCDCD3",
+"4X c #DDDDD3",
+"5X c #DEDED2",
+"6X c #DEDED3",
+"7X c #DFDFD3",
+"8X c #D8D8D4",
+"9X c #D9D9D4",
+"0X c #DADAD4",
+"qX c #DBDBD4",
+"wX c #DCDCD4",
+"eX c #DDDDD4",
+"rX c #DEDED4",
+"tX c #DFDFD4",
+"yX c #DDDDD7",
+"uX c #DEDED7",
+"iX c #D6D6D8",
+"pX c #D7D7D8",
+"aX c #D6D6D9",
+"sX c #D7D7D9",
+"dX c #D8D8D8",
+"fX c #D9D9D8",
+"gX c #D8D8D9",
+"hX c gray85",
+"jX c #DADAD8",
+"kX c #DADADA",
+"lX c #DCDCDD",
+"zX c #DDDDDD",
+"xX c #DFDFDF",
+"cX c #E0E0D3",
+"vX c #E1E1D3",
+"bX c #E2E2D3",
+"nX c #E2E2D6",
+"mX c #E4E4D6",
+"MX c #DEDEE0",
+"NX c gray88",
+"BX c #E2E2E2",
+"VX c #E6E6E9",
+"CX c gray91",
+"ZX c #E9E9E8",
+"AX c #E8E8E9",
+"SX c #E9E9E9",
+"DX c #EAEAE8",
+"FX c #E8E8EB",
+"GX c #E9E9EB",
+"HX c #EAEAEA",
+"JX c #EEEEE8",
+"KX c #EDEDEA",
+"LX c gray93",
+"PX c #EFEFEF",
+/* pixels */
+"%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X}.%X}.}.%X}.%X}.}.%X}.}.}.}.%X}.XX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%XzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXzXzXzXdX X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%XdXSXSXSXSXSXSXLXSXSXSXHXSXHXHXKXSXHXSXLX}.G.%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X}.}.}.%X}.}.}.}. X}.XX}.7X XT. X7X}.%Xo.G.pX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X%X%X}.}.%X%X%XpX%XwXv.n 3 z e.7XpXV.G.%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X}. ._ _ L.pX%XXXcXv.          0.mX%.G.pX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X .Q ^ Q _ }.%X%XwXH   @   @   e pXV.G.%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X_ ^ ^ _ ^ L.%X%X+Xq           % ).C.G.pX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X .Q _ Q _ }.%XXXwXH   @   @   e pXV.G.pX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%XL. .^ ' G.%X%XXX7Xv.          0.mX%.G.%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X%X%XL.%XdX%X%X%XXX7Xx.a 3 k p.wXdXV.G.pX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X%X%X%X%X%X%X%X%X%XXX7X8XT.%XcXXXdXV.G.%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%XXX%X8X%XXXXX8XV.G.%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%XpX%X%X%XdXV.G.%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X%X%XL.%XdX%X%X%X%X%XpX%XY.%X8X%XpXV.G.%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%XY.' ^ _ G.%X%X%X%X%XL.' ^ _ G.%XdXV.G.dX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X .Q ( Q _ }.%X%X%XpX .Q _ Q `  XdXV.G.%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X X_ ^ ^ ( ^ L.pX%X%X}.^ ^ ^ ^ / L.kXV.G.%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%XdX .Q ^ ^ _ }.%X%X%X%X .Q ^ Q ' XXdXV.G.dX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X}. .^ ' L.pX%X%X%X%X}.' _ ' L.%X%XV.G.dX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X+X%X%X%X%X",
+"%X%X%X%X%X%X%X%X}.%X%X%X%X%X%X%X%X%X}.%X%X%XdXV.Z.%X}.}.%X}.%X}.}.%X}.%X}. X XXX}.%X}.XX%X%X%X%X",
+"%X%X%X%X%X%X%XXX%X%X%X%X%X%X%X%X%X%X%X%X%X%XdXZ.dXBXNXMXzXNXNXzXNXNXzXNXzXMXMXzXzXNXnXlXXX%X%X%X",
+"%X%X%X%X%X%XXX%X8X8XXX%X%X%X%X%XXX%X8X%XXX%X%XdXSXSXVXSXKXDXVXSXSXSXSXVXVXSXKXDXSXBXLXG.L.dX%X%X",
+"%X%X%X%X%XXXcX%X^.!.cX%X%X%X%XXXcX%X^.XXcX%X%X%X}.}.I.}.1.Y.I.}.}.}.}.}.7XY.1.}.7X}.%Xo.L.%X%X%X",
+"%X%X%X%XXX7Xk.k % 5 Y 8X%X%XXX7Xf.g % q T wX%X%XXXwXt.g % q 6.7XpX%X%XwX8.q % g p.wXdXV.L.%X%X%X",
+"%X%X%X%X7Xv.      @   W mXXX7Xh.          T cXXXcXt.          6.cXXXcXp.          e.cX%.L.%X%X%X",
+"%X%X%XXX7XA   @   @   5 !.%X9Xm   @   @   g XX%X8Xa   @   @   k %X%X%Xz   @   @   t 8XV.L.%X%X%X",
+"%X%X%X%X%Xg           @ 5.8XXXq           % ^.8X!.,           3 (.8XT.3           , +X+.L.pX%X%X",
+"%X%X%XXXwXL   @   @   g XX%X7XA   @   @   t XXXXwXH   @   @   a %X%X9Xn   @   %   m kX%.L.%X%X%X",
+"%X%X%XXX7X>.%         p.wXXX7X;.@         t.cXXX7Xv.@         h.7XXX7Xx.          v.cXo.L.%X%X%X",
+"%X%X%X%XXXwX,.A 5 n g.7X%X%XXX7X;.V 5 n x.7X%X%XXX7X*.H 5 m v.7XXX%XXX7Xm.H 5 H m.7XpXo.L.%X%X%X",
+"%X%X%X%X%XXX7X7XXX8XcX%X%X%X%XXX7XwXXX8X7XXX%X%X%XXX7X7XXXwXcXXX%X%X%XXXwXwXXX8X7XXXpX+.L.%X%X%X",
+"%X%X%X%X%X%XXX%XwX%X!.%X%X%X%X%XXXXXwX%XXX%X%X%X%X%XXXXX%XXXXX%X%X%X%X%XXX%X8X%XXXXX8Xo.L.pX%X%X",
+"%X%X%X%X%XXXwXXX4._.cX X%X%X%XXXcXXX4.!.wX%X%X%X%X%X%XXXpX%X%X%X%X%X%X%XcX!.5.XX7XXXdX%.L.dX%X%X",
+"%X%X%X%XXX7Xe.g @ , E 9X%X%XXXwXp.q @ , W 8X%X%X%X%XpXXXL.}.dX%X%X%X%XwXT 5 @ 5 6.wX%Xo.L.dX%X%X",
+"%X%X%XXXcXh.          E cXXXcXg.          U cXXX%X%XF.' ^ _ G.%X%XXXcX6.          0.mX%.G.%X%X%X",
+"%X%X%XXX7XA   @       5 _.%X8Xm   @   @   q XX%X%X%X' Q ^ Q ' %X%X%X%Xz   @   @   t 8X%.L.dX%X%X",
+"%X%X%X%X%Xg           @ 4.8XXXq           = (.8X%X}.( ^ ^ ^ ^ L.pX%XT.3           , _.+.L.%X%X%X",
+"%X%X%XXX7XI   @   @   k XXXXwXJ   @   @   t %X%X%X%X .Q ^ Q { %X%X%X8Xn   @   @   m kX+.L.8X%X%X",
+"%X%X%XXX7X3.=         e.cXXXwX>.%         h.wXXX%X%X}. ./  .Y.%X%X%XcXv.        @ *.cXo.L.%X%X%X",
+"%X%X%X%XXX7X,.L e H x.7XXX%X%X7X,.L g H v.7XXX%X%X%X8XdX}.%X%X%X%X%XXX7X;.A g A ;.7X%Xo.L.pX%X%X",
+"%X%X%X%X%XXX7X7X8X7X7XXX%X%X%XXX7XcX%XwXcX%X%X%X%X%X%X%X%X%X%X%X%X%X%XXX7X7X%X7X7XXXpX%.L.pX%X%X",
+"%X%X%X%X%X%XXXXX%XXXXX%X%X%X%X%XXXXX%XXXXX%X%X%X%X%X%X%X%X%X%X%X%X%X%X%XXXXX%XXXXX%X%X%X}.%X%X%X",
+"%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X",
+"%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/pegs-web.png b/icons/pegs-web.png
new file mode 100644 (file)
index 0000000..662c7ea
Binary files /dev/null and b/icons/pegs-web.png differ
diff --git a/icons/pegs.ico b/icons/pegs.ico
new file mode 100644 (file)
index 0000000..c0fca9f
Binary files /dev/null and b/icons/pegs.ico differ
diff --git a/icons/pegs.rc b/icons/pegs.rc
new file mode 100644 (file)
index 0000000..c1df80c
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "pegs.ico"
diff --git a/icons/range-16d24.png b/icons/range-16d24.png
new file mode 100644 (file)
index 0000000..ae0a145
Binary files /dev/null and b/icons/range-16d24.png differ
diff --git a/icons/range-16d4.png b/icons/range-16d4.png
new file mode 100644 (file)
index 0000000..f704222
Binary files /dev/null and b/icons/range-16d4.png differ
diff --git a/icons/range-16d8.png b/icons/range-16d8.png
new file mode 100644 (file)
index 0000000..ae0a145
Binary files /dev/null and b/icons/range-16d8.png differ
diff --git a/icons/range-32d24.png b/icons/range-32d24.png
new file mode 100644 (file)
index 0000000..a5acf61
Binary files /dev/null and b/icons/range-32d24.png differ
diff --git a/icons/range-32d4.png b/icons/range-32d4.png
new file mode 100644 (file)
index 0000000..c7c5e04
Binary files /dev/null and b/icons/range-32d4.png differ
diff --git a/icons/range-32d8.png b/icons/range-32d8.png
new file mode 100644 (file)
index 0000000..a5acf61
Binary files /dev/null and b/icons/range-32d8.png differ
diff --git a/icons/range-48d24.png b/icons/range-48d24.png
new file mode 100644 (file)
index 0000000..b388f91
Binary files /dev/null and b/icons/range-48d24.png differ
diff --git a/icons/range-48d4.png b/icons/range-48d4.png
new file mode 100644 (file)
index 0000000..10d4453
Binary files /dev/null and b/icons/range-48d4.png differ
diff --git a/icons/range-48d8.png b/icons/range-48d8.png
new file mode 100644 (file)
index 0000000..b388f91
Binary files /dev/null and b/icons/range-48d8.png differ
diff --git a/icons/range-base.png b/icons/range-base.png
new file mode 100644 (file)
index 0000000..7f95faa
Binary files /dev/null and b/icons/range-base.png differ
diff --git a/icons/range-ibase.png b/icons/range-ibase.png
new file mode 100644 (file)
index 0000000..0a8a345
Binary files /dev/null and b/icons/range-ibase.png differ
diff --git a/icons/range-ibase4.png b/icons/range-ibase4.png
new file mode 100644 (file)
index 0000000..985dddb
Binary files /dev/null and b/icons/range-ibase4.png differ
diff --git a/icons/range-icon.c b/icons/range-icon.c
new file mode 100644 (file)
index 0000000..8e696a6
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+". @ + + + @ @ O o + # + + + @ . ",
+"+ l._.E./.Z.I.).[.R.V.^.Q.`.c.. ",
+"+ `.zXuXgX&XtX~.g.iX#XfXqXzX}.  ",
+"+ E.uX5XwX|.8XU.1.tX].wXm.qX(.  ",
+"+ /.gXwXaX+XqXoX,XyXXXiXrXhX'.  ",
+"O V.*X|.#XY.`.&X#X}.P.+X|.*XS.  ",
+"+ I.qX7X5X'.&X2X1X:X).4X7XqXR.  ",
+"+ ^.pX/.pX+X4XyXrX9X.XuX/.pX`.  ",
+"+ Q.eXW.eX.X2XrXeX7X XyX^.uX_.  ",
+"O `.vXkXkX&X;X9X7X3X[.9X9XyX~.  ",
+"* S D S C E }. X X[.J.OX&X%XC.  ",
+", 3   o   i tXtXyX9XOX9Xd.8X[.  ",
+"> 5   +   i iX~.^.wX|.3XG Z..X  ",
+", 4   o   p dXyXuXyX%XpXM.*XOX  ",
+"; ,   X   q ).)._.~.C.`.].OXv.  ",
+"                                "
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"                                                                ",
+"  . - % % % % % % % % ; & % % % % % & % - & % % % % % & % = X   ",
+"  # -.b.z.x.x.x.x.z.c.4.l.x.z.l.l.l.z.b.6.g.c.z.x.x.x.l.M.1.    ",
+"  & n.hXyXiXiXiXiXuXsXH.rXiXdXxXlXfXyXjXI.4XsXuXiXiXiXtXcXH.  o ",
+"  % z.yX8X9X9X9X9X9XwXA.5XeX&XK.Q.OX9XyXG.;XeX9X8X7X9X7XdXZ.  o ",
+"  % x.iX9XqXqXqXqX0XrXS.5XsXU.~ 7 [ gXtXH.:XtX9XiXfX0X8XgXA.  o ",
+"  % x.iX9XqXqXqXqX0XrXS.7XqXyXlXb Y.aXuXH.:XwXhXd./ fX6XgXA.  o ",
+"  % x.iX9XqXqXqXqX0XrXS.7X9XhXa.V gX7XiXH.:XeXaXU.d.iX7XgXA.  o ",
+"  % x.iX9XqXqXqXqX0XrXS.7XqXaX~ A.gX7XpXH.:XtX9XaXhX0X8XgXA.  o ",
+"  % z.uX9X0X0X0X0X9XeXA.6XqX9X0XrX9X9XiXG.:XrX0X8X7X0X7XfXA.  o ",
+"  & v.sXeXrXrXrXrXeXiXF.0XtXrXtXeXrXwXdXK.<XiXrXrXrXrXqXkXF.  o ",
+"  # $.H.Z.S.S.S.S.A.F.,.C.S.S.A.A.S.Z.J.2.b.F.A.S.S.S.Z.I.,.  X ",
+"  % k.rX5X7X7X7X7X6X0XC.3X8X7X7X7X7X5XrXD.=X0X7X7X7X7X4XpXV.  o ",
+"  % x.pX0XwX9X0XwXqXtXS.8XeXwXwXwXwX0XaXJ.>XtXwX0X9XwX9XhXS.  o ",
+"  % x.iX9X0XjXaX9X0XrXS.7XwXqXqXqXqX9XiXH.:XtX9XaXjX0X8XgXA.  o ",
+"  % x.iX8XsX-.M.fX8XrXS.7XwXqXqXqXqX9XiXH.:XwXfXM.-.sX7XgXA.  o ",
+"  % x.iX8XsX-.M.fX8XrXS.7XwXqXqXqXqX9XiXH.:XwXfXM.-.sX7XgXA.  o ",
+"  % x.iX0X0XjXaX9XqXrXS.7XwXqXqXqXqX9XiXH.:XtX9XaXjX0X8XgXA.  o ",
+"  % l.rX6X8X5X6X8X7XqXZ.5X0X9X9X9X9X8XuXG.;XeX9X8X6X0X6XdXZ.  o ",
+"  % B.nXhXkXkXkXkXjXcXP.rXaXiXiXiXiXuXjXI.4XdXiXiXiXiXyXcXJ.  o ",
+"  % [ r.q.w.w.w.w.w.w.+.H.H.H.H.H.H.G.I.6.N.L.H.H.H.H.F.R.2.  X ",
+"  5 k   X         o   V 8X-X:X:X:X:X;X4XN.XX1X:X:X,X>X-X9Xv.  o ",
+"  7 v   + O O O O @   G jXwXtXwXwXtXeXdXK.1XiXtXtX7X0XwXkXF.  o ",
+"  7 x   X         o   S dX8X9XfXfX9X9XiXH.;XuX>XN S c.iXsXA.  o ",
+"  7 x   X         o   S fX7XaXM.M.aX8XiXH.;XpX-X0 x A.uXdXA.  o ",
+"  7 x   X         o   S fX6XjX-.-.jX6XiXH.:XyX2X3Xr.s yXfXA.  o ",
+"  7 x   X         o   S fX9X0XsXsX0X0XiXH.;XsX|.| N O.iXdXA.  o ",
+"  6 z   X         o   S aX6X8X7X7X8X6XyXF.-XwX7X^.Q.eX6XaXC.  o ",
+"  8 b   X         o   H MXsXgXgXgXgXdXcXR.9XkXfXvXbXfXaXNXP.  o ",
+"  < y   .         X   j P.C.A.A.A.A.Z.J.2.v.F.A.Z.Z.A.C.P.,.  X ",
+"                                                                ",
+"    .                 . o o o o o o o o X o o o o o o o o X     "
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"                                                                                                ",
+"      . o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o X         ",
+"                                                                                                ",
+"  .   > V l x x x x x x x x x x x N x x x x x x x x x x x x N x x x x x x x x x x x c x X       ",
+"  X   i 4.B.n.m.m.m.m.m.m.m.m.m.v.*.N.n.m.m.m.m.m.m.m.m.n.N.*.v.m.m.m.m.m.m.m.m.m.b.D.'   X     ",
+"  o   v C.hXyXiXiXiXiXiXiXiXiXpXeXa.dXuXiXiXyXyXyXyXiXiXuXdXa.eXpXiXiXiXiXiXiXiXiXrXMX:.  O     ",
+"  o   x n.yX6X9X9X9X9X9X9X9X9X0X4Xt.eX8X8XqXaXsXaXpXqX8X8XeXt.4X0X9X9X9X9X9X9X9X9X5XhX*.  O     ",
+"  o   x m.iX9XqXqXqXqXqXqXqXqXwX6Xy.tX9XeX1XI.P.Y.Q.2XeX0XtXy.6XwXqXqXqX9X0XqXqXqX7XlX=.  O     ",
+"  o   x m.iX9XqXqXqXqXqXqXqXqXwX6Xy.tX8XpX'.5 6 ; O ].iX8XtXy.6XwXqXqXqXpXiX0XqXqX7XlX=.  O     ",
+"  o   x m.iX9XqXqXqXqXqXqXqXqXwX6Xy.tX0XqX0X4XiXA c iX0X0XtXy.6XwXqXqXqX|.OXeXqXqX7XlX=.  O     ",
+"  o   x m.iX9XqXqXqXqXqXqXqXqXwX6Xy.tX0XqX0XsX{.  B.gX8X0XtXy.6XwXqXwXeX> x gX9XqX7XlX=.  O     ",
+"  o   x m.iX9XqXqXqXqXqXqXqXqXwX6Xy.tX0XqX8XlX` q rXqXqX0XtXy.6XwXqXqXwX8.f.uX0XqX7XlX=.  O     ",
+"  o   x m.iX9XqXqXqXqXqXqXqXqXwX6Xy.tX0X9XiX|.  i.hX8XqX0XtXy.6XwXqXqXqXkXgX0XqXqX7XlX=.  O     ",
+"  o   x m.iX9XqXqXqXqXqXqXqXqXwX6Xy.tX0X9XpXR.+.2XrX0XqX0XtXy.6XwXqXqXqX7X8XqXqXqX7XlX=.  O     ",
+"  o   x m.iX9XqXqXqXqXqXqXqXqXwX6Xy.tX0XqX0XiXzXwX0XqXqX0XtXy.6XwXqXqXqXqXqXqXqXqX7XlX=.  O     ",
+"  o   x M.pX0XwXwXwXwXwXwXwXwXrX7Xu.uXqXwXeXqX8XwXwXwXwXqXuXu.7XrXwXwXwXwXwXwXwXwX8XzX=.  O     ",
+"  X   z c.eX4X6X6X6X6X6X6X6X6X7X1Xe.0X5X6X6X6X6X6X6X6X6X5X0Xe.1X7X6X6X6X6X6X6X6X6X2XdX%.  O     ",
+"  X   0 ' a.t.y.y.y.y.y.y.y.y.u.e.E i.t.y.y.y.y.y.y.y.y.t.i.E e.u.y.y.y.y.y.y.y.y.r.j.S   X     ",
+"  o   c B.dXeXtXtXtXtXtXtXtXtXuX0Xi.aXrXtXtXtXtXtXtXtXtXrXaXi.0XuXtXtXtXtXtXtXtXtXqXvX;.  O     ",
+"  o   x n.uX8X0X0X0X0X0X0X0X0XqX5Xt.rX9X0X0X0X0X0X0X0X0X9XrXt.5XqX0X0X0X0X0X0X0X0X6XkX*.  O     ",
+"  o   x m.iX9XqXqXqX0XqXqXqXqXwX6Xy.tX0XqXqXqXqXqXqXqXqX0XtXy.6XwXqXqXqX0X0XqXqXqX7XlX=.  O     ",
+"  o   x m.iX9XqXqXwXyXeXqXqXqXwX6Xy.tX0XqXqXqXqXqXqXqXqX0XtXy.6XwXqXqXqXtXrXqXqXqX7XlX=.  O     ",
+"  o   x m.iX9XqXqX9X:X5XwXqXqXwX6Xy.tX0XqXqXqXqXqXqXqXqX0XtXy.6XwXqXqXqX,X1XwXqXqX7XlX=.  O     ",
+"  o   x m.iX9X9XpX{.  <.lX7XqXwX6Xy.tX0XqXqXqXqXqXqXqXqX0XtXy.6XwXqXwXeX> x gX9XqX7XlX=.  O     ",
+"  o   x m.iX9X0XyX%XJ B.dX9XqXwX6Xy.tX0XqXqXqXqXqXqXqXqX0XtXy.6XwXqXqXwX{ ,.pX9XqX7XlX=.  O     ",
+"  o   x m.iX9XqX0XrXzXpX0XqXqXwX6Xy.tX0XqXqXqXqXqXqXqXqX0XtXy.6XwXqXqXqXjXgX0XqXqX7XlX=.  O     ",
+"  o   x m.iX9XqXqX0X7X9XqXqXqXwX6Xy.tX0XqXqXqXqXqXqXqXqX0XtXy.6XwXqXqXqX8X8XqXqXqX7XlX=.  O     ",
+"  o   x m.iX9XqXqXqXqXqXqXqXqXwX6Xy.tX0XqXqXqXqXqXqXqXqX0XtXy.6XwXqXqXqXqXqXqXqXqX7XlX=.  O     ",
+"  o   x b.rX5X8X8X8X8X8X8X8X8X9X2Xt.rX9X0X0X0X0X0X0X0X0X9XrXt.5XqX0X0X0X0X0X0X0X0X6XkX*.  O     ",
+"  o   x S.nXgXjXjXjXjXjXjXjXjXkXdXs.pXrXtXtXtXtXtXtXtXtXrXaXi.0XuXtXtXtXtXtXtXtXtXqXvX;.  O     ",
+"  X   r S W E W W W W W W W W Q U F s.t.y.y.y.y.y.y.y.y.t.i.E e.u.y.y.y.y.y.y.y.y.r.j.S   X     ",
+"  X   F d   .                 o   R sX3X6X6X6X6X6X6X6X6X5X0Xe.1X7X6X6X6X5X5X5X6X6X2XdX%.  O     ",
+"  o   H h   + o o o o o o o o #   Q kX9XwXwXwXwXwXwXwXwXqXuXu.7XrXwXwXrXtXtXrXwXwX8XzX=.  O     ",
+"  o   H f   X                 o   W jX8XqXqXqXqXqXqXqXqX0XtXy.6XwXqXqX7X3X1X4XqXqX7XlX=.  O     ",
+"  o   H f   X                 o   W jX8XqXqXqXwXqXqXqXqX0XtXy.6XwX8XdXE 1 r j 4XeX7XlX=.  O     ",
+"  o   H f   X                 o   W jX8XqXqXqXeXwXqXqXqX0XtXy.6XwX8XhXm y <.J.tX0X7XlX=.  O     ",
+"  o   H f   X                 o   W jX8X0XtX,X& { jX8XqX0XtXy.6XwX9XsXW h 1 h :XrX6XlX=.  O     ",
+"  o   H f   X                 o   W jX8X0XrX1Xh ,.gX8XqX0XtXy.6XwXqXqXtXZX_.  b.hX4XlX=.  O     ",
+"  o   H f   X                 o   W jX8XqXqXwXgXpX0XqXqX0XtXy.6XwXrX>X%.m.`   W.aX5XlX=.  O     ",
+"  o   H f   X                 o   W jX8XqXqXqX9X9XqXqXqX0XtXy.6XwXwX9XO.g h j.uX0X7XlX=.  O     ",
+"  o   H f   X                 o   W jX8XqXqXqXqXqXqXqXqX0XtXy.6XwXqXwXgXsXdXsXqXqX7XlX=.  O     ",
+"  o   G d   .                 o   E dX4X7X7X7X7X7X7X7X7X6XqXr.2X8X7X7X5X6X5X5X7X7X3XgX&.  O     ",
+"  o   I j   X                 O   ( DXgXlXlXlXlXlXlXlXlXkXvXj.dXzXlXlXlXlXlXlXlXlXgXGX2.  O     ",
+"  .   e 2   .                 X   p 1.&.=.=.=.=.=.=.=.=.*.;.S %.=.=.=.=.=.=.=.=.=.&.2.v   X     ",
+"                                                                                                ",
+"      . .                         . O O O O O O O O O O O O X O O O O O O O O O O O O X         ",
+"                                                                                                ",
+"                                                                                                "
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/range-web.png b/icons/range-web.png
new file mode 100644 (file)
index 0000000..d772d83
Binary files /dev/null and b/icons/range-web.png differ
diff --git a/icons/range.ico b/icons/range.ico
new file mode 100644 (file)
index 0000000..e1012c8
Binary files /dev/null and b/icons/range.ico differ
diff --git a/icons/range.rc b/icons/range.rc
new file mode 100644 (file)
index 0000000..9f7672d
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "range.ico"
diff --git a/icons/rect-16d24.png b/icons/rect-16d24.png
new file mode 100644 (file)
index 0000000..58cc006
Binary files /dev/null and b/icons/rect-16d24.png differ
diff --git a/icons/rect-16d4.png b/icons/rect-16d4.png
new file mode 100644 (file)
index 0000000..33c8d7c
Binary files /dev/null and b/icons/rect-16d4.png differ
diff --git a/icons/rect-16d8.png b/icons/rect-16d8.png
new file mode 100644 (file)
index 0000000..58cc006
Binary files /dev/null and b/icons/rect-16d8.png differ
diff --git a/icons/rect-32d24.png b/icons/rect-32d24.png
new file mode 100644 (file)
index 0000000..ca213c9
Binary files /dev/null and b/icons/rect-32d24.png differ
diff --git a/icons/rect-32d4.png b/icons/rect-32d4.png
new file mode 100644 (file)
index 0000000..c32317b
Binary files /dev/null and b/icons/rect-32d4.png differ
diff --git a/icons/rect-32d8.png b/icons/rect-32d8.png
new file mode 100644 (file)
index 0000000..ca213c9
Binary files /dev/null and b/icons/rect-32d8.png differ
diff --git a/icons/rect-48d24.png b/icons/rect-48d24.png
new file mode 100644 (file)
index 0000000..b2587b1
Binary files /dev/null and b/icons/rect-48d24.png differ
diff --git a/icons/rect-48d4.png b/icons/rect-48d4.png
new file mode 100644 (file)
index 0000000..893b160
Binary files /dev/null and b/icons/rect-48d4.png differ
diff --git a/icons/rect-48d8.png b/icons/rect-48d8.png
new file mode 100644 (file)
index 0000000..b2587b1
Binary files /dev/null and b/icons/rect-48d8.png differ
diff --git a/icons/rect-base.png b/icons/rect-base.png
new file mode 100644 (file)
index 0000000..d2a732f
Binary files /dev/null and b/icons/rect-base.png differ
diff --git a/icons/rect-ibase.png b/icons/rect-ibase.png
new file mode 100644 (file)
index 0000000..f10b320
Binary files /dev/null and b/icons/rect-ibase.png differ
diff --git a/icons/rect-ibase4.png b/icons/rect-ibase4.png
new file mode 100644 (file)
index 0000000..30246e6
Binary files /dev/null and b/icons/rect-ibase4.png differ
diff --git a/icons/rect-icon.c b/icons/rect-icon.c
new file mode 100644 (file)
index 0000000..a65c646
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"jX>X*X=X-X=X*X,X1X>X>X,X,X:X5XlX",
+"uXV.B.B.z.N.G.<...q.4.1.4.8.| 5X",
+"pXkXSXCXdXNXUX~.j.+X).`.x.l.i.;X",
+"pXyXzXjXqXgXBXI.h. X/.).N.G.e.:X",
+"pX4XrXwX:XwXvXZ.R 5.%.' :.,.W 4X",
+"pXtXlXgXeX3X&XR.w.k.c.@.U.R.,.,X",
+"pXpXbXzXsX*XK./.f.7.C.,.].|.8.>X",
+"pX0XdXpX5XtXnXH.u._.F.$.~.(.3.,X",
+"pX7XiXyX1XtXzXD.u.].D.#.!./.3.,X",
+"pXpXbXxXeXkXSXY.f..XP.*.`.[.6.>X",
+"pXyXxXkXyXkXAXU.a.|.J.&.).'.6.>X",
+"pX3XwXyX9.1.u.o.] -.[ ' /.).<.,X",
+"pXyXxXzX9.b.y.Q.R./.J.:.N.z.w.:X",
+"pXiXbXxXt.M.u.].^.}.T.2.N.k.y.;X",
+"aX8XiXaX2.g.b.h.j.v.s.} b.N.*.4X",
+"kXaXpXaXqX1X2X2X2X2X3X6X2X<X8XlX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"lXlXnXnXnXnXnXnXnXnXnXnXnXnXnXbXbXnXnXnXnXnXnXnXnXnXnXnXnXvXlXlX",
+"lXkX7X4X5X5X5X5X6X6X5X5X5X5X4X0X0X7X7X7X7X7X8X7X7X7X7X7X7XeXkXlX",
+"vXtXC v n n n n x x n n n b N 0 e j g g g g d g g g f h s e eXvX",
+"vXrX<XcXhXjXjXcX6X6XcXjXjXfXFX[ =. XW.!.Q.^.F.R.~.~.`.^.E.g 7XnX",
+"vXtX3XnXlXzXlXbX9X9XbXlXzXhXJX} ;.oX~./.^.).J.Q.(.:.} /.~.h 7XnX",
+"vXtX2XvXkXlXkXvX8X8XvXkXlXgXHX{ -.XXQ.^.~.(.H.E.`.g.U /.!.g 7XnX",
+"vXtX2XbXkXlXkXvX8X8XvXkXlXgXHX{ =. XW.~.!./.F.R.).F ` /.W.g 7XnX",
+"vXtX3XmXzXxXzXnX0X0XnXzXxXjXKX{ 2.*X'.{.[.|.Y.`.{.].).[.].j 7XnX",
+"cXtX:XhXaXsXaXhX2X2XhXaXaXuXVX[ ~ m.d.f.f.h.i.f.g.g.h.h.s.i 9XbX",
+"cXyX}.1X:X>X:X1X.X.X1X,X>X=XeX) 1 M c x z b - p v z x c k 4 wXbX",
+"vXrX5XNXcXvXcXNXqXqXNXjXcXcXPX} 2.-X/.}.|.#Xb c.#X[.{.}.].j 7XnX",
+"vXtX1XvXjXkXjXcX7X5XVX).~ ,XIX] =.oX6.K H.|.z d.].Q.!.~.W.g 7XnX",
+"vXtX2XbXkXlXkXvX8X7XmX0XH _.UX] -.@Xz.P U. Xz g.{.~.^./.!.g 7XnX",
+"vXtX2XvXkXlXkXvX8X6XBXW.,.>XIX[ =.%X_ ! T.|.z f.{.!.~./.!.g 7XnX",
+"vXrX4XMXxXcXxXMXqXqXMXcXBXvXLX} :.oX`.`.~.|.x h.|.^./.).~.g 7XnX",
+"cXtX&XiXrXrXrXiX:X:XiXeXeX0XbX) &.].I.Y.Y.(.l i.(.Y.T.R.U.f 7XnX",
+"cXyXXX5X1X2X2X6X+X+X6X2X2X,XpX~ @.^.H.K.J.W.j r.E.J.K.L.H.d 8XnX",
+"vXrX6XBXvXbXvXNXwXwXNXvXbXzXIX| :.+X^.(./. Xc h.|./.(.).^.h 7XnX",
+"vXtX1XvXjXkXjXcX7X7XcXjXkXfXGX{ -..XQ.~.!.{.x f.[.!.~.^.Q.g 7XnX",
+"vXtX2XbXkXlXkXvX8X8XvXkXlXgXHX{ ;.XX!.^.!.}.x g.{.~.^./.!.g 7XnX",
+"vXtX1XvXjXkXjXvX6X4XzXfXgXaXSX] =.|.E.Q.E.'.z f.[.!.~.^.Q.g 7XnX",
+"vXrX5XBXcXvXvXMXyXjXUXHXJXDXUX@.6.1X.XoXXX;Xn g.|./.(.).^.g 7XnX",
+"cXyX@XwX7X8X6XyXR.:.w.8.8.7.p.l n ..` ' ` } 5 a.Q.L.P.U.L.d 8XnX",
+"cXyX@XwX7X8X4XhX4.e } ` [ / / ` ] ' ' ' ` } 5 a.Q.R.R.U.L.d 8XnX",
+"vXrX5XBXcXvXzXUXw.| 7XY.L.+X#X^.].@XoXoXXX;Xn g. XB.G.`.^.g 7XnX",
+"vXtX1XvXjXkXfXHX9.~ OXc.B j.].F.I.~.Q.Q.E.'.z d.XX=.M (.!.g 7XnX",
+"vXtX2XbXkXlXgXJX9.^ *Xp.A K.`.J.T.(.^.^.!.}.x f.|.w.v E.^.g 7XnX",
+"vXtX1XvXjXkXfXHX9.~ %X8.o.H.).H.U.^.!.!.W.].x f.`.5.e.^.W.g 7XnX",
+"vXrX5XBXvXbXzXUXq.' -XXX%X}.|.E.(.|.{.{.].#Xv x.#XOX+X}.].j 7XnX",
+"cXuXoX5X1X2X,XuX7.g O.` ` ] { ( ` [ ] [ ]  .y U | ` ' { ` s wXbX",
+"lXlXuXrXtXtXtXrXtX6X<X1X1X1X1X2X2X1X1X1X1X1X0X4X1X1X1X1X1XwXlXlX",
+"lXlXcXvXvXvXvXvXvXnXmXmXmXmXmXmXmXmXmXmXmXmXbXmXmXmXmXmXmXvXlXlX"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX",
+"lXlXlXkXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXhXlXlXlXlX",
+"lXlXkXbXFXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXDXSXSXDXDXDXDXDXDXDXDXSXDXDXDXDXDXDXDXDXDXZXlXlXlXlX",
+"lXkXbX5XV.D.S.S.S.S.S.S.S.D.S.S.S.S.S.S.S.S.D.K.G.D.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.D.Q.lXlXlXlX",
+"lXhXSXL.  ; * * * * * * * # & * * * * * * * &   o + O O O O O O O o O O O O O O O @   q kXzXlXlX",
+"lXkXmX=X6XbXkXlXlXlXlXjXnXOXyXcXkXlXlXlXkXvXwX# g.}.~./././././.~.C.(.^./.`._.^.!..X,.3 xXzXlXlX",
+"lXkXmX*X7XmXlXzXzXzXzXlXMX+XuXvXzXzXzXzXlXnXeXo f.}.~./././././.^.C.(././.F.L.'.!.XX>.< xXzXlXlX",
+"lXkXmX*X5XbXkXkXkXkXkXjXnXoXtXcXkXkXkXkXjXvXwXo d.{.!.^.^.^.^.^.!.B.^.).G.L d 7.'.|.:.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXkXnXOXyXcXlXlXlXlXkXbXwXo f.{.!.^.^.^.^.^.~.V./.^.!.OXS =.}.|.>.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXkXnXOXyXcXlXlXlXlXkXbXwXo f.{.!.^.^.^.^.^.~.V./.^.(.S N T.!. X>.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXkXnXOXyXcXlXlXlXlXkXbXwXo f.{.!.^.^.^.^.^.~.V.^.).H.M H 9._. X>.< xXzXlXlX",
+"lXkXmX*X5XbXkXkXkXkXkXjXnXoXtXxXkXkXkXkXjXvXqXO a.'.E.Q.Q.Q.Q.Q.W.M.!.W.~.}.'./.R.}.;.< xXzXlXlX",
+"lXkXmX*X0XBXvXbXbXbXbXcXVX#XaXMXvXbXbXbXcXNXyXo m.-X.XoXoXoXoXOX.XL.OXoXoX.X.XXX.X,X8., xXzXlXlX",
+"lXkXmX*X#XrX8X9X9X9X9X8XrX_.,XwX9X9X9X9X8XeX=X@ F { ) _ _ _ _ _ ` ^ ` _ _ _ _ _ ) | c 6 zXzXlXlX",
+"lXkXmX*X).=X$X$X$X$X$X#X=XY. X&X$X#X@X$X#X=X'.# 1 q 9 8 7 9 9 0 3   7 9 9 9 9 9 8 w * 0 lXzXlXlX",
+"lXkXmX*XwXCXnXmXmXmXmXbXAX$XdXBXnXSXHXNXbXCXpXo c.%X{.@X#X|.{.#XN.o E.oX}.|.|.|.[.-X5., xXzXlXlX",
+"lXkXmX*X5XvXjXkXkXkXkXhXbXoXrXzXzX*X(.iXkXcXqXo s.].Q.z.f.~.Q.'.j.  G.).Q.!.!.!.W.|.:.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXkXnXOXyXxXvXV.Z ` VXxXwXo d.}.T.[ h ^ }.'.l.  H._.~.^.^.^.Q..X>.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXkXnXOXyXxXbXfXQ +.VXxXwXo f.{.!.&X) +.}.'.l.  H._.~.^.^.^.Q..X>.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXkXnXOXtXvXhX/.-.B vXvXwXo d.[.).Z t M.^.].l.  H._.~.^.^.^.Q..X>.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXkXnXOXtXcXlXb.1..XvXcXwXo d.}.E.] / 3.(.].l.  H._.~.^.^.^.Q..X>.< xXzXlXlX",
+"lXkXmX*X5XvXjXkXkXkXkXhXbXoXtXxXkXZXFXmXhXvXqXo d.[.!..X.X[.Q.[.k.  H._.!.~.~.~.Q. X:.< xXzXlXlX",
+"lXkXmX*XqXCXnXnXnXnXnXbXZX$XsXBXnXvXxXbXbXVXiXO h. X/.^.^./.(.|.x.  L.].(.).).)./.OX<.< xXzXlXlX",
+"lXkXmX*X|.4X,X,X,X,X,X>X4XQ.$X2X,X,X,X,X>X3XoXo w.R.G.J.J.J.G.T.y.  n.I.H.J.J.J.F.!.@.1 xXzXlXlX",
+"lXkXmX*X|.4X,X,X,X,X,X>X4XQ.$X2X,X,X,X,X>X3XoXo w.R.G.J.J.J.G.T.y.  n.I.H.J.J.J.F.!.@.1 xXzXlXlX",
+"lXkXmX*XqXCXnXnXnXnXnXbXZX$XsXBXnXnXnXnXbXVXiXO h. X/.).).).(.|.x.  L.].(.).).)./.OX<.< xXzXlXlX",
+"lXkXmX*X5XvXjXkXkXkXkXhXbXoXtXxXkXkXkXkXjXcXqXo d.[.!.~.~.~.!.].k.  H._.!.~.~.~.Q. X:.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXkXnXOXyXcXlXlXlXlXkXbXwXo f.{.!.^.^.^.!.[.l.  H._.~.^.^.^.Q..X>.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXkXnXOXyXcXlXlXlXlXkXbXwXo f.{.!.^.^.^.!.[.l.  H._.~.^.^.^.Q..X>.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXkXnXOXyXcXlXlXlXlXkXbXwXo f.{.!.^.^.^.!.[.l.  H._.~.^.^.^.Q..X>.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXkXnXOXyXcXlXlXlXlXkXbXwXo f.{.!.^.^.^.!.[.l.  H._.~.^.^.^.Q..X>.< xXzXlXlX",
+"lXkXmX*X5XvXjXkXkXkXkXhXbXXXeXzXhXjXjXjXhXxX0Xo s.].Q.!.!.!.Q.'.j.  G.).!.~.~.~.Q. X:.< xXzXlXlX",
+"lXkXmX*XwXCXnXmXmXmXmXbXZX*XlXFXZXAXAXAXCXGXhX@ v.$X{.|.|.|.{.#XN.  L.[.(.).).)./.+X<.< xXzXlXlX",
+"lXkXmX*X).=X$X$X$X$X$X$X*XJ p f f d d d d f a . 3 0 9 9 9 9 9 0 2 O z.H.A.S.S.S.Z.T.o.1 xXzXlXlX",
+"lXkXmX*X#XrX8X9X9X9X9X9XwX8 j [ ^ ~ ! ^ / ^ ) ^ ` _ _ _ _ _ ) [ J X B.E.I.L.L.I.L.).%.1 xXzXlXlX",
+"lXkXmX*X0XBXvXbXbXbXvXvXBX5 3.1X.X;X1X%XoXOX+XP..XOXoXoXoXoXXX=XC.  K.'.(.XXoX`.~.OX,.< xXzXlXlX",
+"lXkXmX*X5XbXkXkXkXkXkXkXvX4 $.}.!.1.~ c./.W.!.M.E.Q.Q.Q.Q.Q.E.`.h.  G.`.T.*.+.F.^. X:.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXlXbX4 &.XXQ.u.) h [.!./.V.!.^.^.^.^.^.!.[.l.  H.`.E.:.6 ;.{.|.>.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXlXbX4 &..X!.}.) 7.[.!.(.V.!.^.^.^.^.^.!.[.l.  H.(.'.A.g <.[.|.>.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXlXbX4 &. X'.M : ,.~.^./.V.!.^.^.^.^.^.!.[.l.  G.[.V. .j O.{.|.>.< xXzXlXlX",
+"lXkXmX*X6XbXkXlXlXlXlXlXbX4 &..X!.x.p.f.^.~./.V.!.^.^.^.^.^.!.[.k.  G.`.R.y.j.(.Q. X:.< xXzXlXlX",
+"lXkXmX*X5XvXjXkXkXkXjXkXvX5 -.OX^.}. X|.).(._.Z./.).).).).)./.|.x.X L.].). X}.(.^.OX<.1 xXzXlXlX",
+"lXkXmX&X0XVXbXbXbXbXbXbXBX5 O.).L.P.L.P.I.I.Y.z.L.U.I.I.I.I.P.!.a.  B.R.P.L.P.I.L.(.%.1 xXzXlXlX",
+"lXkXnX:X^.+X.XXXXXXXXXXXOXn i b x c c c c c c l x c c c c c x v k w z c c c c c x b i M lXzXlXlX",
+"lXlXlXlXaXiXpXpXpXpXpXpXiXjXhXdXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdXgXkXfXdXfXfXfXfXfXdXgXlXlXlXlXlX",
+"lXlXlXlXxXxXxXxXxXxXxXxXxXzXzXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXzXzXxXxXxXxXxXxXxXxXzXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/rect-web.png b/icons/rect-web.png
new file mode 100644 (file)
index 0000000..29d5623
Binary files /dev/null and b/icons/rect-web.png differ
diff --git a/icons/rect.ico b/icons/rect.ico
new file mode 100644 (file)
index 0000000..b91f5f9
Binary files /dev/null and b/icons/rect.ico differ
diff --git a/icons/rect.rc b/icons/rect.rc
new file mode 100644 (file)
index 0000000..13f0a8b
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "rect.ico"
diff --git a/icons/samegame-16d24.png b/icons/samegame-16d24.png
new file mode 100644 (file)
index 0000000..1996137
Binary files /dev/null and b/icons/samegame-16d24.png differ
diff --git a/icons/samegame-16d4.png b/icons/samegame-16d4.png
new file mode 100644 (file)
index 0000000..2ee4390
Binary files /dev/null and b/icons/samegame-16d4.png differ
diff --git a/icons/samegame-16d8.png b/icons/samegame-16d8.png
new file mode 100644 (file)
index 0000000..ba83c36
Binary files /dev/null and b/icons/samegame-16d8.png differ
diff --git a/icons/samegame-32d24.png b/icons/samegame-32d24.png
new file mode 100644 (file)
index 0000000..2ce716b
Binary files /dev/null and b/icons/samegame-32d24.png differ
diff --git a/icons/samegame-32d4.png b/icons/samegame-32d4.png
new file mode 100644 (file)
index 0000000..37834ea
Binary files /dev/null and b/icons/samegame-32d4.png differ
diff --git a/icons/samegame-32d8.png b/icons/samegame-32d8.png
new file mode 100644 (file)
index 0000000..e0c5837
Binary files /dev/null and b/icons/samegame-32d8.png differ
diff --git a/icons/samegame-48d24.png b/icons/samegame-48d24.png
new file mode 100644 (file)
index 0000000..ac21a68
Binary files /dev/null and b/icons/samegame-48d24.png differ
diff --git a/icons/samegame-48d4.png b/icons/samegame-48d4.png
new file mode 100644 (file)
index 0000000..2ce6f47
Binary files /dev/null and b/icons/samegame-48d4.png differ
diff --git a/icons/samegame-48d8.png b/icons/samegame-48d8.png
new file mode 100644 (file)
index 0000000..40f3764
Binary files /dev/null and b/icons/samegame-48d8.png differ
diff --git a/icons/samegame-base.png b/icons/samegame-base.png
new file mode 100644 (file)
index 0000000..23a831b
Binary files /dev/null and b/icons/samegame-base.png differ
diff --git a/icons/samegame-ibase.png b/icons/samegame-ibase.png
new file mode 100644 (file)
index 0000000..23a831b
Binary files /dev/null and b/icons/samegame-ibase.png differ
diff --git a/icons/samegame-ibase4.png b/icons/samegame-ibase4.png
new file mode 100644 (file)
index 0000000..538ad05
Binary files /dev/null and b/icons/samegame-ibase4.png differ
diff --git a/icons/samegame-icon.c b/icons/samegame-icon.c
new file mode 100644 (file)
index 0000000..680df95
--- /dev/null
@@ -0,0 +1,720 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 248 2 ",
+"   c #E6E6E6",
+".  c #E2E2E2",
+"X  c #E2E2E2",
+"o  c #E2E2E2",
+"O  c #E2E2E2",
+"+  c #E2E2E2",
+"@  c #E2E2E2",
+"#  c #E1E1E2",
+"$  c #DDDEE1",
+"%  c #E2DDDE",
+"&  c #E0DEDD",
+"*  c #DEE1DE",
+"=  c #E6E6E6",
+"-  c #E2E2E2",
+";  c gray87",
+":  c #E2E2E2",
+">  c #E1E1E1",
+",  c #E2E2E2",
+"<  c #E2E2E2",
+"1  c #E2E2E2",
+"2  c #E2E2E2",
+"3  c #DEE0DE",
+"4  c #E9E3EA",
+"5  c #BAD0B7",
+"6  c #169B0E",
+"7  c #E2362B",
+"8  c #A14E26",
+"9  c #2CA13B",
+"0  c #E6E3E2",
+"q  c #E2E2E2",
+"w  c #E2E2E2",
+"e  c gray91",
+"r  c #E7E7E7",
+"t  c #E7E7E7",
+"y  c #E7E7E7",
+"u  c #E7E7E7",
+"i  c #E7E7E7",
+"p  c #ECE8EF",
+"a  c #F9F5ED",
+"s  c #C3CDD4",
+"d  c #054A99",
+"f  c #EB1329",
+"g  c #9B3D04",
+"h  c #0F9C25",
+"j  c #E6E3E2",
+"k  c #E2E2E2",
+"l  c #E1E1E1",
+"z  c #E7E7E7",
+"x  c #E6E6E6",
+"c  c #E6E6E6",
+"v  c #E6E6E6",
+"b  c #E6E6E6",
+"n  c #E4E5E5",
+"m  c #C2D5C3",
+"M  c #CBD3DA",
+"N  c #9C99F0",
+"B  c #0005FF",
+"V  c #BF1468",
+"C  c #9B4426",
+"Z  c #468D30",
+"A  c #E6E3E3",
+"S  c #E6E6E6",
+"D  c #E5E6E5",
+"F  c #E9E7E9",
+"G  c #DCE0E0",
+"H  c #1F9E06",
+"J  c #12449C",
+"K  c #0100FF",
+"L  c #0B05F8",
+"P  c #000DFF",
+"I  c #771597",
+"U  c #FF241E",
+"Y  c #E3E2E7",
+"T  c #E2E2E2",
+"R  c #E1E1E2",
+"E  c #E7E7E7",
+"W  c #E6E6E6",
+"Q  c #E6E6E6",
+"!  c #E5E5E6",
+"~  c #E8E8E6",
+"^  c #DCDDE5",
+"/  c #2637D9",
+"(  c #0304FB",
+")  c #1221DB",
+"_  c #157E45",
+"`  c #C72142",
+"'  c #9C3F27",
+"]  c #3D902D",
+"[  c #E6E3E3",
+"{  c #E2E2E2",
+"}  c #E4E4E1",
+"|  c #E8E8E7",
+" . c #E6E6E6",
+".. c #E6E6E6",
+"X. c #E5E5E6",
+"o. c #E9E8E8",
+"O. c #E0E0E6",
+"+. c #2649B4",
+"@. c #0A34AA",
+"#. c #19587C",
+"$. c #059200",
+"%. c #992B63",
+"&. c #923549",
+"*. c #6D7D2B",
+"=. c #E5E3E4",
+"-. c #E2E2E2",
+";. c #D9D9E3",
+":. c #E0E0E8",
+">. c #E3E3E6",
+",. c #E6E6E6",
+"<. c #E6E6E6",
+"1. c gray90",
+"2. c #D3DED2",
+"3. c #1B9215",
+"4. c #088900",
+"5. c #0F860A",
+"6. c #1F870A",
+"7. c #0131EA",
+"8. c #740C9B",
+"9. c #FF2311",
+"0. c #E3E2E7",
+"q. c #E1E1E2",
+"w. c #2020F7",
+"e. c #9A9AEF",
+"r. c #FFFFE3",
+"t. c #DFE1E3",
+"y. c #F3ECF3",
+"u. c #9EC69F",
+"i. c #08800E",
+"p. c #089300",
+"a. c #0C4AAA",
+"s. c #4B16D6",
+"d. c #FF110A",
+"f. c #FD0F06",
+"g. c #FF0100",
+"h. c #FD2124",
+"j. c #E8E3E2",
+"k. c #DFDFE2",
+"l. c #1717F8",
+"z. c #3030FB",
+"x. c #8A8AF0",
+"c. c #E5E7E2",
+"v. c #F5EBF5",
+"b. c #92C394",
+"n. c #007B00",
+"m. c #B85100",
+"M. c #4C20B0",
+"N. c #181DDD",
+"B. c #7D6B00",
+"V. c #76189A",
+"C. c #6D2D6B",
+"Z. c #747C25",
+"A. c #E4E3E5",
+"S. c #DDDDE3",
+"D. c #1F1FF5",
+"F. c blue",
+"G. c #3636F9",
+"H. c #E9EAE3",
+"J. c #F2EBF1",
+"K. c #96BCAB",
+"L. c #156845",
+"P. c #E31742",
+"I. c #6B249F",
+"U. c #0D47B9",
+"Y. c #11853A",
+"T. c #0C3CD6",
+"R. c #1D4F8E",
+"E. c #518F21",
+"W. c #E2E3E6",
+"Q. c #DDDDE3",
+"!. c #2520F7",
+"~. c #3B3BF8",
+"^. c #F2F1E5",
+"/. c #FBFBE4",
+"(. c #9E9BEE",
+"). c #0000FC",
+"_. c #0904FF",
+"`. c #126E63",
+"'. c #138234",
+"]. c #2800FF",
+"[. c #0F8A37",
+"{. c #7E5C02",
+"}. c #FF192C",
+"|. c #E4E5E2",
+" X c #DDDDE1",
+".X c #2D912E",
+"XX c #113FA3",
+"oX c #0D05FF",
+"OX c #383AF6",
+"+X c #3A3BF8",
+"@X c #201EFE",
+"#X c #0A0CF5",
+"$X c #008451",
+"%X c #9E4D1D",
+"&X c #C83B18",
+"*X c #038B3D",
+"=X c #0C42CC",
+"-X c #7F1981",
+";X c #FF2213",
+":X c #E4E3E6",
+">X c #DDDDE2",
+",X c #25696E",
+"<X c #0928C1",
+"1X c blue",
+"2X c #0202FB",
+"3X c #310ADA",
+"4X c #871685",
+"5X c #785A08",
+"6X c #932D57",
+"7X c #9A1C6E",
+"8X c #806400",
+"9X c #1817E7",
+"0X c #4222A0",
+"qX c #AB621A",
+"wX c #E3E2E7",
+"eX c #DEDEE3",
+"rX c #3B31F8",
+"tX c #1B17FF",
+"yX c #2424FC",
+"uX c #2825F9",
+"iX c #1523FF",
+"pX c #8336A8",
+"aX c #FF2306",
+"sX c #FF1A17",
+"dX c #6830BB",
+"fX c #3B2FE1",
+"gX c #FF271A",
+"hX c #5326E9",
+"jX c #1A5EA6",
+"kX c #32AF30",
+"lX c #E3E3E6",
+"zX c #E6E6E6",
+"xX c #E2E4E3",
+"cX c #E2E3E6",
+"vX c #E2E2E8",
+"bX c #E2E2E8",
+"nX c #E2E2E8",
+"mX c #E3E2E7",
+"MX c #E4E2E6",
+"NX c #E3E4E2",
+"BX c #E6E3E3",
+"VX c #E6E3E3",
+"CX c #E3E5E2",
+"ZX c #E3E3E7",
+"AX c #E4E3E6",
+"SX c #E7E3E2",
+"DX c #E6E6E6",
+"FX c white",
+/* pixels */
+"  . X o O O O O + @ # $ % & * = ",
+"- ; : > , < 1 2 3 4 5 6 7 8 9 0 ",
+"q w e r t y u i p a s d f g h j ",
+"k l z x c v b n m M N B V C Z A ",
+"O , t c S D F G H J K L P I U Y ",
+"T R E W Q ! ~ ^ / ( ) _ ` ' ] [ ",
+"{ } |  ...X.o.O.+.@.#.$.%.&.*.=.",
+"-.;.:.>.,.<.1.2.3.4.5.6.7.8.9.0.",
+"q.w.e.r.t.y.u.i.p.a.s.d.f.g.h.j.",
+"k.l.z.x.c.v.b.n.m.M.N.B.V.C.Z.A.",
+"S.D.F.G.H.J.K.L.P.I.U.Y.T.R.E.W.",
+"Q.!.F.~.^./.(.)._.`.'.].[.{.}.|.",
+" X.XXXoXOX+X@X#X$X%X&X*X=X-X;X:X",
+">X,X<X1X2XF.3X4X5X6X7X8X9X0XqXwX",
+"eXrXtXyXuXiXpXaXsXdXfXgXhXjXkXlX",
+"zXxXcXvXbXnXmXMXNXBXVXCXZXAXSXDX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 185 2 ",
+"   c #007600",
+".  c #007C01",
+"X  c #2E7E0E",
+"o  c #17792C",
+"O  c #217F39",
+"+  c #7B5D19",
+"@  c #4A7C15",
+"#  c #606817",
+"$  c #4B7E27",
+"%  c #1D7846",
+"&  c #247B4B",
+"*  c #257A51",
+"=  c #195C78",
+"-  c #1D6D64",
+";  c #1D7172",
+":  c #2B746A",
+">  c #326F7A",
+",  c #517A71",
+"<  c #FF0000",
+"1  c #FE090A",
+"2  c #FF1F0C",
+"3  c #FF0F17",
+"4  c #FF1013",
+"5  c #FF1B15",
+"6  c #F51D1D",
+"7  c #FB161B",
+"8  c #D32D14",
+"9  c #EB2C16",
+"0  c #E93918",
+"q  c #EB1D2E",
+"w  c #F51A22",
+"e  c #D4392A",
+"r  c #E32F24",
+"t  c #FF2C25",
+"y  c #FA292E",
+"u  c #FF3327",
+"i  c #E3223B",
+"p  c #E72933",
+"a  c #F32E31",
+"s  c #FB3132",
+"d  c #FC3A3F",
+"f  c #BD441F",
+"g  c #BB512D",
+"h  c #BF4B37",
+"j  c #B14F27",
+"k  c #A56234",
+"l  c #BF235E",
+"z  c #A51F7B",
+"x  c #B92A6D",
+"c  c #A7207D",
+"v  c #BC3576",
+"b  c #D3234C",
+"n  c #D82F41",
+"m  c #D22857",
+"M  c #E32B46",
+"N  c #B65D42",
+"B  c #86784C",
+"V  c #93724C",
+"C  c #8D7260",
+"Z  c #C94E4F",
+"A  c #DA5C4C",
+"S  c #C9475E",
+"D  c #D94C6D",
+"F  c #018200",
+"G  c #028C00",
+"H  c #0B830C",
+"J  c #008B0A",
+"K  c #058A07",
+"L  c #059307",
+"P  c #139407",
+"I  c #1D8C1E",
+"U  c #168616",
+"Y  c #099317",
+"T  c #22930E",
+"R  c #23931D",
+"E  c #1B8921",
+"W  c #1E8620",
+"Q  c #1E8332",
+"!  c #1C942C",
+"~  c #238B23",
+"^  c #3B8422",
+"/  c #3C8C2B",
+"(  c #229620",
+")  c #32922F",
+"_  c #228639",
+"`  c #249232",
+"'  c #329531",
+"]  c #319A30",
+"[  c #339F3B",
+"{  c #528939",
+"}  c #198F44",
+"|  c #298A47",
+" . c #3B885E",
+".. c #499D49",
+"X. c #529254",
+"o. c #49A348",
+"O. c #59A859",
+"+. c #988151",
+"@. c #86894F",
+"#. c #723CAD",
+"$. c #6535BF",
+"%. c #6B27B6",
+"&. c #22539A",
+"*. c #2B6983",
+"=. c #256883",
+"-. c #376C8D",
+";. c #224FA0",
+":. c #2A5BA4",
+">. c #2753A2",
+",. c #274AB6",
+"<. c #294ABA",
+"1. c #2B58BE",
+"2. c #3057A5",
+"3. c #3460AB",
+"4. c #535D9D",
+"5. c #7F4B94",
+"6. c #4259B6",
+"7. c #446AAB",
+"8. c #4973A3",
+"9. c #293BD2",
+"0. c #233AD3",
+"q. c #0101FE",
+"w. c #0B02FF",
+"e. c #010DFF",
+"r. c #0E0AFE",
+"t. c #130EFF",
+"y. c #1609FF",
+"u. c #0A14FF",
+"i. c #0315FF",
+"p. c #1719FC",
+"a. c #2D1CED",
+"s. c #1D29FF",
+"d. c #1B28E4",
+"f. c #2327EB",
+"g. c #2323F1",
+"h. c #2823FE",
+"j. c #222CFC",
+"k. c #2E2EFC",
+"l. c #2020FB",
+"z. c #2E39FF",
+"x. c #3537FC",
+"c. c #3C34ED",
+"v. c #4C18DC",
+"b. c #5333D7",
+"n. c #403AFF",
+"m. c #3D47DA",
+"M. c #4A4AEF",
+"N. c #4A4AF6",
+"B. c #6363F4",
+"V. c #6B6BF3",
+"C. c #9D368E",
+"Z. c #A6368C",
+"A. c #8128A2",
+"S. c #8639A7",
+"D. c #984C96",
+"F. c #9348A0",
+"G. c #9851B1",
+"H. c #854FC3",
+"J. c #638DA0",
+"K. c #9CBF9C",
+"L. c #97C397",
+"P. c #A3C7A6",
+"I. c #B1CCB7",
+"U. c #9C9CEE",
+"Y. c #B8B9EB",
+"T. c #A9A7F0",
+"R. c #DCDCDC",
+"E. c #D5D5D5",
+"W. c #DDE2DD",
+"Q. c #E4E4DF",
+"!. c #D8D8E8",
+"~. c #C8C8E9",
+"^. c #DFE4E4",
+"/. c #E5E5E5",
+"(. c #E8E7E7",
+"). c #ECECE6",
+"_. c #E7E7E8",
+"`. c #E9E5E9",
+"'. c #E7ECEC",
+"]. c #E9E9E9",
+"[. c #E7E8E7",
+"{. c #F1EDED",
+"}. c #F4F4E4",
+"|. c #FFFFE3",
+" X c #F3ECF3",
+/* pixels */
+"/./.(.(.(._._._._._.(.(.(.(.(.[.[.(.(.[.`.(.(.`.(.(.[./._./././.",
+"[./.Q.!.Q.Q.!.Q.Q./.Q.!./.Q.R././.R.Q./.R./././.!./.^./././.(./.",
+"[.R.E.Q.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.`.K.U ! h 6 s { U ..[._.",
+"[./.R.].(.(.(.(.[.[.[.[././.[.[.(.(._._. XL.  J j < 4 ^   ' ]./.",
+"/.Q.R.[.[./.[./._./.[.[./././.[._./././. XP.o } h < 4 ^ . ' '.(.",
+"[./.R.[.[./.(././.(././._.[././././././.).U.q.u.x < 3 ^   ' ].(.",
+"[./.R.(./.[./.(.(./.[./.[././.[. X{.{.).|.U.q.e.x < 4 ^ F ' '.(.",
+"(.R.R.(./././.[./.[././.[./././.I.P.I.T.Y.V.q.q.A.x v B # @.].(.",
+"(.R.R.(.[././.[./.(./._._./.[.Q.W   & r.q.q.q.q.q.q.u.i < s './.",
+"[./.R.[./.(.[./.(./.[./././.[./.( F | r.q.q.q.q.q.q.u.i < s './.",
+"(.!.R.(._./.[./.[./././._./././.7.&.,.w.q.9.> =.D.c C.V + +.]./.",
+"(./.R.[./.(./._././.(.[./././.^.p.q.q.q.q.:.G L j < 4 ^ F ' './.",
+"(.Q.R.(._._.(./.(././.(./._.[./.h.w.r.r.w.2.F J j < 5 / G [ ].(.",
+"/.Q.R._./././././._.[./././././. .% & & & _ . G 4.v.b.Z 8 A [.`.",
+"[.R.R.[././._._.(././.(._./.[./.I F F F . . . G ,.q.u.i < s '.(.",
+"[./.R././._./././.[.[././././.W.E   H E I I W T 6.y.k.i < s [./.",
+"[.Q.c.r.N.)./././.[././. XO.U ~ H F | h.u.S.2 6 6 w w 1 < s [./.",
+"[./.g.q.x.}.).)././.[./. Xo.  F F F & w.q.#.< < < < < 1 < s '.(.",
+"[.Q.f.q.k.~.Y.!.[./././. Xo.  H $ @ , w.q.#.0 e n b b e 8 A [./.",
+"_.Q.g.q.q.w.q.B.}./././. X..  ~ y < b i.q.:.L L 1.q.p.} K [ './.",
+"_.Q.g.q.q.e.q.B.}./././. Xo.F R 6 < b e.q.>.G G ,.q.t._ F ] ]./.",
+"_.Q.g.q.q.w.q.B.}./././.).J.= -.C.z D.:.>.8.*.*.8.>.3.B + +.].(.",
+"[.Q.g.q.q.q.q.B.}.!.^.^.).M.q.w.q.q.0.P G *.q.q.: G Y r < s ]._.",
+"_.Q.g.q.q.q.q.V.|.}.}.}.|.M.q.w.w.q.9.P G *.q.w.: G Y r < s ]./.",
+"/./., - -.r.q.k.V.B.B.B.V.p.q.p.> - , g f C ; : 7.,.1.p < s [.(.",
+"/./.~ F Q u.q.q.q.q.q.q.q.q.q.p.~ F $ 1 < j K L ,.q.e.i < s './.",
+"(.Q.) F | t.q.q.r.q.q.q.q.u.e.j.` K { 5 1 k Y P <.q.u.M < d '.(.",
+"(./.m.d.f.q.q.q.q.q.q.q.e.v q i r 9 S c.a.F.9 0 $.q.t.X.T X.]./.",
+"_.W.g.q.w.q.q.q.q.q.q.q.e.b < < < < b e.q.A.< < %.q.t._   / ].(.",
+"_./.M.k.x.k.k.k.k.k.k.k.z.D t s s t D x.j.G.u u H.s.n.X.~ O.`.(.",
+"/./.[.).).).).).).).).[.).'.].'.'.'.'.).].).'.'.[.).].].].].(./.",
+"(././._._././._._./._._./././.(./././._./././.(./._./.(.(././.(."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 164 2 ",
+"   c #007600",
+".  c #007C00",
+"X  c #FE0000",
+"o  c #FF150D",
+"O  c #FF1415",
+"+  c #FF1C15",
+"@  c #FF1519",
+"#  c #FE1B1C",
+"$  c #EF251F",
+"%  c #FD201D",
+"&  c #F2221E",
+"*  c #FC1E23",
+"=  c #EC2424",
+"-  c #EF2B27",
+";  c #EF242F",
+":  c #EF2F2A",
+">  c #F62326",
+",  c #FA2425",
+"<  c #F42926",
+"1  c #F82827",
+"2  c #F2252F",
+"3  c #F02E29",
+"4  c #EF302A",
+"5  c #FF392E",
+"6  c #F22730",
+"7  c #FF3634",
+"8  c #FE3538",
+"9  c #F63F3F",
+"0  c #FD3C3C",
+"q  c #FC3E36",
+"w  c #F4453B",
+"e  c #F9413C",
+"r  c #ED3D40",
+"t  c #F63D44",
+"y  c #DF4C48",
+"u  c #EF4943",
+"i  c #EF434E",
+"p  c #EA4C4C",
+"a  c #F2434A",
+"s  c #EA4A51",
+"d  c #FE5353",
+"f  c #F85857",
+"g  c #F85759",
+"h  c #F35E5A",
+"j  c #F45960",
+"k  c #038103",
+"l  c #158F0F",
+"z  c #0C8B13",
+"x  c #178D15",
+"c  c #1B8E14",
+"v  c #158E1B",
+"b  c #1C8D1B",
+"n  c #16911D",
+"m  c #1F901C",
+"M  c #218C1D",
+"N  c #21901E",
+"B  c #1D8D22",
+"V  c #1F8C2B",
+"C  c #208620",
+"Z  c #248D25",
+"A  c #2C8B24",
+"S  c #258C2B",
+"D  c #2B8C2A",
+"F  c #308B26",
+"G  c #328C29",
+"H  c #259025",
+"J  c #299229",
+"K  c #2F9F2F",
+"L  c #359B2E",
+"P  c #278B30",
+"I  c #298E31",
+"U  c #2B9E37",
+"Y  c #359C34",
+"T  c #3A9E34",
+"R  c #3C963E",
+"E  c #319E3A",
+"W  c #3C9C3B",
+"Q  c #38A02B",
+"!  c #40973B",
+"~  c #439B39",
+"^  c #439C37",
+"/  c #4D9447",
+"(  c #419C43",
+")  c #4C9A42",
+"_  c #449B4A",
+"`  c #4D9A4B",
+"'  c #529A47",
+"]  c #52974E",
+"[  c #489450",
+"{  c #479A52",
+"}  c #519750",
+"|  c #4CA14D",
+" . c #51A94B",
+".. c #4DA952",
+"X. c #57A157",
+"o. c #53A955",
+"O. c #5CA858",
+"+. c #68B368",
+"@. c #0101FF",
+"#. c #0A0AFE",
+"$. c #0E17FF",
+"%. c #1515FE",
+"&. c #1917FF",
+"*. c #1419FF",
+"=. c #1B1BFD",
+"-. c #201EFE",
+";. c #1F22F6",
+":. c #1E21FE",
+">. c #252AEF",
+",. c #292AEC",
+"<. c #3429EF",
+"1. c #2B30EF",
+"2. c #3E3BEB",
+"3. c #2224F5",
+"4. c #2C26F4",
+"5. c #262AF5",
+"6. c #292DF2",
+"7. c #2222FC",
+"8. c #2A2AFA",
+"9. c #3229F2",
+"0. c #2B30F0",
+"q. c #3C3EF6",
+"w. c #3535FD",
+"e. c #3833FF",
+"r. c #313AFD",
+"t. c #3C3BFD",
+"y. c #4B3EF0",
+"u. c #413CFB",
+"i. c #3C40F8",
+"p. c #474AE1",
+"a. c #4245EB",
+"s. c #4F44EC",
+"d. c #464AEF",
+"f. c #484FEA",
+"g. c #504CE6",
+"h. c #5247EC",
+"j. c #5849E8",
+"k. c #5757EB",
+"l. c #4244F4",
+"z. c #4943F1",
+"x. c #4349F0",
+"c. c #4140FB",
+"v. c #4948F8",
+"b. c #4E52FF",
+"n. c #5C5CF4",
+"m. c #5355FC",
+"M. c #CECECE",
+"N. c #D7D8D7",
+"B. c #DBDBDB",
+"V. c #D4D6D4",
+"C. c #E5E5DC",
+"Z. c #DEDEE7",
+"A. c #D7D7E8",
+"S. c #DCE5E5",
+"D. c #E6E6E6",
+"F. c #E8E7E7",
+"G. c #E7E8E7",
+"H. c #E9E9E6",
+"J. c #E6E6E8",
+"K. c #E8E7E8",
+"L. c #E9E9E9",
+"P. c #F1F1E8",
+"I. c #F1EDF1",
+"U. c #E8F1F1",
+/* pixels */
+"D.D.D.D.G.D.D.G.D.D.D.D.D.D.F.J.D.D.D.J.F.D.J.D.D.D.D.D.D.D.D.D.D.D.F.D.D.D.D.D.D.D.D.D.D.D.D.D.",
+"D.D.D.D.D.D.D.D.G.F.G.D.D.D.F.L.D.D.D.D.L.L.D.D.D.D.D.D.G.D.D.D.D.D.D.D.D.D.D.D.D.D.G.D.D.D.G.D.",
+"D.D.D.D.L.J.L.L.L.L.L.L.F.F.L.L.L.J.L.L.L.L.L.L.L.J.F.G.L.J.L.L.D.D.D.L.L.D.D.G.D.F.G.D.D.D.G.D.",
+"D.D.D.G.Z.C.B.B.Z.B.B.B.B.C.B.B.B.C.B.B.B.B.B.B.B.C.Z.B.B.C.B.B.Z.D.D.Z.D.S.S.S.Z.F.Z.D.D.D.D.D.",
+"D.D.G.Z.M.B.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.N.R A C / r = = y ! A C X.L.D.D.D.",
+"D.D.G.B.N.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.L.G.L.L.L.D.b . . G # X X : v   . R I.D.D.D.",
+"D.D.L.C.N.G.G.D.D.D.D.D.D.D.D.D.J.D.D.D.F.D.D.D.D.D.D.D.D.D.F.Z.b   . G * X X 4 b k . W I.D.D.G.",
+"D.D.L.B.N.L.D.G.D.D.D.D.F.D.G.D.J.J.D.D.J.D.D.D.D.G.D.D.D.D.D.D.L c l ~ # X X : v . . W I.D.D.D.",
+"D.D.L.B.N.L.D.D.D.D.D.D.G.D.D.D.G.D.D.G.D.D.D.D.D.D.D.D.D.D.D.D.a.>.5.g.+ X X : n k . W I.D.D.D.",
+"G.D.L.B.N.L.D.F.J.D.D.D.D.D.D.D.D.D.D.D.D.D.G.D.D.G.D.D.G.D.G.Z.=.@.@.4.% X X 4 n . . W I.D.D.G.",
+"D.D.L.B.N.L.D.D.D.D.D.D.D.D.D.L.D.D.D.D.G.D.D.D.D.D.D.D.D.D.D.Z.:.@.@.9.+ X X 4 v . . R I.D.D.D.",
+"D.J.L.C.N.L.D.D.D.D.D.G.D.D.D.D.G.D.D.G.D.D.D.D.L.L.L.L.H.F.P.G.=.@.@.9.5 + O w U v x ..L.D.D.D.",
+"J.D.L.B.B.L.D.D.D.L.D.D.D.D.D.D.D.D.G.D.D.G.D.D.` J J | v.8.9.8.@.@.@.#.<.<.-.j.w < & h U.D.D.D.",
+"D.D.L.B.N.L.D.D.D.D.D.D.D.G.D.D.D.D.D.D.D.D.L.D.Z . . S -.@.@.@.@.@.@.@.@.@.@.9.+ X X 0 L.D.D.D.",
+"D.D.L.B.B.L.L.D.D.D.D.D.D.D.D.D.D.D.G.D.D.D.G.D.Z . . Z 7.@.@.@.@.@.@.@.@.@.@.<.+ X X 0 U.D.D.G.",
+"D.D.L.B.N.L.D.D.D.D.D.G.D.D.G.D.G.D.D.D.D.D.D.D.W c c ( 7.@.@.#.-.-.=.7.=.:.*.z.7 # O d U.D.D.D.",
+"D.D.P.B.N.L.D.D.D.D.D.D.G.D.D.G.D.D.D.D.D.D.D.D.z.3.5.5.#.@.@.5.( Z B ` t > * p W D M O.L.D.G.D.",
+"D.D.D.Z.N.L.D.D.D.G.D.G.D.D.D.D.D.D.D.G.D.D.G.D.7.@.@.@.@.@.@.5.N . . D # X X 3 v .   W I.D.D.D.",
+"D.D.L.B.N.L.D.D.D.G.D.D.D.D.D.D.G.D.D.D.D.G.G.D.7.@.@.@.@.@.@.5.N . . G # X X 3 v .   W I.D.D.D.",
+"G.D.L.B.N.L.D.D.D.D.D.D.G.D.D.G.D.D.D.D.D.D.D.D.q.=.7.-.7.7.&.l.m . k J 0 # # u E b x o.L.D.D.D.",
+"D.D.L.B.N.L.D.D.D.D.D.D.G.D.D.D.D.D.D.D.D.D.D.D.( B J H S H H Z k k . I u.-.-.h.0 > # f U.D.D.D.",
+"D.D.L.B.N.L.D.D.D.G.G.D.D.D.D.D.D.D.D.G.D.D.D.D.Z . . . . . . . k k k D =.@.@.<.+ X X 0 U.D.D.D.",
+"D.D.L.C.N.L.D.D.D.D.D.D.D.D.D.D.D.D.D.D.G.D.D.G.H . k k . . k . . .   D -.@.@.9.+ X X 0 U.D.D.D.",
+"D.D.D.Z.N.G.D.D.D.G.D.D.D.D.G.D.G.D.D.D.D.D.D.D.H . k k H Z H H Z Z b _ q.-.=.h.+ X X 0 U.D.D.D.",
+"D.D.L.C.a.=.-.w.Z.H.D.D.D.D.D.D.D.D.D.D.( b H H k k . H c.=.:.z.q # , , , , , , X X X 0 U.D.D.D.",
+"D.D.F.C.,.@.@.&.Z.D.D.D.D.D.D.D.G.D.D.G.D . . . k k . D 7.@.@.4.% X X X X X X X X X X 9 U.D.D.D.",
+"D.D.F.C.,.@.@.%.Z.H.D.D.D.D.D.D.D.D.D.G.J . k k . . . Z 7.@.@.4.% X X X X X X X X X X q U.D.D.D.",
+"D.D.F.C.,.@.@.%.A.D.D.D.D.D.D.D.D.D.G.G.J . k k H H M _ -.@.@.4.e % < 1 , > > > 1 1 @ f U.D.D.D.",
+"D.D.D.C.,.@.@.@.=.7.=.w.Z.G.D.D.D.D.D.L.J . k H 9 # # a :.@.@.5.W b b _ t.=.=.d.T m v o.I.D.D.D.",
+"D.D.G.C.,.@.@.@.@.@.@.=.Z.G.D.D.D.G.D.L.J . . H , X X > 7.@.@.5.M . . P =.@.@.>.m . . W I.D.D.D.",
+"D.D.D.C.,.@.@.@.@.@.@.=.Z.H.D.D.G.D.D.L.D . . Z , X X > :.@.@.5.b . . D =.@.@.>.c .   W I.D.D.D.",
+"G.D.D.C.,.@.@.@.@.@.@.=.Z.H.D.D.D.D.D.D._ C Z _ a > > a l.3.3.x.( V Z { i.3.7.f.~ A M O.L.D.D.D.",
+"D.D.G.C.,.@.@.@.@.@.@.=.Z.D.D.D.D.D.D.G.c.&.-.=.:.:.*.i.W c c ( e.=.&.l.L b c ~ 8 # @ d U.D.D.D.",
+"D.D.G.C.,.@.@.@.@.@.@.%.Z.D.D.D.D.D.D.D.7.@.@.@.@.@.@.7.M . . D -.@.@.6.b . . G # X X 0 U.D.D.D.",
+"D.D.G.C.,.@.@.@.@.@.@.=.Z.H.D.H.H.D.H.H.5.@.@.@.@.@.@.5.Z . . S =.@.@.6.b . . G * X X 0 L.D.D.D.",
+"D.D.G.C.p.3.6.6.#.@.@.=.A.D.Z.Z.Z.Z.Z.Z.8.@.@.#.6.6.3.d.~ A A ` l.3.3.f.( S V ] @ X X 0 U.D.D.D.",
+"D.D.D.Z.! c c L 1.@.@.@.=.=.%.=.=.%.=.=.#.@.@.7.W c x ~ 8 @ @ 9 T c c ( e.&.%.y.+ X X 0 U.D.D.D.",
+"D.D.D.D.F   . c 1.@.@.@.@.@.@.@.@.@.@.@.@.@.@.7.Z . . Z , X X < B . . P =.@.@.<.+ X X 0 U.D.D.D.",
+"G.D.G.D.D .   c 1.@.@.@.@.@.@.@.@.@.@.@.@.@.@.7.Z . . A # X X < b . . I -.@.@.<.+ X X 0 U.D.D.D.",
+"D.D.G.Z.[ P P ( >.@.@.@.@.@.@.@.@.@.@.#.<.<.4.s.) A F ' i ; 2 s ) A A } =.@.@.<.w - - h L.D.D.D.",
+"D.D.J.C.y.%.=.=.@.@.@.@.@.@.@.@.@.@.@.7.q o + + @ # O t r.$.$.q.7 @ @ t =.@.@.0.K v z ..L.D.D.D.",
+"D.D.J.C.,.@.@.@.@.@.@.@.@.#.@.@.@.@.@.7.1 X X X X X X > 7.@.@.4.% X X 6 :.@.@.1.c .   W I.D.D.G.",
+"D.D.D.C.,.@.@.@.@.@.@.@.@.@.@.@.@.@.@.7.> X X X X X X > :.@.@.4.# X X 6 =.@.@.1.c     R I.D.D.D.",
+"D.D.D.C.k.w.t.t.u.t.t.t.t.t.t.t.t.t.w.m.g 7 t 0 0 t 7 g m.w.w.n.d 0 7 j b.w.w.n. .W Y +.L.D.D.D.",
+"D.D.D.D.H.P.P.P.P.P.P.L.P.P.P.P.P.P.P.H.U.L.U.U.U.U.U.U.P.P.P.L.U.U.U.U.L.P.P.P.I.L.I.I.L.D.D.D.",
+"D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.C.D.D.D.D.D.D.D.D.D.D.D.G.",
+"D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.G.G.D.D.D.D.D.D.D.D.D.D.D.D.D.D.G.D.D.D.D.L.D.D.D.G.D.D.",
+"D.D.D.J.D.G.D.D.D.D.D.D.D.D.D.D.D.D.G.D.D.D.D.D.D.D.D.D.D.J.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/samegame-web.png b/icons/samegame-web.png
new file mode 100644 (file)
index 0000000..75e9500
Binary files /dev/null and b/icons/samegame-web.png differ
diff --git a/icons/samegame.ico b/icons/samegame.ico
new file mode 100644 (file)
index 0000000..2be853a
Binary files /dev/null and b/icons/samegame.ico differ
diff --git a/icons/samegame.rc b/icons/samegame.rc
new file mode 100644 (file)
index 0000000..a6eb73b
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "samegame.ico"
diff --git a/icons/signpost-16d24.png b/icons/signpost-16d24.png
new file mode 100644 (file)
index 0000000..bf39723
Binary files /dev/null and b/icons/signpost-16d24.png differ
diff --git a/icons/signpost-16d4.png b/icons/signpost-16d4.png
new file mode 100644 (file)
index 0000000..d3772a3
Binary files /dev/null and b/icons/signpost-16d4.png differ
diff --git a/icons/signpost-16d8.png b/icons/signpost-16d8.png
new file mode 100644 (file)
index 0000000..5fa6592
Binary files /dev/null and b/icons/signpost-16d8.png differ
diff --git a/icons/signpost-32d24.png b/icons/signpost-32d24.png
new file mode 100644 (file)
index 0000000..2170410
Binary files /dev/null and b/icons/signpost-32d24.png differ
diff --git a/icons/signpost-32d4.png b/icons/signpost-32d4.png
new file mode 100644 (file)
index 0000000..5d8c1f2
Binary files /dev/null and b/icons/signpost-32d4.png differ
diff --git a/icons/signpost-32d8.png b/icons/signpost-32d8.png
new file mode 100644 (file)
index 0000000..67922bb
Binary files /dev/null and b/icons/signpost-32d8.png differ
diff --git a/icons/signpost-48d24.png b/icons/signpost-48d24.png
new file mode 100644 (file)
index 0000000..4b89454
Binary files /dev/null and b/icons/signpost-48d24.png differ
diff --git a/icons/signpost-48d4.png b/icons/signpost-48d4.png
new file mode 100644 (file)
index 0000000..b68d0c9
Binary files /dev/null and b/icons/signpost-48d4.png differ
diff --git a/icons/signpost-48d8.png b/icons/signpost-48d8.png
new file mode 100644 (file)
index 0000000..d3a7eaf
Binary files /dev/null and b/icons/signpost-48d8.png differ
diff --git a/icons/signpost-base.png b/icons/signpost-base.png
new file mode 100644 (file)
index 0000000..44cca4d
Binary files /dev/null and b/icons/signpost-base.png differ
diff --git a/icons/signpost-ibase.png b/icons/signpost-ibase.png
new file mode 100644 (file)
index 0000000..1b1e6e4
Binary files /dev/null and b/icons/signpost-ibase.png differ
diff --git a/icons/signpost-ibase4.png b/icons/signpost-ibase4.png
new file mode 100644 (file)
index 0000000..942cfab
Binary files /dev/null and b/icons/signpost-ibase4.png differ
diff --git a/icons/signpost-icon.c b/icons/signpost-icon.c
new file mode 100644 (file)
index 0000000..e4704f7
--- /dev/null
@@ -0,0 +1,643 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 227 2 ",
+"   c #A4A4A4",
+".  c gray63",
+"X  c #A1A19F",
+"o  c #9F9F9F",
+"O  c #9F9F9F",
+"+  c #9F9F9F",
+"@  c #9F9F9F",
+"#  c #A0A0A0",
+"$  c gray63",
+"%  c #A2A2A2",
+"&  c #9F9F9F",
+"*  c #9F9F9F",
+"=  c #9F9F9F",
+"-  c #9F9F9F",
+";  c gray63",
+":  c #A4A4A4",
+">  c gray63",
+",  c #CECED0",
+"<  c #DCDCE6",
+"1  c #E2E2E2",
+"2  c gray89",
+"3  c #E2E2E2",
+"4  c gray90",
+"5  c gray85",
+"6  c gray83",
+"7  c #DADADA",
+"8  c #E2E2E2",
+"9  c gray89",
+"0  c #E2E2E2",
+"q  c #E7E7E7",
+"w  c #D0D0D0",
+"e  c #A1A1A0",
+"r  c #9F9F9F",
+"t  c #E3E3E4",
+"y  c #DEDEFF",
+"u  c #F9F9FE",
+"i  c white",
+"p  c #FEFEFE",
+"a  c gray94",
+"s  c #ECECEC",
+"d  c #D2D2D2",
+"f  c #F4F4F4",
+"g  c #FDFDFD",
+"h  c gray89",
+"j  c #9F9F9F",
+"k  c #9F9F9F",
+"l  c #E1E1E2",
+"z  c #D7D7FE",
+"x  c #EFEFFB",
+"c  c #FFFFFD",
+"v  c #FDFDFD",
+"b  c #EEEEEE",
+"n  c gray90",
+"m  c #D7D7D7",
+"M  c gray95",
+"N  c #FEFEFE",
+"B  c #FBFBFB",
+"V  c #E1E1E1",
+"C  c #9F9F9F",
+"Z  c #9F9F9F",
+"A  c #E2E2E3",
+"S  c #FBFBFC",
+"D  c #EEEEEE",
+"F  c gray93",
+"G  c gray95",
+"H  c #ECECEC",
+"J  c #FEFEFE",
+"K  c #F8F8F8",
+"L  c #FDFDFD",
+"P  c gray90",
+"I  c #9F9F9F",
+"U  c #9F9F9F",
+"Y  c #E3E3E2",
+"T  c gray99",
+"R  c #D0D0D0",
+"E  c #CACACA",
+"W  c #EFEFEF",
+"Q  c #EEEEEE",
+"!  c white",
+"~  c #EAEAEA",
+"^  c #CACACA",
+"/  c #C3C3C4",
+"(  c gray86",
+")  c gray63",
+"_  c #9F9F9F",
+"`  c gray89",
+"'  c #F9F9F9",
+"]  c gray75",
+"[  c #BBBBBB",
+"{  c gray89",
+"}  c #F1F1F1",
+"|  c #E6E6E6",
+" . c #C5C5C5",
+".. c #C1C1C0",
+"X. c #DADADA",
+"o. c gray63",
+"O. c #A0A0A0",
+"+. c gray85",
+"@. c gray97",
+"#. c #EEEEEE",
+"$. c gray95",
+"%. c gray88",
+"&. c gray87",
+"*. c #E6E6E6",
+"=. c #E1E1E1",
+"-. c #F3F3F2",
+";. c #EDEEED",
+":. c gray96",
+">. c #ECECEC",
+",. c #E9E9E8",
+"<. c #DDDDDC",
+"1. c #9F9F9F",
+"2. c gray63",
+"3. c #D5D5D5",
+"4. c gray88",
+"5. c #E9E9E9",
+"6. c #EFEFEF",
+"7. c gray94",
+"8. c #F4F4F4",
+"9. c #E1E1E1",
+"0. c #9880CA",
+"q. c #9275CF",
+"w. c #967AD2",
+"e. c #9377CF",
+"r. c #9378CE",
+"t. c #9678D6",
+"y. c #9985C2",
+"u. c #A5A7A2",
+"i. c #9F9F9F",
+"p. c gray89",
+"a. c gray86",
+"s. c gray93",
+"d. c #FEFDFE",
+"f. c #F2F1F2",
+"g. c #886DC0",
+"h. c #795ABC",
+"j. c #8565CA",
+"k. c #8766CD",
+"l. c #8061C2",
+"z. c #916BE1",
+"x. c #977ECB",
+"c. c #A5A7A1",
+"v. c gray63",
+"b. c #DADADA",
+"n. c #D8D8D8",
+"m. c #F4F4F4",
+"M. c #FEFEFE",
+"N. c gray94",
+"B. c #8D73C5",
+"V. c #8766CC",
+"C. c #8D6DD1",
+"Z. c #8C6CD1",
+"A. c #896ACB",
+"S. c #936FE0",
+"D. c #9780C9",
+"F. c #A5A7A1",
+"G. c #9F9F9F",
+"H. c gray89",
+"J. c #FDFDFD",
+"K. c #FDFDFD",
+"L. c #F1F1F1",
+"P. c gray96",
+"I. c #EDEDEC",
+"U. c #967AD3",
+"Y. c #936FDF",
+"T. c #9371DB",
+"R. c #9673E0",
+"E. c #8566C5",
+"W. c #8564CD",
+"Q. c #9B82CE",
+"!. c #A4A6A0",
+"~. c #E2E2E2",
+"^. c #FBFBFB",
+"/. c #CDCDCE",
+"(. c #AAAAAA",
+"). c #E2E2E2",
+"_. c #977CD2",
+"`. c #906EDA",
+"'. c #9271D9",
+"]. c #916FD7",
+"[. c #7057A5",
+"{. c #7457B2",
+"}. c #9880C9",
+"|. c #A5A7A1",
+" X c #9F9F9F",
+".X c gray89",
+"XX c gray97",
+"oX c #C6C6C6",
+"OX c #D8D8D8",
+"+X c #E5E5E4",
+"@X c #9678D6",
+"#X c #8F6ADF",
+"$X c #926EDF",
+"%X c #8B68D4",
+"&X c #684EA0",
+"*X c #6B4DAB",
+"=X c #947BC8",
+"-X c #A6A8A2",
+";X c gray63",
+":X c #E7E7E7",
+">X c gray89",
+",X c gray88",
+"<X c gray85",
+"1X c #EAEAEA",
+"2X c #D8D8D7",
+"3X c #9986C3",
+"4X c #977ECB",
+"5X c #9780C9",
+"6X c #9A82CD",
+"7X c #927CC0",
+"8X c #927AC6",
+"9X c #9D8CC1",
+"0X c #A4A6A1",
+"qX c #9F9F9F",
+"wX c #9F9F9F",
+"eX c #A0A0A0",
+"rX c gray63",
+"tX c gray62",
+"yX c #A0A0A0",
+"uX c #A5A6A2",
+"iX c #A5A7A1",
+"pX c #A5A7A1",
+"aX c #A4A6A0",
+"sX c #A6A8A3",
+"dX c #A6A8A2",
+"fX c #A4A6A1",
+"gX c #A4A4A4",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+"> , < 1 2 3 4 5 6 7 8 9 0 q w e ",
+"r t y u i p i a s d f i g i h j ",
+"k l z x c v i b n m M N B i V C ",
+"Z A i S i D F G H i J i K L P I ",
+"U Y i T i R E W Q i ! ~ ^ / ( ) ",
+"_ ` i i ' ] [ { } i i |  ...X.o.",
+"O.+.@.#.$.%.&.*.=.-.;.:.>.,.<.1.",
+"2.3.4.5.6.7.8.9.0.q.w.e.r.t.y.u.",
+"i.p.a.s.i d.i f.g.h.j.k.l.z.x.c.",
+"v.b.n.m.i M.i N.B.V.C.Z.A.S.D.F.",
+"G.H.i J.K.L.P.I.U.Y.T.R.E.W.Q.!.",
+"= ~.i ^.i /.(.)._.`.'.].[.{.}.|.",
+" X.Xi i XXoXOX+X@X#X$X%X&X*X=X-X",
+";Xw :X>X,X<X1X2X3X4X5X6X7X8X9X0X",
+": e qXwXeXrXtXyXuXiXpXaXsXdXfXgX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 238 2 ",
+"   c #614A91",
+".  c #634C92",
+"X  c #634C93",
+"o  c #644C95",
+"O  c #644C96",
+"+  c #654D97",
+"@  c #654D98",
+"#  c #664E98",
+"$  c #674F9B",
+"%  c #6C52A1",
+"&  c #6D53A3",
+"*  c #6E54A4",
+"=  c #7055A7",
+"-  c #7257A9",
+";  c #755BAE",
+":  c #7457B2",
+">  c #755AB0",
+",  c #775CB1",
+"<  c #785BB3",
+"1  c #785CB2",
+"2  c #7B5FB7",
+"3  c #7859BA",
+"4  c #7E61BD",
+"5  c #7F61BE",
+"6  c #7D5EC0",
+"7  c #8062BE",
+"8  c #8163C0",
+"9  c #8263C2",
+"0  c #8160C7",
+"q  c #8365C5",
+"w  c #8567C5",
+"e  c #8566C6",
+"r  c #8567C6",
+"t  c #8566C7",
+"y  c #8568C5",
+"u  c #8667C9",
+"i  c #8563CD",
+"p  c #8A6ACD",
+"a  c #8A6ACE",
+"s  c #8B6ACF",
+"d  c #8F78C1",
+"f  c #9179C4",
+"g  c #9179C5",
+"h  c #927AC4",
+"j  c #927AC5",
+"k  c #927BC5",
+"l  c #9178C7",
+"z  c #937AC6",
+"x  c #937BC6",
+"c  c #937BC7",
+"v  c #9177C8",
+"b  c #9278C8",
+"n  c #8A68D1",
+"m  c #8C6BD1",
+"M  c #8C6CD2",
+"N  c #8D6CD3",
+"B  c #8C6AD6",
+"V  c #8E6ED4",
+"C  c #8F6BD9",
+"Z  c #8F6CD9",
+"A  c #906ED6",
+"S  c #906FD7",
+"D  c #916FD8",
+"F  c #916FD9",
+"G  c #906DDB",
+"H  c #906CDD",
+"J  c #916DDD",
+"K  c #926FDD",
+"L  c #906CDE",
+"P  c #916CDE",
+"I  c #926EDE",
+"U  c #936EDF",
+"Y  c #9170D8",
+"T  c #9170D9",
+"R  c #9271D8",
+"E  c #9270D9",
+"W  c #9271D9",
+"Q  c #9372D8",
+"!  c #9270DA",
+"~  c #9271DA",
+"^  c #9270DB",
+"/  c MediumPurple",
+"(  c #9371DB",
+")  c #9371DC",
+"_  c #9573DE",
+"`  c #9573DF",
+"'  c #9674DE",
+"]  c #8E67E1",
+"[  c #916AE3",
+"{  c #936FE0",
+"}  c #936EE1",
+"|  c #936EE2",
+" . c #956EE7",
+".. c #9570E2",
+"X. c #9774E1",
+"o. c #9D9D9D",
+"O. c #9D9D9E",
+"+. c gray62",
+"@. c #9F9F9F",
+"#. c #A09F9F",
+"$. c #A5A79F",
+"%. c #9583B9",
+"&. c #9C8EBA",
+"*. c #9C8EBB",
+"=. c #9C8CBD",
+"-. c #9C8DBD",
+";. c #9D8EBC",
+":. c #9E8FBD",
+">. c #9E8FBE",
+",. c #9D92B2",
+"<. c #9D92B3",
+"1. c #A19AAF",
+"2. c #A0A0A0",
+"3. c gray63",
+"4. c #A5A7A0",
+"5. c #A6A7A1",
+"6. c #A5A5A3",
+"7. c #A5A6A2",
+"8. c #A5A7A2",
+"9. c #A4A3A5",
+"0. c #A4A4A4",
+"q. c #A5A5A5",
+"w. c gray65",
+"e. c #A5A8A0",
+"r. c gray66",
+"t. c #A9A9A9",
+"y. c #AAAAAA",
+"u. c gray67",
+"i. c #ACACAC",
+"p. c gray68",
+"a. c #AEAEAE",
+"s. c #AFAFAF",
+"d. c gray69",
+"f. c #B1B1B1",
+"g. c gray70",
+"h. c #B4B4B4",
+"j. c #B5B5B4",
+"k. c gray71",
+"l. c #B9B9B9",
+"z. c #BCBCBC",
+"x. c gray",
+"c. c gray75",
+"v. c #C1C1BE",
+"b. c #BFBFF7",
+"n. c #BBBBF8",
+"m. c #C0C0C0",
+"M. c #C1C1C1",
+"N. c #C3C3C3",
+"B. c #C8C8C8",
+"V. c gray79",
+"C. c #CACACA",
+"Z. c #CACACB",
+"A. c #CBCBCB",
+"S. c #CCCCCA",
+"D. c #CCCCCB",
+"F. c #CDCDCB",
+"G. c #CFCFCA",
+"H. c #CECECB",
+"J. c #CBCBCC",
+"K. c gray80",
+"L. c #CDCDCD",
+"P. c #CDCECE",
+"I. c #CECECE",
+"U. c gray81",
+"Y. c #D0D1CD",
+"T. c #D0D0D0",
+"R. c #D2D2D2",
+"E. c LightGray",
+"W. c gray83",
+"Q. c #D6D5D6",
+"!. c #D7D7D7",
+"~. c #D8D8D8",
+"^. c #DADADA",
+"/. c gray86",
+"(. c gainsboro",
+"). c #DDDDDD",
+"_. c gray87",
+"`. c #DFDFDF",
+"'. c #E2E3DE",
+"]. c #C4C4F6",
+"[. c #C4C4F8",
+"{. c #C6C6F9",
+"}. c #CACAF8",
+"|. c #DBDBFB",
+" X c #DCDCF9",
+".X c gray88",
+"XX c #E1E1E1",
+"oX c #E2E2E2",
+"OX c #E2E2E3",
+"+X c gray89",
+"@X c #E4E6E0",
+"#X c #E5E7E1",
+"$X c #E6E7E2",
+"%X c #E4E4E4",
+"&X c gray90",
+"*X c #E6E6E6",
+"=X c #E7E7E7",
+"-X c #E6E8E1",
+";X c #E6E8E2",
+":X c #E9EAE5",
+">X c #E9EBE5",
+",X c #EAEBE5",
+"<X c #EAECE6",
+"1X c gray91",
+"2X c #E9E9E9",
+"3X c #EAEAEA",
+"4X c gray92",
+"5X c #EBEAEC",
+"6X c #ECEBEC",
+"7X c #ECECEC",
+"8X c #ECECED",
+"9X c #EEEDEF",
+"0X c #EEEEEE",
+"qX c #EFEFEF",
+"wX c #E8E8FB",
+"eX c #ECECFD",
+"rX c gray94",
+"tX c #F1F1F1",
+"yX c gray95",
+"uX c #F3F3F3",
+"iX c #F4F4F4",
+"pX c gray96",
+"aX c gray97",
+"sX c #F3F3FF",
+"dX c #F9F9F9",
+"fX c gray98",
+"gX c #FBFBFB",
+"hX c #F9F9FE",
+"jX c #FBFBFF",
+"kX c gray99",
+"lX c #FDFDFD",
+"zX c #FEFEFD",
+"xX c #FFFFFD",
+"cX c #FDFDFE",
+"vX c #FCFCFF",
+"bX c #FEFEFE",
+"nX c #FFFFFE",
+"mX c white",
+/* pixels */
+"0.0.0.0.0.0.0.r.0.0.0.$.e.r.0.0.0.0.r.0.0.0.0.0.r.0.3.0.0.0.0.0.",
+"0.0.3.@.2.@.@.@.@.@.1.o.@.@.@.3.3.@.@.@.@.@.@.@.@.@.@.@.@.3.0.0.",
+"0.3.k.L.H.H.A.A.A.A.A.A.A.B.H.z.z.L.R.L.A.A.A.A.A.A.A.A.L.k.3.0.",
+"0.@.L.mXeXsXmXmXmXmXmXmXmXmXmX).oXmX2XiXmXmXmXmXmXmXmXmXmXA.@.r.",
+"0.o.A.mX].b.mXkXfXkXkXfXkXfXmX).oX4XL.k.0XmXfXfXfXfXmXfXmXA.@.0.",
+"0.@.A.mXwX].mXmXmXmXmXmXmXmXmX.XoXmXQ.z.iXmXmXmXmXmXmXfXmXA.@.0.",
+"0.@.A.mX Xn.hXmXmXfXfXmXmXfXmX).).iX0Xl.oXmXmXkXmXmXmXfXmXA.@.0.",
+"0.@.L.hX}.]. XmXmXmXmXmXmXmXmXoXoXoXA.R.fXmXmXmXmXmXmXkXmXL.3.0.",
+"0.@.A.mXmXmXkXkXmXmXmXmXmXmXmX).).mXmXmXmXmXmXmXfXmXmXkXmXA.@.0.",
+"r.@.A.mXfXmXmXmXmXkXmXB.z.uXmX).oXmXfXfXmXmXfXmXmX2XoXmXmXA.@.0.",
+"0.@.A.mXhXmXmXmXmXmXmXz.i.yXmXoX).mXmXmXfXmXmXmXmX2Xi.&XmXA.@.0.",
+"0.@.A.mXfXmXkXmXmXaXgXz.i.0XmX).oXmXfXmXmXmXiXz.z.z.f.f.2XL.@.0.",
+"0.2.A.mXhXmXmXkXmX~.f.h.f.f.L.).).mXmXmXfXmXyXi.f.i.k.r.).L.@.0.",
+"0.@.A.mXkXkXkXmXkXmXR.i.i.c.mXoX).mXfXmXmXmXfXyXiXoXr.R.mXA.@.0.",
+"r.@.A.mXkXmXmXmXmXmXmX~.A.kXmX).oXmXmXmXmXmXmXmXmX2XQ.mXmXA.@.0.",
+"0.3.z.+X).).).'.).'.`..X).`.oXJ.G.>X@X'.;X@X@X@X@X'.;X@X>Xv.#.0.",
+"0.@.z.&X&X&XoX).oX).).).'.).+XY.%.l l c l l h z z z l k l ,.5.9.",
+"0.@.L.mXQ.).fXmXmXmXmXmXmXmXmX;Xb  .F B ..} ) F F I I ) [ ;.e.9.",
+"0.@.L.yX2Xm.L.mXfXmXhXmXmXfXmX'.l n ; 7 ) y ' s - B ( W I *.e.9.",
+"0.@.A.mXiXA.yXmXkXmXmXkXmXmXmX;Xf : 1 5 e = u ) > M ) W H *.e.9.",
+"r.@.L.yXi.A.0XmXmXmXmXkXmXkXmX;Xf 5 1 q A 5 W p = 9 W W H *.5.9.",
+"0.@.L.iX~./.&XmXkXmXmXkXmXhXmX'.l I Y I W W ( F F ) ) W H ;.e.9.",
+"0.@.A.mXmXmXmXmXmXmXmXmXmXmXmX@Xl I W W W ) F I F s M W I *.e.9.",
+"0.@.A.mXfXmXfXmXkXmX&X&X2X&XmX;Xk ) W W W F W ) s o & F H *.e.9.",
+"0.3.A.mXfXmXkXmXmXmX/.i.f.r.8X>Xl I W W F W W ..N o * ' } *.$.0.",
+"0.@.A.mXmXmXkXmXmXmXfXz.f.f.0X>Xl I W I ) W Y u 9 @ & y i *.e.9.",
+"0.@.A.mXfXmXmXmXmXiXN.r.z.i.0X>Xf F W W F W W <   @ @ o 0 ;.5.9.",
+"r.@.A.mXfXkXfXfXmX+Xr.m.mXQ.5X>Xl I W W W W W ' 2 . @ y ..*.e.9.",
+"0.@.A.mXmXmXmXmXmXmX2XfXmXmXmX;Xl [ I I I H C [  .3 6 ..] ;.5.9.",
+"0.3.k.L.A.A.A.A.A.A.U.L.A.A.L.v.,.;.*.*.*.*.;.*.*.>.>.*.;.1.5.9.",
+"0.0.0.@.@.@.@.@.@.@.@.@.o.@.@.2.5.e.$.e.e.e.e.e.e.e.4.4.5.5.9.0.",
+"0.0.0.0.0.0.0.0.r.0.0.0.0.0.0.0.9.9.9.9.9.9.9.9.9.9.9.9.9.0.0.0."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 55 1 ",
+"  c #634C94",
+". c #664E99",
+"X c #6E54A5",
+"o c #7055A7",
+"O c #7157AA",
+"+ c #7459AE",
+"@ c #775AB2",
+"# c #7B5FB7",
+"$ c #7C5FB9",
+"% c #7E61BC",
+"& c #8063BF",
+"* c #8F7ABC",
+"= c #8264C3",
+"- c #8667C8",
+"; c #8A6ACD",
+": c #8F74C7",
+"> c #8F75C8",
+", c #9176CA",
+"< c #8D6CD3",
+"1 c #8F6CD8",
+"2 c #906FD7",
+"3 c #926FDC",
+"4 c #9271DA",
+"5 c #936EE2",
+"6 c #9571E1",
+"7 c #9875E2",
+"8 c #9D9D9D",
+"9 c #A29EAA",
+"0 c #A4A4A4",
+"q c #AAA9A7",
+"w c #ADADAD",
+"e c #B2B2B2",
+"r c #BCBCBC",
+"t c #AEAEF7",
+"y c #B0B0F7",
+"u c #BEBEF7",
+"i c #BABAF8",
+"p c #C4C4C3",
+"a c #C7C8C4",
+"s c #C9CAC6",
+"d c #CDCDCD",
+"f c #CFCFD0",
+"g c #D0D0D0",
+"h c gainsboro",
+"j c #CFCFF8",
+"k c #D4D4F7",
+"l c #D5D5FA",
+"z c #DFDFFB",
+"x c #E4E4E4",
+"c c #ECECEC",
+"v c #E4E4FC",
+"b c #E8E8FB",
+"n c #F3F3F3",
+"m c #F3F3FC",
+"M c #FEFEFE",
+/* pixels */
+"000000000000000000000000000000000000000000000000",
+"000000000000000000000000000000000000000000000000",
+"00000000q00000q00q00000000000q0000q00q00w0000000",
+"000008888888888888888880088888888888888888800000",
+"0000rgggggggggggggdggfgeagfdggggddggggggfffq0000",
+"0008fMMMMMMMMMMMMMMMMMMpxMMMMMMMMMMMMMMMMMMw0000",
+"0008fMkuimMMMMMMMMMMMMMpxMprpxMMMMMMMMMMMMMw0000",
+"0008gMbltmMMMMMMMMMMMMMpxMxcreMMMMMMMMMMMMMw8000",
+"0008gMMvymMMMMMMMMMMMMMpxMxpehMMMMMMMMMMMMMw0000",
+"0008gMMvymMMMMMMMMMMMMMpxMMcapMMMMMMMMMMMMMw0000",
+"00q8gMmktvMMMMMMMMMMMMMpxnxnawmMMMMMMMMMMMMw8000",
+"0008fMjiiizMMMMMMMMMMMMrccrrrxMMMMMMMMMMMMMw0000",
+"0008gMMMMMMMMMMMMMMMMMMpxMMMMMMMMMMMMMMMMMMw0000",
+"00q8gMMMMMMMMMMMMnnMMMMpxMMMMMMMMMMMMMMMMMMw0000",
+"0008gMMMMMMMMMMMneedMMMpxMMMMMMMMMMMMcgMMMMw8000",
+"0008gMMMMMMMMMMMcwqdMMMaxMMMMMMMMMMMMcqgMMMw9000",
+"0008gMMMMMMMMMMMnewdMMMpxMMMMMMMMmncnxewgMMw0000",
+"0008gMnMMMMMMMMMcewaMmMaxMMMMMMMMxqeeeeewgMw0000",
+"00q8gMMMMMMMMMdereeerecaxMMMMMMMMxqwqweeeene8000",
+"0008gMMMMMMMMMnrweeewhMpxMMMMMMMMcaadpewenMw0000",
+"0008gMMMMMMMMMMmpweehMMaxMMMMMMMMMMMMcwenMMw0000",
+"00q8gMMMMMMMMMMMmrqhMMMrxMMMMMMMMMMMMxenMMMw0000",
+"0008gMMMMMMMMMMMMmcMMMMpxMMMMMMMMMMMMnnMMMMw8000",
+"0000epppppppppappaapppaeraaaaappaaaaasspaaaq0000",
+"0000pcxxxxxxxxxxxxxxxxcr*,,>>>>>>>>,>>:>>>:90000",
+"0008fMMmmMMMMMMMMMMMMMMa,63453545446633334490000",
+"0008gMrrepMMMMMMMMMMMMMa,57-$44444<=;43444400000",
+"0008gMcMx0cMMMMMMMMMMMMa,1%++74#44<OO44444480000",
+"0008gMMMdrnMMMMMMMMMMMMa,@+@+2=O=<6-+44433290000",
+"00q8gMMapMMMMMMMMMMMMMMa,O&%O1%X#<4%X14444490000",
+"0008gMeqdfcMMMMMMMMMMMMa,<@@%44&44;+o%4444490000",
+"00q8gMggddnMMMMMMMMMMMMa>64444444444442444290000",
+"0008gMMMMMMMMMMMMMMMMMMa,34444432441464444490000",
+"0008gMMMMMMMMMMMMMMMMMMa>44423444444;%=<44490000",
+"0008dMMMMMMMMMMnnnnnnmMa>34444434444#  %73490000",
+"00q8dMMMMMMMMMMhqeeeqxMa>34444244444%  =44200000",
+"00q8fMMMMMMMMMMMheeewxMa>32444244447%  =74490000",
+"0008fMMMMMMMMMMMceeewxMp>344444441=;#  %<-190000",
+"0008fMMMMMMMMMMceeeewxMa>54443244<X .... X200000",
+"00q8fMMMMMMMMMxeewgh0xMa>4444444442o .. O1480000",
+"0008gMMMMMMMMMcewfMMgxMa>34423344242X  O44490000",
+"00q8gMMMMMMMMMMxgMMMMMMa>323444344342XO243390000",
+"0008dMMMMMMMMMMMMMMMMMMa>44424444243421444290000",
+"0000wwwwwwwwwwwwwwwwwwwq999990909999909099000000",
+"000009808000000800800080000000080000000000080000",
+"000000000000000000000000000000000000000000000000",
+"000000000000000000000000000000000000000000000000",
+"000000000000000000000000000000000000000000000000"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/signpost-web.png b/icons/signpost-web.png
new file mode 100644 (file)
index 0000000..445ee70
Binary files /dev/null and b/icons/signpost-web.png differ
diff --git a/icons/signpost.ico b/icons/signpost.ico
new file mode 100644 (file)
index 0000000..49c9104
Binary files /dev/null and b/icons/signpost.ico differ
diff --git a/icons/signpost.rc b/icons/signpost.rc
new file mode 100644 (file)
index 0000000..818ef37
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "signpost.ico"
diff --git a/icons/singles-16d24.png b/icons/singles-16d24.png
new file mode 100644 (file)
index 0000000..becbb1f
Binary files /dev/null and b/icons/singles-16d24.png differ
diff --git a/icons/singles-16d4.png b/icons/singles-16d4.png
new file mode 100644 (file)
index 0000000..3a6c964
Binary files /dev/null and b/icons/singles-16d4.png differ
diff --git a/icons/singles-16d8.png b/icons/singles-16d8.png
new file mode 100644 (file)
index 0000000..becbb1f
Binary files /dev/null and b/icons/singles-16d8.png differ
diff --git a/icons/singles-32d24.png b/icons/singles-32d24.png
new file mode 100644 (file)
index 0000000..b7c7e98
Binary files /dev/null and b/icons/singles-32d24.png differ
diff --git a/icons/singles-32d4.png b/icons/singles-32d4.png
new file mode 100644 (file)
index 0000000..4ab6be1
Binary files /dev/null and b/icons/singles-32d4.png differ
diff --git a/icons/singles-32d8.png b/icons/singles-32d8.png
new file mode 100644 (file)
index 0000000..b7c7e98
Binary files /dev/null and b/icons/singles-32d8.png differ
diff --git a/icons/singles-48d24.png b/icons/singles-48d24.png
new file mode 100644 (file)
index 0000000..981fd0b
Binary files /dev/null and b/icons/singles-48d24.png differ
diff --git a/icons/singles-48d4.png b/icons/singles-48d4.png
new file mode 100644 (file)
index 0000000..1f933ce
Binary files /dev/null and b/icons/singles-48d4.png differ
diff --git a/icons/singles-48d8.png b/icons/singles-48d8.png
new file mode 100644 (file)
index 0000000..981fd0b
Binary files /dev/null and b/icons/singles-48d8.png differ
diff --git a/icons/singles-base.png b/icons/singles-base.png
new file mode 100644 (file)
index 0000000..bfbe38d
Binary files /dev/null and b/icons/singles-base.png differ
diff --git a/icons/singles-ibase.png b/icons/singles-ibase.png
new file mode 100644 (file)
index 0000000..a61460f
Binary files /dev/null and b/icons/singles-ibase.png differ
diff --git a/icons/singles-ibase4.png b/icons/singles-ibase4.png
new file mode 100644 (file)
index 0000000..4f1aaf2
Binary files /dev/null and b/icons/singles-ibase4.png differ
diff --git a/icons/singles-icon.c b/icons/singles-icon.c
new file mode 100644 (file)
index 0000000..696de48
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"Q.!.(.P./.^.].].].].~.).I./.^.Q.",
+"!.XXn.N.C.I.v n n c E.D.m.x.].^.",
+"/.N.Q.d.|.1..     o 0./.n.=Xl.!.",
+"I.b.0XB %Xq.  @ O O ;.gX{ 4XG.D.",
+"(.m.E.Y.oX,.X     o 9.).v.!.c.Q.",
+"Q.%Xf.6.k.(./ M x ! ).F.K.M.[.^.",
+"(.!.F.I.N.'.!.K.).H.<XqX|.tX<XE.",
+"W.x.%X^ :X2.!.M.J.|.L.rX%.Q.8XR.",
+"T.v.W.Z oX1.`.V.r.@XI.3XQ XX5XR.",
+").!.~.<XY.Q.S.K.R.b.%X4X}.4X:XE.",
+"(.3.x a l k.XX5.>.T.1X2XyX8X#XQ.",
+"].b   +   I U.k.^.A. X8Xn.-X3XE.",
+"].N   #   j ;X5.} -XH.tX( E.7XR.",
+"].b   +   A W.E.K.P.`.<X,.>X4XE.",
+"_.] j N f 3.Q.c.A.V.=X1X8X1X#XW.",
+"Q.`.[.].[.(.(.L.G.).W.E.T.E.W.!."
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"!.!.!.~.~.Q.E.E.Q.~.~.Q.E.E.E.E.E.E.E.E.Q.~.~.Q.W.E.W.!.~.!.!.!.",
+"!.!.Q.R.R.'.}.}.'.R.T./.|.}.}.}.}.}.}.|./.R.T.(.}.}.[.Q.T.Q.!.!.",
+"!.Q.`.%X*Xj.O.+.k.*X=XC. .@.+.+.+.+.@. .Z.$X>XG.*...q.|.:X_.Q.!.",
+"~.R.%XqXO.7.^.T.1.o.iXd.  X         X   u.nXe.O.I.~.s.)  X:XT.~.",
+"~.R.*XO.D.wX^.2XMXV.=.j.  + o o o o +   v.c.>.sXXX*XxX$X/ !.^.!.",
+"Q.'.k.1.CXf.Q 3 T.VX8.!   .         X   7.+.iX+Xz c qXkXH.X.{.W.",
+"E.}.@.L.gX9Xo.9  XjXQ.c o           .   / u.aXfXK.l aXwX>X_ ^.Q.",
+"E.}.@.P.sXXX_.9 x.bXE.c o           .   / u.sXuXx.f 0XeX>X_ /.Q.",
+"Q.'.k.2.MX*.G J [.mX8.~   .         X   7.+.pXXXB t ;.nXF.X.}.W.",
+"~.R.=X@.S.nXrXlXNXV.-.h.  o         o   v.b.>.jXsXdXjX&X( ~.~.!.",
+"~.R.#X5X{ 4./.!.3.[ eXs.  X X & * O X   y.lX8.} C.I.i.! ].-XT.~.",
+"!.Q._.*X6X1.d s 1.7X*XR.A.W.f.] ( 7.T.G.E.@X<XH.3.:.y. X>X_.Q.!.",
+"~.R.@XuX<.;.C.D.;.1.qX%XzXh.#.M.V.<.:.tX=X8X0XpXcXzXfXeXeX+XE.~.",
+"~.T.:X<.p.hXhX9XgXs.&.0Xe.,.uX6XrXkXV.} %X9XqX0X@X;XuX9XrXOXE.~.",
+"Q._.M.*.lXdX` > :XnX&.u.+.zX!.0 ( iXvX9.t.aXpXA.G g l.sXwXOXE.~.",
+"W.}.%.F.bXA.) f 1XgXE.k N.aXdX7.J hXyX`.o.sX0X1XvXS ..lXqXOXE.~.",
+"E.}.O.U.sXz _ = n.zX/.p S.iXlX0.K zXrX|.X.aX9XrXO./ eXqXrXOXE.~.",
+"Q.].i.e.zXm.<.3 B.VXr.o.2.nXT.d 6 a.BXx.<.sXsXz.  A t.pXwXOXE.~.",
+"!.E.@X' ^.SXzX8XBX^.^ ,X#.A.gX;X:XeX=X~ '.wXwX3X>XoX-XwXrXOXE.~.",
+"~.T.:X4X| j.XX#Xk. .>X>X5X{ e.$X:XC.Q '.:X8XwXrXyXiXtXqXtX+XE.~.",
+"!.~.P.L.A.( Z Z ( A.L.Q.%X3Xq.v h ..$X:X_.+X@X+XOXOX+X+X#X].Q.!.",
+"E.}.+.  O % $ $ & .   A.lXn.+.t.a.=.8.qX@X6X0X8X0X8X7X8XwXOXE.~.",
+"E.}.+.  o         .   E.S. .7XsXtXyXi.-.:X8XqXyX0XtXaX0XtX+XE.~.",
+"E.}.+.  o       .     c.} jXm.s Y ^.ZX-.h.iXpXH.D N J.pXwXOXE.~.",
+"E.}.+.  o           %  .g.CX9.> I |.hX^.+.dXwX@XrXD ' lXqXOXE.~.",
+"E.}.+.  o           * ) V.hX#X7XD ] nX{.o.aX7XgXd.W 7XwXrXOXE.~.",
+"E.}.+.  o           @ <.6.mXi.` s k.BXV.-.sXsXv.  D j.uXwXOXE.~.",
+"E.}.@.  @ o o o o o   P.+.~.aXR.+XvX8X/ E.eXeX&X_.U.{.eXeXOXE.~.",
+"E.}.+.  o         .   P.5X( N.7X6XR._ I.<X0XrXiXfXhXsXeXiX@XE.~.",
+"Q.).l. .@.+.+.+.+.+.o.P.:X[.%./ ) { K.>X_.OX+XOXoXoXoXOX@X'.W.!.",
+"!.Q.).|.}.}.}.}.}.}.|.^.T.Q.}.(.^.{.(.Y.Q.E.E.E.E.E.E.E.E.W.!.!.",
+"!.!.Q.E.E.E.E.E.E.E.E.!.~.!.W.Q.!.W.Q.~.!.~.~.~.~.~.~.~.~.!.!.!."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.",
+"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.",
+"!.!.!.!.!.~.~.~.!.W.E.E.W.!.~.~.~.Q.E.E.E.E.E.E.E.E.E.E.E.E.!.~.~.~.!.W.E.E.W.!.~.~.~.!.!.!.!.!.",
+"!.!.!.!.Q.R.R.Y.^.}.XXXX[.Q.Y.E.R.). X|.|.|.|.|.|.|.|.|. X}.Q.R.E.Y.Q.[.XXXX}.^.Y.R.E.!.!.!.!.!.",
+"!.!.!.Q.{.#X#X4XW.-.E ! 9.|.3XOX%Xl./ { ] ] ] ] ] ] ] [ ' ..^.%XOX3X|.9.! E -.W.4X$X+X/.Q.!.!.!.",
+"!.!.~.R.#XsXyX%.c o.r.q.( z j.jXyX>.  o               .   - _.uXjXj.x ( 0.r.O.x %.uXyX(.Q.!.!.!.",
+"!.!.~.R.#XyXJ ) 7XMXVXvXgXXXv >.kX:.  @ o o o o o o o O   > /.kX:.b XXvXNXmXjX5X) K wX).W.!.!.!.",
+"!.!.~.Y.4X%.) mX5XR.G.|.rXaXrXl S.0.  o               .   * OXS.l tXsX|.P.(.8XeXbX_ @.@XR.!.!.!.",
+"!.!.!.^.W.n 2XjXl.w g X 8.uXsXY.D 5.  o               .   - }.D U.lX#Xc X d wX9XeX6Xx A.(.Q.!.!.",
+"!.!.W.}.-.O.jX8X5X].A.O E gX7XqXU Q   X               .   4 k.H wXqX5X0XR w tXqX7XjXX.#.|.W.!.!.",
+"!.!.E.XXE y.kX6XfX>.* & T.aX6XfX} N   .               .   0 1.^ jX8X9XhXT 0 wX0X8XkXy.E XXE.!.!.",
+"!.!.E.XX! e.jX7XeXlXjXs h iX8XsX[ C   .               .   9 4.! fX8X0XVX( y vXtX7XjXw.! XXE.!.!.",
+"!.!.W.[.0.) gXtX$.U )   U pX0X5XG [   X               .   1 C.A 5XrX<X-.8 = [ .XeXhX^ 1.{.W.!.!.",
+"!.!.!.Q.|.v .XjXF. .' p.5X8XxXh.E q.  o               .   * OXW h.bX-XO.| +._ ].kX.Xl R.~.!.!.!.",
+"!.!.~.Y.3Xj.v rXbXzXkXdXeXxX{.y  X6.  O X X X X X X X o   - |.|.y }.vXxXkXhXxXlXeXv f.+XR.!.!.!.",
+"!.!.~.R.@XzX1.c Y.8XpXiX6Xk.a G.zX-.  o               .   ; /.xXF.a l.5XaXfX0XT.c 3.hX/.Q.!.!.!.",
+"!.!.~.W..X1XwXj.z P ..| C C R.wX1X8.1 r 9 w f z z f w 0 9 d /.<XqXQ.Z x T E B k l.eX>X(.Q.!.!.!.",
+"!.!.!.Q.'. X[.9XXX .d l 7.1X1X].{._.$XOX2X#Xj.%.%.j.#X2X+XoX(..X{.$X-XY.g.s.D.$X=X}. X/.!.!.!.!.",
+"!.!.~.R.$XiXfXr.c ` 2.>.U M J.cX<X.XtXhXv.b I +.@.U v v.kX5X}.yXrXeXwXiXgXhXsXeXwXtXrX).Q.!.!.!.",
+"!.!.~.R.@XfX` D OXpXlXvXpXP.s f.eX].jX:.c _.fXnXcXaX).x ,.uX].wX0X0X0XwXtXwX7X0X0XqX0X).Q.!.!.!.",
+"!.!.~.Y.4X8.J kXuXqX1X|.3XlX,Xg Z.6Xv.c tXfX:X|.&X9XdXtXb h.*X0XqX0XrX2XXX:XpXwXqXqX0X).Q.!.!.!.",
+"!.!.!.~.).b ;XyX9XqXj   F.iXgXD.M &XM ).zX_.s   K aX5XdX].l {.eX8XaXI.7 6 # 3.uX0XqX0X).Q.!.!.!.",
+"!.!.W.{.2.} jX5XjX+.t   B.fX8X9XG =.~ pX0X<XOXg N dX9X8XsXJ g.dX8XuX[.F.8XJ O 3XrX0X0X).Q.!.!.!.",
+"!.!.E.XXW t.gXpXS.V `.  T.lX5XdX..h 2.jX7XwXgXl M aX9X8XlX+.;.lX8X0XrXcX7X8 K iX0XqX0X).Q.!.!.!.",
+"!.!.E.XXW r.jXtXd Y >.  ] 4X0XsX .h 2.jX7XwXnXb S BXqX7XlX+.;.lX8X9XaX{.r _ lXtX0XqX0X).Q.!.!.!.",
+"!.!.W.{.2.} jX9X| b u   r #XyX8XG =.! iXwX-Xe.5 0 u.>XqXsXJ h.dX7XpX~.o 1 :.<.>XrXqX0X).Q.!.!.!.",
+"!.!.!.~._.b ;XuXeXlX%XD {.uXhXS.N &XM ).lX XF L J K OXjX`.l {.eX8XaXU.D R N G -XrX0X0X).Q.!.!.!.",
+"!.!.~.Y.4X8.H jXuX6X9XfXwXhX,Xd A.5Xv.x tXhXhXfXfXhXgXrXc h.*X0XqX0XyXkXhXlXkXeX0XqX0X).Q.!.!.!.",
+"!.!.~.R.+XdX` S oXaXhXsXyXP.a g.eX[.zX,.b `.uXdXdXuX`.v 2.pX].rXwXeXqX9X9X9X9XwXwXeXwX).Q.!.!.!.",
+"!.!.~.R.%XaXhXp.n ) ,.;.U C I.vX2X}.6XuXf.f T 1.1.T f f.pX>X[.6X5X5X5X5X5X5X5X5X5X5X4X(.Q.!.!.!.",
+"!.!.Q./.C.i.s.M.y.~ M C | k.b.u.k.).}._.3X$X*.g h *.%X3X`.[.(.}.{.{.{.{.{.{.{.{.{.{.{.^.!.!.!.!.",
+"!.!.E.|.]   o     o # # .   X   q #XwXhXY.G P  . .P G U.lX4X}.rXwXeXeXwXwXwXeXeXwXeXwX).Q.!.!.!.",
+"!.!.E.|.[   + X .         . o   e oXjXa.s Z.0XhXhX0XC.a f.iX].wX0XqX0X0XeXqX9XqXqXqX0X).Q.!.!.!.",
+"!.!.E.|.]   o               X   9 <XK.s 1XjX4X,X,X7XlX<Xg Z.%X0XqX0XyXyX4XwXaXqXqXqX0X).Q.!.!.!.",
+"!.!.E.|.]   o               X   q *XC L.mXY., a 2 ..tXgXY.c XXwX9XpX!.a 8 6 h.uX9XqX0X).Q.!.!.!.",
+"!.!.E.|.]   o               X   s b.K yXaXI.  ] 5.XXtX8XaXS c.sX8XiX~.p. Xn # 3XrX0X0X).Q.!.!.!.",
+"!.!.E.|.]   o               X   z *.+.hXiXT.e n X  .uX7XkXo.>.lX8X0XrXcXhXf x tXqXqX0X).Q.!.!.!.",
+"!.!.E.|.]   o               X   x #.$.lX8XwXdXSX .. &XeXkX@.-.lX8X9XpX-Xx C rXuX9XqX0X).Q.!.!.!.",
+"!.!.E.|.]   o               X   g p.W aXuXb.:.B.e w 6X0XdXY p.fX7XuX}., < a.c.1XeXqX0X).Q.!.!.!.",
+"!.!.E.|.]   o               X   e .Xn XXjXK.N d S ).tXuX@Xj _.rX8XsXF.t n u h *XtX0X0X).Q.!.!.!.",
+"!.!.E.|.]   o               X   9 3Xy.S hXgXsXuXsXrXyXjXD 8.=X0XqX0XtXsXiXaXsXwXqXqX0X).Q.!.!.!.",
+"!.!.E.|.]   o               X   q +XfX' J -XgXhXgXhX;XH { tX[.eXqXqXqX0X0X0X0XqXqXqXqX).Q.!.!.!.",
+"!.!.E.|.[   @ o o o o o o o O   e +XeXiX5.h ] r.r.] h 5.sX4X{.wX0X0X0X0X0X0X0X0X0XqX0X).Q.!.!.!.",
+"!.!.!.~.L.C.A.Z.Z.Z.Z.Z.Z.Z.Z.Z.D.^.(.(.@XL.=.W W -.L.@X(.(./.).).).).).).).).).).).).!.!.!.!.!.",
+"!.!.!.!./.).).).).).).).).).).).(.!.Q.Q.R./.}.XXXX}./.R.Q.Q.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.!.!.!.!.",
+"!.!.!.!.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.Q.!.!.!.!.Q.W.E.E.W.Q.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.",
+"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.",
+"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/singles-web.png b/icons/singles-web.png
new file mode 100644 (file)
index 0000000..992f20e
Binary files /dev/null and b/icons/singles-web.png differ
diff --git a/icons/singles.ico b/icons/singles.ico
new file mode 100644 (file)
index 0000000..a7741b4
Binary files /dev/null and b/icons/singles.ico differ
diff --git a/icons/singles.rc b/icons/singles.rc
new file mode 100644 (file)
index 0000000..5121821
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "singles.ico"
diff --git a/icons/sixteen-16d24.png b/icons/sixteen-16d24.png
new file mode 100644 (file)
index 0000000..059a43e
Binary files /dev/null and b/icons/sixteen-16d24.png differ
diff --git a/icons/sixteen-16d4.png b/icons/sixteen-16d4.png
new file mode 100644 (file)
index 0000000..ba7f494
Binary files /dev/null and b/icons/sixteen-16d4.png differ
diff --git a/icons/sixteen-16d8.png b/icons/sixteen-16d8.png
new file mode 100644 (file)
index 0000000..059a43e
Binary files /dev/null and b/icons/sixteen-16d8.png differ
diff --git a/icons/sixteen-32d24.png b/icons/sixteen-32d24.png
new file mode 100644 (file)
index 0000000..70f78b8
Binary files /dev/null and b/icons/sixteen-32d24.png differ
diff --git a/icons/sixteen-32d4.png b/icons/sixteen-32d4.png
new file mode 100644 (file)
index 0000000..dd1d871
Binary files /dev/null and b/icons/sixteen-32d4.png differ
diff --git a/icons/sixteen-32d8.png b/icons/sixteen-32d8.png
new file mode 100644 (file)
index 0000000..70f78b8
Binary files /dev/null and b/icons/sixteen-32d8.png differ
diff --git a/icons/sixteen-48d24.png b/icons/sixteen-48d24.png
new file mode 100644 (file)
index 0000000..65588f2
Binary files /dev/null and b/icons/sixteen-48d24.png differ
diff --git a/icons/sixteen-48d4.png b/icons/sixteen-48d4.png
new file mode 100644 (file)
index 0000000..4840c25
Binary files /dev/null and b/icons/sixteen-48d4.png differ
diff --git a/icons/sixteen-48d8.png b/icons/sixteen-48d8.png
new file mode 100644 (file)
index 0000000..65588f2
Binary files /dev/null and b/icons/sixteen-48d8.png differ
diff --git a/icons/sixteen-base.png b/icons/sixteen-base.png
new file mode 100644 (file)
index 0000000..e2974e0
Binary files /dev/null and b/icons/sixteen-base.png differ
diff --git a/icons/sixteen-ibase.png b/icons/sixteen-ibase.png
new file mode 100644 (file)
index 0000000..1dd073d
Binary files /dev/null and b/icons/sixteen-ibase.png differ
diff --git a/icons/sixteen-ibase4.png b/icons/sixteen-ibase4.png
new file mode 100644 (file)
index 0000000..52136ef
Binary files /dev/null and b/icons/sixteen-ibase4.png differ
diff --git a/icons/sixteen-icon.c b/icons/sixteen-icon.c
new file mode 100644 (file)
index 0000000..e625e30
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXyXyXtXtXyXyXyXtXtXyXwX0X0X0XqX",
+"yXsXpXsXaXrXiXpXsXaXrXrXrXtXeXqX",
+"yXiX:X&X;X9XrX>X=X;X9XeX,XQ.*XrX",
+"rXhXI.&.z.yXsXR.q.V.uXeXG.Z.K.0X",
+"yXpX>X$X3X9XtX1XoX,X0XeX:XR.%XrX",
+"yXrX0XrX0X6XwX0XtXqX6XrXrXeXeXqX",
+"wXeXwXrXyXpXeXwXrXtXaXpXqXtXeXqX",
+"wX9XwX9X:X=X8XqX9X>X2XyX1X^.;XrX",
+"0X8XrX2Xi.5.;XyX6Xt.*.3XK.C.K.0X",
+"qX9XwX0XOX&X7XwXqXOX&XtX*XY.@XrX",
+"qX7X0X0XeXeX8X0X0XwXuXiXrXeXeXqX",
+"qXeXtXrXwXwXeXtXtXwXeXeX0XqXqXqX",
+"0XrX,XF.:XrXeX2XG.=XtX0XqXqXqXqX",
+"0XtXQ.Z.E.eXtX^.Z.Y.eXqXqXqXqXqX",
+"0XeX*XK.%XeXeX;XK.@XeXqXqXqXqXqX",
+"qXqXrX0XrXqXqXrX0XrXqXqXqXqXqXqX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXqX9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X0XqXqXqXqXqXqXqXqXqX",
+"qXwXiXpXpXpXpXpXpXpXpXpXiXpXpXpXpXpXpXpXpXaXrXqXqXqXqXqXqXqXqXqX",
+"9XiXbXdXgXgXgXgXgXgXhXyXzXgXgXgXgXgXgXgXhXuXdX0XqXqXqX9XqXqXqXqX",
+"9XpXdX6X9X6X8X7X6X8X9X,XiX8X9X6X8X7X6X8X0X>XiXqX0X9X0XiXqXqXqXqX",
+"9XpXgX9XeXgXeXiXdX0XeX2XaXqXwXfXtXpXfXqXeX2XpX0XtXsXrXT.tXqXqXqX",
+"9XpXgX9X9XC.1X}.P.yXqX2XaX0XwXD.%X/.H.0XeX1XiXtX%XR.Y.9.L.uXwXqX",
+"9XpXgX7XaX%.F.-.( `.aX<XaX8XfX2.M.,XY +XiX<XuXpXU.M.P./.A.F.rXqX",
+"9XpXgX7XsXO.q.,.( }.pX<XaX8XfX,.0.x.! 8XrX1XuXpXY.Z.R._.G.N.eXqX",
+"9XpXgX9X8XP.].$X).uXqX2XaX0XqXR.^.^.P.4XrX1XiXyXoXH.H.r.S.rXwXqX",
+"9XpXgX8XwXdXiXtXpX9XwX1XaX0XqXsXaXpXdXwXwX1XpX0XtXsXwXD.wXeX0XqX",
+"9XpXhX0XwX0X0XqX0XwXeX1XaXqXwX0X0X0X0XqXrX1XiXqX0X9X0XiXqX0XqXqX",
+"9XpXuX,X2X1X2X1X2X1X1X<XyX<X2X1X2X1X2X1X2X>XsXqXqXqXqX9XqXqXqXqX",
+"0XeXsXaXrXhXpXaXaXaXaXdXdXaXeXgXaXaXaXaXpXgXzX9XqXqXqX0XqXqXqXqX",
+"qXqX0X9X2XaX8X0X8X0X9X8X9XqX<XpX9XqX8X0X9XqXkX9XqX9X0XiX0XqXqXqX",
+"qXqXqXqX4XsX9XeXsXeXpXpXqXwX2XaX0XwXsXrXwXfXlX9XrXaXrX_.yX0XqXqX",
+"qXqXqX0X3XaX0X7XR.4X`.).wXqX2XaX0X0XE.<X3X`.hXeX;X_.^.6.E.iXqXqX",
+"qXqXqX0X3XaX9XyX] `.] %.rXqX2XaX8XsX+.I.$.| aXpXI.c.F.!.B.U.rX0X",
+"wX6X6XqX3XaX7XsXo.x.L.F ;XtX1XaX7XgX,.u.+.H -XgXY.G.~.`.L.c.eXqX",
+"qX0X0X0X3XaXqX6Xn.W.Q.W.eXqX2XaX0X0XV.U.#XY.jXtX}.V.Z.a.B.9XeX0X",
+"qXqXqX0X3XaX9XwXgXpXpXaX0XqX2XaX9XqXfXaXrXhXlX8XtXpX0Xb.9XrX0XqX",
+"qXqXeXwX3XsXqXeX0XqXqXqXwXeX2XsXwXeX0XqXqXrXkX9XqX0X0XuXwX0XqXqX",
+"qX0X1X<X1XrX,X2X1X1X1X1X1X1X,XtX,X2X1X1X<X5XjX0XqXqXqX0XqXqXqXqX",
+"qXwXpXiXdXsXyXuXiXpXpXpXpXiXdXdXyXuXiXpXiXsXsX0XqXqXqXqXqXqXqXqX",
+"qXqXqXqX0XrXaXpXyX0XqXqXqXqX0XeXaXpXuXqXqXqX0XqXqXqXqXqXqXqXqXqX",
+"qXqXqX0XtX%XP.P.oXtX0XqXqX0XrX;XI.I.}.tX0XqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqX9XsXW.M.Z.K.aX9XqXqX9XaX`.v.F.Z.pX0XqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqX0XeXT.P.R.K.wX0XqXqX0XrX/.G.^.S.0X0XqXqXqXqXqXqXqXqXqXqXqX",
+"qXqX9XiXT.9./._.r.D.iX9X0XiX_.5.!.`.a.b.uX0XqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXtXL.A.G.S.wXqXqXqX0XyXW.B.L.B.9XwXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXuXF.N.rXeX0XqXqXqX0XiXU.c.9XrX0XqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXrXeXwX0XqXqXqXqXqXqXrXeXeX0XqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqX0XqXqXqXqXqXqXqXqXqXqXqXqXqX"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqX0X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X9X0XqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXuXpXpXpXpXpXpXpXpXpXpXpXpXaXiXiXpXpXpXpXpXpXpXpXpXpXpXpXaXeXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqX0XuXAXcXbXvXvXvXvXvXvXvXvXvXnXhXzXNXcXvXvXvXvXvXvXvXvXvXvXvXfXzX9XwXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqX9XpXcX5X9X8X8X8X8X8X8X8X8X8XqX*XwXiX6X8X8X8X8X8X8X8X8X8X8X7X&XzX9XwXqXqXqXqX9XqXqXqXqXqXqXqX",
+"qXqX9XpXbX9XwXwXwXwXwXwXwXwXwXqXtX:XtXsX9XwXwXwXwXwXwXwXwXwXwXqX;XzX9XwXqXqXqXwXpX0XqXqXqXqXqXqX",
+"qXqX9XpXvX8XwXqX9X8XqX0X8X8XqXqXrX:XrXsX9XqXqX8X9XqX9X8X0XqXqX0X-XzX9XwX0X0XqX7XQ.yXqXqXqXqXqXqX",
+"qXqX9XpXvX8XwX0XpXhXwXrXhXfXqX0XrX:XrXsX9XqXeXhXpXqXdXhXiX0XqX0X-XzX9XqXyXtXyX0X@.A.aX0XqXqXqXqX",
+"qXqX9XpXvX8X0XpXM.Q >X,X[ 8.eX0XrX:XrXsX8XrX,X` h.yX>.] '.uX0X0X-XzX7XpXL.t.l.y.c.l.N.aXqXqXqXqX",
+"qXqX9XpXvX8XqXrXXXd %X%.&.L A.fXwX:XrXsX8XqXtX&.` tX#X{ { lX8X0X-XzX7XsXb.S.Q.R.~.'.g.A.rXqXqXqX",
+"qXqX9XpXvX8XwX0XhXS :X_ m.| j.hXwX:XrXsX9X8XxXM.' VX/.R #XyX0X0X-XzX7XaXN.Y.[.`.!.~.(.>.<XrX0XqX",
+"qXqX9XpXvX8X0XpXb.3 >.R.N T :XrXeX:XrXsX8XrX<XJ a ~.z l N.uX9X0X-XzX6XsXx.d.V.n.T.^.8.XXuX0XqXqX",
+"qXqX9XpXvX8XqXeX;X=X%XiX,X7XyX0XrX:XrXsX9XwX7X&X*X,X3X$X=XeXqX0X-XzX8XyXoXG.Y.A.0.t.}.sX9XqXqXqX",
+"qXqX9XpXvX8XwXqXtXyXyX9XrXwX0XqXrX:XrXsX9XqXwXyXyXrXrXyXtXqXqX0X-XzX9XqXyXdXfXyX$..XaX8XqXqXqXqX",
+"qXqX9XpXvX8XqXqX0X0X0XqX0X0XqX0XrX;XrXaX8XqX0X0X0X0X0X0X0XqXqX0X-XzX9XwX0X9X9X7X3XuX9XqXqXqXqXqX",
+"qXqX9XpXnXqXtXrXrXrXrXrXrXrXrXrXuX<XtXfXwXrXrXrXrXrXrXrXrXrXrXrX:XzX9XwXqXqXqXqXeX0XqXqXqXqXqXqX",
+"qXqX9XaXhX*X:X:X:X:X:X:X:X:X:X;X,XXXqX8X=X:X>X;X:X:X:X:X:X:X:X-X@XzX9XwXqXqXqXqX0XqXqXqXqXqXqXqX",
+"qXqX0XuXlXeXyXqXwXtXrXrXrXrXrXrXtXeXxXiXrXrX9XtXrXrXrXrXrXrXtXwXgXvX8XwXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXiXaXfX3XlXfXaXsXsXsXsXsXaXsXiXaXdXrX0XbXiXsXsXsXsXsXsXpXlXvX8XwXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqX9X8XwX$XfXqX8X9X9X9X9X9X9X9X9X9XqX1X2XhX5X9X9X9X9X9X9X7XiXvX8XwXqXqXqXqXqX0XqXqXqXqXqXqX",
+"qXqXqXqXqXqXrX*XhXeXqXqXqX9XqXqX9X9XqXqXeX3X4XjX8XwXqX0X0XqXqX8XpXvX8XwX0X9X0X8XwXtX9XqXqXqXqXqX",
+"qXqXqXqXqX0XrX*XhXeXqX0XrXsXeXqXaXfXeX0XeX3X4XjX8XwXqXpXiXqX0XiXkXcX8XqXtXaXsXtX<.=XpX9XqXqXqXqX",
+"qXqXqXqXqX0XrX*XhXeX0XeX>XQ.1X9X).I.<XeXwX3X4XjX8XqXwX'.}.eXuX^.oXnX7XrX=X~.`.R.4.t.&XiX9XqXqXqX",
+"qXqXqXqXqX0XrX*XhXeX9XuX_.7 B.$Xq o.;XrXwX3X4XjX7XqXrX .l hXq.M A.mX5XdXl.t.v.h.I.E.8.-XuX0XqXqX",
+"qXqXqXqXqX0XrX*XhXeXqX6XMX@.M.6XX.! W.pXqX3X4XjX8X0XaX&XH jXk E 6.vX6XaXM.Y.].`.~.^.W.3.2XeXqXqX",
+"qXqXeX3X<XeXeX*XhXeX0XeX3XN =.$XU.n r.kX0X3X4XjX8X0XuXz.r %XQ | D hX8XaXn.J.(.^.^.`.b.x.qXqXqXqX",
+"qXqXqX0X0XqXrX*XhXeX9XiX_.=.7.}.5.p.8XwXwX3X4XjX7XwXqXp.$.H.,X:._.NX5XaXA.9.g.e.B.M.j.uXeX0XqXqX",
+"qXqXqXqXqX0XrX*XhXeXqX0XuXlXjXuXkXhXwXqXeX3X4XjX8XqXqXgXzXaXrXjXlXcX8XwXeX7X8X1X%.v.yXwX0XqXqXqX",
+"qXqXqXqXqX0XrX*XhXeXqXqX0X7X8X0X8X8XqXqXeX3X4XjX8XqXqX8X7X9X0X5XiXvX8XwXqXwXeX8XA.eXwX0XqXqXqXqX",
+"qXqXqXqXqX0XrX*XhXeXqXqXqXqXqXqXqXqXqXqXeX3X4XjX8XwXqXqXqXqXqX9XaXvX8XwXqXqXqXqXaXqX0XqXqXqXqXqX",
+"qXqXqXqX0X0XeX%XgXeX0X0X0X0X0X0X0X0X0X0XwX2X2XjX7XqX0X0X0X0X0X8XpXvX8XwXqXqXqXqX9XqXqXqXqXqXqXqX",
+"qXqXqX9X-X-X-X%XdX;X-X-X-X-X-X-X-X-X-X-X;X$X9XeX%X;X-X-X-X-X-X*X6XvX8XwXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXeXlXzXlXxXxXlXzXzXzXzXzXzXzXzXzXzXzXzXcXzXzXzXzXzXzXzXzXlXcXdX9XqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqX9X9X9X8X9X7X7X7X6X8X9X9X9X9X9X9X9X9X8X8X6X7X7X7X9X9X9X9X8X9XqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXwXwXwXwXqXpXsXaXdXyXqXwXwXwXwXwXwXwXqXrXdXaXsXaXqXwXwXwXwXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqX0XyXL.z.N.k.oXyX0XqXqXqXqXqX0XtX=Xl.M.c.A.eXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqX0XtXa.A.Y.g.L.sX9XqXqXqXqXqX9XpX(.i.Y.H.r.7XwXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXyXl.Q.[.V.Y.fX9XqXqXqXqXqX0XsX`.v.].(.g.9XeXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXwX7X8Xa.R._.M.F.tX7XqXqXqXqXqX8XrXW.k._.~.u.<X8XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqX9XpXQ.} c.~.!.T.0.$.3XeX0XqXqXqXwX1.2.I.~.^.B...A.aX9XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqX0XuXD.l.'.~.^.y..XuX0XqXqXqX0XtX=Xy.R./.`.M.b.eXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXaXB.g.(.8.}.sX9XqXqXqXqXqX9XiX*X8.W.b.j.yXwX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqX0XsXA.:.oXaX8XqXqXqXqXqXqXqX9XiX;X3.x.uXwX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXrX<XuX9XqXqXqXqXqXqXqXqXqX9XuX2XqXeX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXrX0XqXqXqXqXqXqXqXqXqXqXqX0XeXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/sixteen-web.png b/icons/sixteen-web.png
new file mode 100644 (file)
index 0000000..3d83e3d
Binary files /dev/null and b/icons/sixteen-web.png differ
diff --git a/icons/sixteen.ico b/icons/sixteen.ico
new file mode 100644 (file)
index 0000000..5d9263c
Binary files /dev/null and b/icons/sixteen.ico differ
diff --git a/icons/sixteen.rc b/icons/sixteen.rc
new file mode 100644 (file)
index 0000000..1d0e5fa
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "sixteen.ico"
diff --git a/icons/slant-16d24.png b/icons/slant-16d24.png
new file mode 100644 (file)
index 0000000..6070f75
Binary files /dev/null and b/icons/slant-16d24.png differ
diff --git a/icons/slant-16d4.png b/icons/slant-16d4.png
new file mode 100644 (file)
index 0000000..6bbebf1
Binary files /dev/null and b/icons/slant-16d4.png differ
diff --git a/icons/slant-16d8.png b/icons/slant-16d8.png
new file mode 100644 (file)
index 0000000..6070f75
Binary files /dev/null and b/icons/slant-16d8.png differ
diff --git a/icons/slant-32d24.png b/icons/slant-32d24.png
new file mode 100644 (file)
index 0000000..d7c7a9c
Binary files /dev/null and b/icons/slant-32d24.png differ
diff --git a/icons/slant-32d4.png b/icons/slant-32d4.png
new file mode 100644 (file)
index 0000000..2c54ed6
Binary files /dev/null and b/icons/slant-32d4.png differ
diff --git a/icons/slant-32d8.png b/icons/slant-32d8.png
new file mode 100644 (file)
index 0000000..d7c7a9c
Binary files /dev/null and b/icons/slant-32d8.png differ
diff --git a/icons/slant-48d24.png b/icons/slant-48d24.png
new file mode 100644 (file)
index 0000000..f4f3daf
Binary files /dev/null and b/icons/slant-48d24.png differ
diff --git a/icons/slant-48d4.png b/icons/slant-48d4.png
new file mode 100644 (file)
index 0000000..c15d5fc
Binary files /dev/null and b/icons/slant-48d4.png differ
diff --git a/icons/slant-48d8.png b/icons/slant-48d8.png
new file mode 100644 (file)
index 0000000..f4f3daf
Binary files /dev/null and b/icons/slant-48d8.png differ
diff --git a/icons/slant-base.png b/icons/slant-base.png
new file mode 100644 (file)
index 0000000..2765c2f
Binary files /dev/null and b/icons/slant-base.png differ
diff --git a/icons/slant-ibase.png b/icons/slant-ibase.png
new file mode 100644 (file)
index 0000000..423bdfb
Binary files /dev/null and b/icons/slant-ibase.png differ
diff --git a/icons/slant-ibase4.png b/icons/slant-ibase4.png
new file mode 100644 (file)
index 0000000..2073c4c
Binary files /dev/null and b/icons/slant-ibase4.png differ
diff --git a/icons/slant-icon.c b/icons/slant-icon.c
new file mode 100644 (file)
index 0000000..6afa90d
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"9X6X7X6X6X5XqX;X8X6X4X5X9X3X2X0X",
+"6X4X9X5X3XeXY.x.R.yX:XeX%Xh.R.qX",
+"7X9XrX9X0XW.(.9X!.^.sX*XG.<X8XeX",
+"6X5XqX{.f._.<Xm.2X~.Z.K.4XS.K.eX",
+"6X3X8XD.i.7X!.q./.hXB.I.rXy.c.qX",
+"7XtXE./.6X[.P.=XJ.OXhX~./.4X1XeX",
+"3XD.'.-XI.T.yX9XeXK.H.:X/.G.+XwX",
+"@Xm.0XU.d.,X6X;X7X=Xe.I.qXv.Z.9X",
+"7XY.~.,X(.8XqX4XwX5X'.G.OX+X XeX",
+"8XaX^.!.pXwXqX5XwXeXqXeXH.#XuXqX",
+":X}.dXI.L.rX3X,X5X5X>X4XeXj.,XrX",
+"8XF.|.kXR.W.iX2X0X0X2XuX`.Y.wXqX",
+"6X7XI.`.9X/.Q.qXwXwXwX`.R.7X3XeX",
+"*XN.5XZ.n.8XE.~.qX0X[.K.qXi.c.wX",
+">XP.7X].N.<XeX3X8X8X3XwX5XV.K.qX",
+"0XqXrX8X7XeXqXeXwXwXeXqXeX0XqXwX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXwXrXeXeXeXeXeXeXeXeXeXrXqXeXiXwXrXeXeXrXtXeXeXeXrX0XrXeXwXwXqX",
+"wX6X,X3X2X2X2X2X1X2X2X3X-XwX,X X7X:X3X2X<X=X3X2X3X-XrX>X1X9X6XwX",
+"rX,X:X6X4X4X5X3X*X5X4X7XXXXXr.$..X*X6X5X1X+X6X3X8X.XoXE v.'.:XrX",
+"eX3X6XrXwXeXeXqX,XrX8XlXW.<.P.~.=.=XdX0XwX1XrX8XzXU.1.U.C.'.tX0X",
+"eX2X4XwX0XqXqX9X,X8XhX!.$.4X#X-XoXo.;XaX6X,X8XhXT.*.6X#X-XtXqXqX",
+"eX2X4XeXqX0XeXtX*XhX!.#.9XgX4X6XlX+XX.:XiX&XkXT.%.eXdX1X9XtX0XqX",
+"eX2X5XeXqXeX5XK.U.A.=.0XpX[.V.R.@XjX@Xo.*XsXY.&.eXuX|.L.Y.=XtX0X",
+"eX2X3XqX9XwX~.!.| N.{.dX@XQ.j.,.^.:XdXOX#.c.<.8XiX#XL.&.8.W.5XwX",
+"eX1X*X,X<X$X/.qXF Y./.2XE.9Xt.u.;X`.<X7X Xn ].0X>X_.I.| ;.(.*XyX",
+"eX2X5XrX8XhXF.c.s.K. XfX;Xk.,.b.c.rXeX9XaX.X+.-XgX&XW.g.N.!.8XwX",
+"eX2X4X8XhX!.=.'./.|.rXuX<.M..X{.t.f.jX9X5X6X@X..-XfX+X(._.1XrX0X",
+"eX2X6XlX!.#.0XdX,XfXuX:.F.cX,X7XlXy.s.jXeX>XhX+XX.=XzX3XeXtX0XqX",
+"rX,X*XR.%.0XiX%X[.=X1.F.jX8X<X4X0XhXu.f.<X[.>XhXOX+..XoX XqXwXqX",
+"yX$Xk.5.3XfXXXv.f.b.m.cX8XtX3X7XrXqXhXi.p.e.D.*XxX].0.i.D.).eX0X",
+"pX[.=.*X|.1XW.1XX.eX/.2X<X3X*X;X2X2X-X`.9X} Q.~.7X/.eXw.Y.+X&XtX",
+"pX'.x. X*X5XQ.+XW ).~.8X4X7X;X<X6X5X1X(.V.~ +X].rX(.&X3.r.{.:XrX",
+"eX1XJ.&.oXlX#XF.H.F.3XtXqXrX2X6XrXqXyX$XZ.Y.y.s.zX9XT.H.A.].tX0X",
+"rX>X>X-Xo.+XjX1XXXqXeX0X0XeX1X5XwXqX0XtX4X.XyXi.a.kXwX+X:XyXqXqX",
+"eX3X5XdX;XX.+XdX,XeX0XqXqXeX1X5XwXqXqXqXqX2XeXhXu.a.lX2X8XqXqXqX",
+"eX2X3X0XaX:XX.+X8X9XwXqXqXeX2X6XeXqXqXwX9X>XwX9XjXu.f.eX5XwXqXqX",
+"eX2XwX0X6XiX;X| ].sX6X0X9XqX<X4XqX9X9X0X8X:XqX9X8XdXi.s.eXqXqXqX",
+"iX|.7.0X>X-X6XOX] `.9X-X>X<X%X=X<X>X>X,X:X@X,X>X;X2X2XE 2XeXqXqX",
+"wX9Xp.t.hXqX9XpXXXO.#XfX8XrX2X6XrXwXwXeX0X,XrX0XyXeX=.I.eXqXqXqX",
+"eX1XpXl.q.gX0X5X5X:X..@XsX9X1X5XwXqXqXqX9X>X0XrXeX$.W.eX2XwXqXqX",
+"eX2X6XzXj.w.gXrX>XgX;XX.+XgX>X5XwXqXqXqX0X:XyXeX%.R.xX<X0XeX0XqX",
+"rX<X.X7XlXj.r.:X'.&XfX;X..#XwX2XwX0XqXqX8X3XrX$.R.lX<X}.OXqXwXqX",
+"uX#Xg.^.9XkXh.d.u.W.+XjX>X@.`.eXeXeXeXeXeX-X-.W.xX<XR.t.j.).wXqX",
+"wX7X..W.XX,X`.5XX.qXY.1X9XXX#.-X2X<X1X,X8X3.D.tX2X[.J...;.!.-XtX",
+"tX&X5.~.%X8XE.XXQ /.(.9X3XqX8X3X6X6X6X6X5X4XeX2XqX|.Q.&.e.^.,XrX",
+"rX<XR.[.tXtX=XG.P.G.4XrXwXqXwXeXwXwXwXwXwXeXqXwXeXqX^.W.R.|.tX0X",
+"wX8X,XtXqX0XtX7X:XqXeX0XqXqXqXqXqXqXqXqXqXqXqXqX0XwXwX;X1XtXqXqX",
+"qXwXrX0XqXqX0XwXtXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXtXrX0XqXqX"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqX0XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0XqXqX9X0XqX0XqX0X0X0X0X0X0X0X0X0XqX0XqXqX0X9XqX0XqXqXqXqX",
+"qXqXqXeXtXeXrXrXrXrXrXrXrXrXrXrXrXrXrXtX0XqXsXuX0XyXrXrXrXrXrXuXrXrXrXrXeXtXeX9XrXiX9XrXwXqXqXqX",
+"qXqXeX<X&X,X:X:X:X:X:X>X:X:X>X:X:X>X:X$XrX0XW.OXwX@X>X:X:X:X:X{.:X>X:X:X,X$X,XdX<X{.pX>X5XwXqXqX",
+"qX0XtX&X%X5X2X2X2X2X2X4X;X#X5X2X2X2X4Xm.0XR.I ` wXN.0X1X2X2X4X`.,X3X2X1X9X~.(.1X0 &.sXD.=XtXqXqX",
+"qXqXeX,X5XtXeXeXeXeXeXtX6X>XyXwXeX0XhX(.c.N.q.@Xd.*XpXqXeXeXtX>X0XrXeXeXqXaXg.G.<.p.Y.G.yX0XqXqX",
+"qX0XrX:X2XeX0XqXqXqX0XwX3X;XeX0X9XrXrX~ <.~.~.Y.| $.hX0X0X0XeX*X8XqXqX6XlXS.H F.).W.D.6XeXqXqXqX",
+"qX0XrX:X2XeXqXqXqXqXqXeX3X;XrX8XrXyXY u.cX;X~.6XlX@.O.jX0X0XeX*X8XwX7XlXA.Z 2XaX`..XiXeX0XqXqXqX",
+"qX0XrX:X2XeXqXqXqXqXqXqX6X<XwXeXyXY i.xX6XeX2XeX8XkX#.O.jX0XwX*X8X7XlXA.Z 3XuX0X5X8XqX0XqXqXqXqX",
+"qX0XrX:X2XeXqXqXqXqXqXaX*X{.pXyXY i.xX6XpX3X_.0XyX8XkX#.O.jXwX*X4XzXA.Z 3XuXqXiX X@XpXwX0XqXqXqX",
+"qX0XrX:X2XeX0XqXqXqXqXK.D.U.P.E p.zX6XyX^.D.T.F.|.yX8XkX#.o.lX$XhXS.Z 2XuXqX1XS.Y.I.H.9XwXqXqXqX",
+"qX0XrX>X4XtXwXeXqXpXL.Y.t.X.Y.e.uXqXpX].G.y.` K.A.%XuXqXzX$.+.iXN.D 4XaX0XeXB.[.+.,.).D.uX0XqXqX",
+"qX0XrX:X;X6X3X3X6X=XC.fXY.y ~.+XW.0X6XB.2XrX&...9XZ.wX1X2XiX#.C ! &X0X<X0X(.|.r.%.` V.Q.=XtXqXqX",
+"qX0XrX:X#X>X;X;X<X|.S.pXY.d m.$XJ.4X-Xb.aXS.V $X4XM.3X-X-X=XyX' / yX*X=X4XU.@X9.=.' M.).#XyX0XqX",
+"qX0XrX>X5XyXeXrXwXpXL.`.5.+. XA.,XtXaX^.'.@.L D.R.oXpXeXrXeXrX0X#.@.zXwXtX4XB.,X..:.:XN.wXqXqXqX",
+"qX0XrX:X2XwX0X8XeXtXE 8.]..XA.`.uX7XlX,.' }.|.R.U l.zX6X0X0XwX&XfX#.o.jX8XyX}.B.oX|.m.*XyX0XqXqX",
+"qX0XrX:X2XeX9XrXyXY p.iX!.K.,XuX7XzX>.[ yX}.F.&X7XK l.zX7XqXeX&X7XlX#.O.jX9XyX2XP.E.8XyX0XqXqXqX",
+"qX0XrX>X2X0XrXyXY i.zXqX0X4XtX7XzX>.] fXeXtX1XyXyXqXJ z.xX6XqX*X6X9XkX#.O.jX8XrX5X9XeX0XqXqXqXqX",
+"qX0XrX;X2XhXrXY i.xX6XaX3X*XsXlX>.] fXqX0X9X%XwX8XyXqXJ l.cXuX$XwXuX8XkX#.O.hXsX=X2XsX0XqXqXqXqX",
+"qX0XrX-XJ.(.~ u.xX7XyX].I.G.^.,.[ fXqX0XwX9X*XwXqX9XyX0XI a._.P.J.OXyX8XkX#.@._.I.D.(.yX0XqXqXqX",
+"qX0XuX|.m.n.,.cX6XiX^.D.r.c.].' yXeX0XwXwX0X*XeXqXwX9XaX=X .m.-.P.C.XXyX0XdXo.S.3.Y.T.T.iX9XqXqX",
+"qX0XtX*Xt =XR.>XeX4XN.dX0.D nX^.|.tX9X9X0X8X&XqX9X9X8XyXQ.#X#Xt.M 7XV.eXeXOXQ.hXE -.MXM.2XeXqXqX",
+"qX9XaX^.=.fXF.(.2X'.D.cX].Y cX`.H.1X%X*X*X&X}.=X*X*X%X<XN.=XsX*.h.gXb.+X1XI.Q.CXd.-.VXK.$XyX0XqX",
+"qX9XaX~.| 1XI.6XeXqXM.eX=.e '.I.@XuXqXwXeXqX=XeXwXwXqXaX^.}.i., d.,XU.tXtX=XD.qXG B -XZ.5XwXqXqX",
+"qXqXwX4X^.e. .kX8XyX Xb.(.[.M.I.yX0XqXqXqX9X*XwX0XqXqXqXwXC.L.|.~.O.u.vX5XuXR.V.'.).z.[.uX0XqXqX",
+"qX0XtX$XH.-X%.+.kX8XyX*XL.S. XtXqXqXqXqXqX9X*XwXqXqXqXqXeXwX).C.W.$XU l.xX6XyX.XF.J.&XuX0XqXqXqX",
+"qX0XrX>X9XpXhX+.@.kX8XuXqX2XsX0XqXqXqXqXqX9X*XwXqXqXqXqXqXqXsX,XrXdX0XJ z.xX5XaX4X8XiX9XqXqXqXqX",
+"qX0XrX:X1XqX0XjX+.@.jXqX1X-XwX0XqXqXqXqXqX9X*XwXqXqXqXqXqX0XqX&X7X9XyXqXJ z.zX9X;X<XwXqXqXqXqXqX",
+"qX0XrX:X2XeX0X0XjX+.+.lX3X-XrX0XqXqXqXqXqX9X*XwXqXqXqXqXqXqXeX*X8XwX9XyXqXJ l.vX=X2XeXqXqXqXqXqX",
+"qX0XrX:X<XeX0X0X9XjXO.#.pX=XwX0XqXqXqXqXqX9X&XwX0XqXqXqXqX0XwX*X8XqXqX8XtX0XH c.tX,XeXqXqXqXqXqX",
+"qXqXeX2XrXeXeXeXwXwXlX%.| rXrXwXeXeXeXeXeXqX=XrXeXeXeXeXeXwXtX-X0XrXeXeX0XiXwXI f.wXqXqXqXqXqXqX",
+"qX9XpX/.h.9X$X*X*X&X&X7X{ X.8X&X&X*X*X*X=X&X}.=X*X*X*X*X*X*X-X|.%X=X*X*X=X$X>X;Xs #XuX0XqXqXqXqX",
+"qX0XyX%XB z.jX4X8X8X7X8XsX_ +.fX7X7X8X8X8X6X%X9X8X8X8X8X8X8X0X%X5X9X8X8X7X6XgX1.[ 8XwX0XqXqXqXqX",
+"qXqXwX3X1XL c.xX8XwXwXeX2XqX%.@.kXqXqXwXwX0X*XeXqXwXwXwXwXqXrX=X9XeXwXqX9XzX1.[ 7X3XwXqXqXqXqXqX",
+"qX0XrX-X7XwXG c.zX7XqXeX3X-XzXO.@.kX0X0XqX9X*XwXqXqXqXqXqX0XeX*X8XwX0X8XzX<._ hX>X1XeXqXqXqXqXqX",
+"qX0XrX:X,XiX0XH c.zX7XeX3X=XwXjX+.@.kX0XqX0X*XwXqXqXqXqXqXqXeX*X8XqX8XzX<.` dXrX-X1XeXqXqXqXqXqX",
+"qXqXeX,X9XqXtX0XH c.zXqX0X3XtX8XkX+.@.kX0X9X*XwXqXqXqXqXqXqXeX*X8X9XzX<.` fX0XrX5X8XrX0XqXqXqXqX",
+"qX0XtX&X).wXwXtX0XG c.fX].W.5XyX9XkX+.@.kX8X&XwXqXqXqXqXqXqXeX*X5XxX<.` fX0XtX6X~._.qXtX0XqXqXqX",
+"qX0XrX-XI.V.>XwXtX9XU 0.L.Y.m.|.yX8XjXO.@.hX&XqX0X0X0X0X0X0XwX&XhX1._ dX0XtXoXC.Y.U.V.:XtX0XqXqX",
+"qX0XiX|.~ }.Z.yX0XdXS.#X@._ dXv.3XyXwXzX$.@.3XrXeXrXrXrXrXeXrX5X,.{ hXrXrX6XC.'.T _ {.C.eXqXqXqX",
+"qXqX7XvX( M./.].5X.XA.cXQ.U bX_.U.6X-X:XeX` 6.0X-X>X>X>X>X-X0Xt.E 9X>X-X5XT.@X3.t.*.z.).#XyX0XqX",
+"qX0XwX8Xv W.R.oX8X%XC.lXh.j 8X_.W.9X1X1X2X9X%X3X2X2X2X2X2X2X3X%X8X3X1X1X8X^.|.z.E K U.W.*XtXqXqX",
+"qX0XuX|.m.OXZ.pXqXaXF.`.h.=.G.C.6XtXeXeXeXwXyXeXeXeXeXeXeXeXeXyXwXwXeXeXrXwXn.;Xs.n.+XC.yX0XqXqX",
+"qXqXeX4XR.Z.7XeX0XwX9XS.W.'.A.&XyX0XqXqXqX0X0XqXqXqXqXqXqXqXqX0X0XqXqXqX0XtX:XN.(.Q.C.6XeXqXqXqX",
+"qXqXwX4X&XyXeX0XqX0XwXuX*X+XqXyX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XtXeX#X&XyXeX0XqXqXqX",
+"qXqXqXwXtX0XqXqXqXqXqX0XtXyXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXyXtX0XqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/slant-web.png b/icons/slant-web.png
new file mode 100644 (file)
index 0000000..424519b
Binary files /dev/null and b/icons/slant-web.png differ
diff --git a/icons/slant.ico b/icons/slant.ico
new file mode 100644 (file)
index 0000000..4afa946
Binary files /dev/null and b/icons/slant.ico differ
diff --git a/icons/slant.rc b/icons/slant.rc
new file mode 100644 (file)
index 0000000..2046b30
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "slant.ico"
diff --git a/icons/solo-16d24.png b/icons/solo-16d24.png
new file mode 100644 (file)
index 0000000..cb26162
Binary files /dev/null and b/icons/solo-16d24.png differ
diff --git a/icons/solo-16d4.png b/icons/solo-16d4.png
new file mode 100644 (file)
index 0000000..8386cb1
Binary files /dev/null and b/icons/solo-16d4.png differ
diff --git a/icons/solo-16d8.png b/icons/solo-16d8.png
new file mode 100644 (file)
index 0000000..63d2522
Binary files /dev/null and b/icons/solo-16d8.png differ
diff --git a/icons/solo-32d24.png b/icons/solo-32d24.png
new file mode 100644 (file)
index 0000000..a4be0cb
Binary files /dev/null and b/icons/solo-32d24.png differ
diff --git a/icons/solo-32d4.png b/icons/solo-32d4.png
new file mode 100644 (file)
index 0000000..6baa6e0
Binary files /dev/null and b/icons/solo-32d4.png differ
diff --git a/icons/solo-32d8.png b/icons/solo-32d8.png
new file mode 100644 (file)
index 0000000..8ecb195
Binary files /dev/null and b/icons/solo-32d8.png differ
diff --git a/icons/solo-48d24.png b/icons/solo-48d24.png
new file mode 100644 (file)
index 0000000..6c57173
Binary files /dev/null and b/icons/solo-48d24.png differ
diff --git a/icons/solo-48d4.png b/icons/solo-48d4.png
new file mode 100644 (file)
index 0000000..a21f7b0
Binary files /dev/null and b/icons/solo-48d4.png differ
diff --git a/icons/solo-48d8.png b/icons/solo-48d8.png
new file mode 100644 (file)
index 0000000..f62e55b
Binary files /dev/null and b/icons/solo-48d8.png differ
diff --git a/icons/solo-base.png b/icons/solo-base.png
new file mode 100644 (file)
index 0000000..128b169
Binary files /dev/null and b/icons/solo-base.png differ
diff --git a/icons/solo-ibase.png b/icons/solo-ibase.png
new file mode 100644 (file)
index 0000000..d72e632
Binary files /dev/null and b/icons/solo-ibase.png differ
diff --git a/icons/solo-ibase4.png b/icons/solo-ibase4.png
new file mode 100644 (file)
index 0000000..1043ce8
Binary files /dev/null and b/icons/solo-ibase4.png differ
diff --git a/icons/solo-icon.c b/icons/solo-icon.c
new file mode 100644 (file)
index 0000000..65b7871
--- /dev/null
@@ -0,0 +1,771 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 246 2 ",
+"   c #010101",
+".  c #101010",
+"X  c gray7",
+"o  c #0F110F",
+"O  c gray7",
+"+  c #101010",
+"@  c gray7",
+"#  c #111111",
+"$  c #101010",
+"%  c #111111",
+"&  c #101010",
+"*  c gray7",
+"=  c #0F110F",
+"-  c #111211",
+";  c #101010",
+":  c #010101",
+">  c #101010",
+",  c #C2C3C2",
+"<  c gray85",
+"1  c #DCD6DC",
+"2  c #D6D5D6",
+"3  c gray75",
+"4  c gray82",
+"5  c #D5D5D5",
+"6  c gainsboro",
+"7  c #D2D2D2",
+"8  c gray75",
+"9  c #D5D5D5",
+"0  c #DCD6DC",
+"q  c #DCDADC",
+"w  c gray76",
+"e  c #101010",
+"r  c gray7",
+"t  c gray85",
+"y  c #EBEEEB",
+"u  c #94C794",
+"i  c #E6EAE6",
+"p  c #D5D4D5",
+"a  c #EDEEED",
+"s  c #CBCBCB",
+"d  c #9D9D9D",
+"f  c #EBECEB",
+"g  c #D2D3D2",
+"h  c #F4F0F4",
+"j  c #A2CDA2",
+"k  c #BBDBBB",
+"l  c #E0DBE0",
+"z  c #101110",
+"x  c #101110",
+"c  c #DAD5DA",
+"v  c #C2DAC2",
+"b  c #3F9E3F",
+"n  c #D4DED4",
+"m  c #D1CFD1",
+"M  c #EBECEB",
+"N  c gray68",
+"B  c #6C6C6C",
+"V  c #E9E9E9",
+"C  c #CCCDCC",
+"Z  c #F0EAF0",
+"A  c #5BAC5B",
+"S  c #7BBD7B",
+"D  c #DED7DE",
+"F  c #0F110F",
+"G  c gray7",
+"H  c #D5D5D5",
+"J  c gray93",
+"K  c #D2DED2",
+"L  c #E5E8E5",
+"P  c #D2D1D2",
+"I  c #EAEAEA",
+"U  c #CDCDCD",
+"Y  c #C6C6C6",
+"T  c gray91",
+"R  c #D0D1D0",
+"E  c #EDEBED",
+"W  c #D6E0D6",
+"Q  c #D8E5D8",
+"!  c #D8D6D8",
+"~  c #111211",
+"^  c #101010",
+"/  c gray75",
+"(  c gray83",
+")  c #D4D1D4",
+"_  c #D2D2D2",
+"`  c #BBBCBB",
+"'  c gray80",
+"]  c gray84",
+"[  c #D8D8D8",
+"{  c #CDCDCD",
+"}  c #BCBCBC",
+"|  c gray82",
+" . c #D2D0D2",
+".. c #D9D6D9",
+"X. c #BEBFBE",
+"o. c #101010",
+"O. c #111111",
+"+. c #D2D2D2",
+"@. c #E7E7E7",
+"#. c #DFDFDF",
+"$. c #E6E6E6",
+"%. c #CDCDCD",
+"&. c #E1E1E1",
+"*. c gray89",
+"=. c #E2E2E2",
+"-. c #E1E1E1",
+";. c #CDCDCD",
+":. c gray90",
+">. c #E1E2E1",
+",. c #E7E8E7",
+"<. c gray82",
+"1. c #111111",
+"2. c #101010",
+"3. c gray86",
+"4. c #CACACA",
+"5. c gray38",
+"6. c #E1E1E1",
+"7. c #D2D2D2",
+"8. c #E4E4E4",
+"9. c #E7E7E7",
+"0. c #E4E4E4",
+"q. c #D0D0D0",
+"w. c gray91",
+"e. c gray90",
+"r. c gray92",
+"t. c gray83",
+"y. c gray7",
+"u. c #111111",
+"i. c #D8D8D8",
+"p. c gray85",
+"a. c #686868",
+"s. c LightGray",
+"d. c gray84",
+"f. c gray89",
+"g. c #111111",
+"h. c #D2D2D2",
+"j. c gray89",
+"k. c #D8D8D8",
+"l. c gray91",
+"z. c #CDCDCD",
+"x. c #E1E1E1",
+"c. c #E4E4E4",
+"v. c #E3E4E3",
+"b. c #E1E1E1",
+"n. c #CDCDCD",
+"m. c gray90",
+"M. c #E1E1E1",
+"N. c gray91",
+"B. c gray82",
+"V. c #111111",
+"C. c #101010",
+"Z. c gray",
+"A. c #D8D8D8",
+"S. c #D2D2D2",
+"D. c #BBBBBB",
+"F. c #CDCDCD",
+"G. c #D3D1D3",
+"H. c #D4D2D4",
+"J. c #CDCDCD",
+"K. c #BCBCBC",
+"L. c gray82",
+"P. c LightGray",
+"I. c gray84",
+"U. c gray75",
+"Y. c #101010",
+"T. c #111111",
+"R. c #D7D7D7",
+"E. c gray89",
+"W. c #C6C6C6",
+"Q. c #E6E6E6",
+"!. c #D2D2D2",
+"~. c #E7E6E7",
+"^. c #DBE3DB",
+"/. c #D8E2D8",
+"(. c #E7E6E7",
+"). c #D0D1D0",
+"_. c #ECECEC",
+"`. c gray83",
+"'. c gray90",
+"]. c #D7D7D7",
+"[. c #111111",
+"{. c #111111",
+"}. c #D5D5D5",
+"|. c #DDDDDD",
+" X c #606060",
+".X c #D7D7D7",
+"XX c #D1D2D1",
+"oX c #E9E5E9",
+"OX c #BBD4BB",
+"+X c #5FAF5F",
+"@X c #E7E4E7",
+"#X c #CBCCCB",
+"$X c #F3F3F3",
+"%X c #959595",
+"&X c #ACACAC",
+"*X c #DFDFDF",
+"=X c gray6",
+"-X c gray7",
+";X c gray86",
+":X c gray90",
+">X c #AEAEAE",
+",X c #F3F3F3",
+"<X c #D1D2D1",
+"1X c #EFEBEF",
+"2X c #C3DBC3",
+"3X c #8DC68D",
+"4X c #EBE9EB",
+"5X c #D2D2D2",
+"6X c #F7F8F7",
+"7X c gray65",
+"8X c #A5A5A5",
+"9X c gray89",
+"0X c #101010",
+"qX c #101010",
+"wX c #C3C3C3",
+"eX c #D7D7D7",
+"rX c gray84",
+"tX c #D5D5D5",
+"yX c gray75",
+"uX c gray82",
+"iX c #D3D4D3",
+"pX c #DAD7DA",
+"aX c #D2D2D2",
+"sX c gray75",
+"dX c #D5D5D5",
+"fX c LightGray",
+"gX c #DADADA",
+"hX c gray76",
+"jX c #101010",
+"kX c #010101",
+"lX c #101010",
+"zX c gray7",
+"xX c #101010",
+"cX c gray7",
+"vX c #101010",
+"bX c #111111",
+"nX c gray7",
+"mX c #101110",
+"MX c #111111",
+"NX c #101010",
+"BX c gray7",
+"VX c #111111",
+"CX c gray7",
+"ZX c #101010",
+"AX c #010101",
+"SX c white",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+"> , < 1 2 3 4 5 6 7 8 9 0 q w e ",
+"r t y u i p a s d f g h j k l z ",
+"x c v b n m M N B V C Z A S D F ",
+"G H J K L P I U Y T R E W Q ! ~ ",
+"^ / ( ) _ ` ' ] [ { } |  ...X.o.",
+"O.+.@.#.$.%.&.*.=.-.;.:.>.,.<.1.",
+"2.3.4.5.6.7.8.9.9.0.q.w.e.r.t.y.",
+"u.i.p.a.s.d.f.9.9.0.q.w.e.r.t.y.",
+"g.h.j.k.l.z.x.c.v.b.n.m.M.N.B.V.",
+"C.Z.A.p.S.D.F.G.H.J.K.L.P.I.U.Y.",
+"T.R.E.W.Q.!.~.^./.(.)._.`.'.].[.",
+"{.}.|. X.XXXoXOX+X@X#X$X%X&X*X=X",
+"-X;X:X>X,X<X1X2X3X4X5X6X7X8X9X0X",
+"qXwXeXrXtXyXuXiXpXaXsXdXfXgXhXjX",
+"kXlXzXxXcXvXbXnXmXMXNXBXVXCXZXAX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 180 2 ",
+"   c black",
+".  c #010101",
+"X  c #0E0E0E",
+"o  c #101010",
+"O  c #111111",
+"+  c gray8",
+"@  c #1D1D1D",
+"#  c #282828",
+"$  c #2A2A2A",
+"%  c #2C2C2C",
+"&  c gray23",
+"*  c #3F3F3F",
+"=  c gray25",
+"-  c #494949",
+";  c #4B4B4B",
+":  c gray30",
+">  c #515151",
+",  c #555555",
+"<  c gray35",
+"1  c gray37",
+"2  c #656565",
+"3  c DimGray",
+"4  c #777777",
+"5  c #797979",
+"6  c #7B7B7B",
+"7  c gray49",
+"8  c #7E7E7E",
+"9  c #158E15",
+"0  c #2B9B2B",
+"q  c #2E9C2E",
+"w  c #359D35",
+"e  c #399F39",
+"r  c #38A038",
+"t  c #44A344",
+"y  c #44A544",
+"u  c #4AA74A",
+"i  c #4BA74B",
+"p  c #4EA94E",
+"a  c #53AB53",
+"s  c #5AAD5A",
+"d  c #5CAF5C",
+"f  c #77B677",
+"g  c #74B874",
+"h  c #7CBB7C",
+"j  c gray53",
+"k  c gray54",
+"l  c gray55",
+"z  c #989898",
+"x  c gray60",
+"c  c #9B9B9B",
+"v  c #9D9D9D",
+"b  c #82BD82",
+"n  c #84BF84",
+"m  c #86BF86",
+"M  c gray65",
+"N  c #A7A7A7",
+"B  c gray67",
+"V  c gray69",
+"C  c #B1B1B1",
+"Z  c gray70",
+"A  c #B4B4B4",
+"S  c #B7B7B7",
+"D  c #BBBBBB",
+"F  c gray74",
+"G  c gray",
+"H  c #8CC28C",
+"J  c #8DC28D",
+"K  c #8FC38F",
+"L  c #99C799",
+"P  c #A0C9A0",
+"I  c #A2CAA2",
+"U  c #A2CBA2",
+"Y  c #A6CCA6",
+"T  c #A8CCA8",
+"R  c #AECFAE",
+"E  c #B6D2B6",
+"W  c #B6D3B6",
+"Q  c #B7D2B7",
+"!  c #B7D3B7",
+"~  c #C1C1C1",
+"^  c #C3C3C3",
+"/  c gray79",
+"(  c gray80",
+")  c #CDCDCD",
+"_  c #CECECE",
+"`  c #C0D7C0",
+"'  c #C3D8C3",
+"]  c #C5D8C5",
+"[  c #D2D2D2",
+"{  c LightGray",
+"}  c gray83",
+"|  c #D5D5D5",
+" . c gray84",
+".. c #D6D7D6",
+"X. c #D7D7D7",
+"o. c #D2DDD2",
+"O. c #D6D8D6",
+"+. c #D7D8D7",
+"@. c #D7D9D7",
+"#. c #D8D8D8",
+"$. c #D8D9D8",
+"%. c #D9D8D9",
+"&. c gray85",
+"*. c #DADADA",
+"=. c gainsboro",
+"-. c #DDDDDD",
+";. c gray87",
+":. c #DFDFDF",
+">. c #D7E0D7",
+",. c #DDE2DD",
+"<. c #DEE2DE",
+"1. c #E1E1E1",
+"2. c #E2E2E2",
+"3. c gray89",
+"4. c #E1E4E1",
+"5. c #E2E4E2",
+"6. c #E3E4E3",
+"7. c #E4E4E4",
+"8. c #E5E4E5",
+"9. c gray90",
+"0. c #E5E6E5",
+"q. c #E6E5E6",
+"w. c #E7E5E7",
+"e. c #E6E6E6",
+"r. c #E7E6E7",
+"t. c #E7E7E7",
+"y. c #E6E8E6",
+"u. c #E7E8E7",
+"i. c #E7E9E7",
+"p. c #E8E6E8",
+"a. c #EBE7EB",
+"s. c gray91",
+"d. c #E8E9E8",
+"f. c #E9E8E9",
+"g. c #E9E9E9",
+"h. c #E9EBE9",
+"j. c #EAE9EA",
+"k. c #EAEAEA",
+"l. c #EAEBEA",
+"z. c #EBEAEB",
+"x. c gray92",
+"c. c #ECE8EC",
+"v. c #EDE8ED",
+"b. c #ECEAEC",
+"n. c #EEE9EE",
+"m. c #EEEBEE",
+"M. c #EFEAEF",
+"N. c #ECECEC",
+"B. c gray93",
+"V. c #EEEEEE",
+"C. c #EFEFEF",
+"Z. c #F1EAF1",
+"A. c #F1EBF1",
+"S. c #F3EBF3",
+"D. c #F0ECF0",
+"F. c #F1EDF1",
+"G. c #F2EDF2",
+"H. c #F3EDF3",
+"J. c #F4EBF4",
+"K. c #F5EBF5",
+"L. c #F4EEF4",
+"P. c #F6ECF6",
+"I. c #F6EEF6",
+"U. c #F7EFF7",
+"Y. c #F8EDF8",
+"T. c gray94",
+"R. c #F1F1F1",
+"E. c gray95",
+"W. c #F3F3F3",
+"Q. c #F4F4F4",
+"!. c gray96",
+"~. c #F6F6F6",
+"^. c gray97",
+"/. c #F9F0F9",
+"(. c #FBF1FB",
+"). c #F8F8F8",
+"_. c #FBFBFB",
+"`. c #FDFDFD",
+"'. c #FEFEFE",
+"]. c white",
+/* pixels */
+"                                                                ",
+"    O O O O O O O O O X O O O O O O O O X X O O O O O O O O     ",
+"  O _ -.$.$.$.@.$.:._ A :.#.$.#. .$.$.:.A _ -.$.$.$.$.$.-._ O   ",
+"  O -.B.d.d.m.L.d.B.$.~ T.d.d.!.).m.d.F.~ -.B.d.d.F./.d.B.-.O   ",
+"  O $.d.9.a.o.E 9.9.$.G m.9.d.C M 9.8.m.G  .9.9.m.' T <.d.#.O   ",
+"  O $.d.9.S.p w S.u.$.G d.9.-.j * 3 ^.d.G @.a.m.E 0 f <.m.$.O   ",
+"  O $.a.S.n a y <.m.$.G B.9.d.`.3 x T.d.G #.9.Y.f e d Q L.$.O   ",
+"  O $.u.m.J i 9 ' F.$.G d.9.B.= $ G d.B.G #.d.L.L i t I L.$.O   ",
+"  O $.d.5.S.5.R m.d.$.G l.9.9.x l B m.d.G #.d.9.a.I Y a.u.$.O   ",
+"  O -.B.d.a.d.L.9.B.-.~ C.a.d.).).Q.u.F.G -.B.d.d.L.L.a.B.-.O   ",
+"  o _ -. .$.$. .#.-.( C -.$.#. . . .#.-.A ( -.#.$. . .@.$._ O   ",
+"  X A ~ G G G G G ~ A v ~ G G G G G G ^ v A ~ G G G G G ~ A X   ",
+"  O :.F.B.l.d.B.m.C.-.^ W.m.B.B.B.B.d.!.~ -.T.B.l.B.l.m.T.:.O   ",
+"  O $.d.9.d.T.d.9.u. .G l.2.9.9.9.9.9.d.G  .d.9.9.9.9.5.d.$.O   ",
+"  O $.9.B.C - 7 5.m.@.G B.9.9.9.9.9.9.B.G $.d.a.9.9.9.9.m.$.O   ",
+"  O $.a.!.x + 2 9.d.#.G l.9.9.d.u.9.9.m.G $.d.9.9.d.a.9.d.$.O   ",
+"  O $.d.9.{ _ $ F W. .G l.9.9.9.9.9.9.B.G #.d.a.9.9.9.9.B.$.O   ",
+"  O $.9.T.M - 1 -.d.$.G B.9.a.9.9.u.9.B.G $.d.9.9.9.9.9.d.$.O   ",
+"  O $.a.9.9.$.B.d.a. .G d.9.9.9.9.9.2.B.G @.d.9.9.9.9.9.a.#.O   ",
+"  O 2.T.d.B.F.d.d.C.2.~ !.d.B.B.d.B.B.T.^ -.F.d.B.B.B.d.B.2.O   ",
+"  X A ~ G G G G ~ ~ C v ^ G G G G G G ~ v A ~ G G G G G ~ A X   ",
+"  O _ -.$.#. . .$.-._ C -.#.$. .$.$.$.-.C _ -.$.#. . .@.-._ O   ",
+"  O -.B.d.T.).T.m.B.-.~ B.d.m.W.L.d.d.F.~ -.B.u.d.!.B.a.B.-.O   ",
+"  O @.a.d./ B G -.d.#.G m.2.a.! Q 9.9.B.G $.d.a.-.S } d.d.$.O   ",
+"  O $.a.B.N < @ _ T.#.G m.9.9.H w h L.l.G $.9.d.} % 4 !.9.-.O   ",
+"  O $.m.2.`.B , !.9.$.G l.5.m.>.w n P.d.G $.d.2.`.k 6 `.9.$.O   ",
+"  O $.d.9.d.& C T.d. .G B.a.<.U i s P.d.G $.d.a.9.> : 2.m.$.O   ",
+"  O $.d.d. .x u.5.a.#.G d.9.2.J b o.9.m.G $.d.d._ 7 6 / B. .O   ",
+"  O -.B.d.m.^.d.d.B.-.~ F.d.d././.m.u.T.~ -.m.9.B.).).B.B.-.O   ",
+"  o _ -.$.$.#.$.$.-._ A 2.$.$.$.@.$.$.-.A _ -.$.$. .#.$.-._ O   ",
+"    O O O O O O O O O X O O O O O O O O X O O O + O O O O O     ",
+"                                                                "
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 222 2 ",
+"   c black",
+".  c #010101",
+"X  c #060606",
+"o  c #0E0E0E",
+"O  c #101010",
+"+  c #111111",
+"@  c gray7",
+"#  c #131313",
+"$  c gray8",
+"%  c #151515",
+"&  c #1B1B1B",
+"*  c gray13",
+"=  c gray14",
+"-  c gray15",
+";  c gray16",
+":  c gray17",
+">  c #2C2C2C",
+",  c #2D2D2D",
+"<  c gray18",
+"1  c gray19",
+"2  c #353535",
+"3  c #373737",
+"4  c gray22",
+"5  c #3A3A3A",
+"6  c #3C3C3C",
+"7  c gray25",
+"8  c gray27",
+"9  c gray28",
+"0  c gray29",
+"q  c #4B4B4B",
+"w  c #505050",
+"e  c #515151",
+"r  c #535353",
+"t  c gray35",
+"y  c #606060",
+"u  c gray39",
+"i  c DimGray",
+"p  c gray43",
+"a  c #727272",
+"s  c #7C7C7C",
+"d  c gray49",
+"f  c #008300",
+"g  c #008400",
+"h  c #008800",
+"j  c #048C04",
+"k  c #088D08",
+"l  c #109010",
+"z  c #119011",
+"x  c #129012",
+"c  c #159215",
+"v  c #169316",
+"b  c #209720",
+"n  c #229722",
+"m  c #269726",
+"M  c #229822",
+"N  c #289A28",
+"B  c #2C9C2C",
+"V  c #309D30",
+"C  c #319D31",
+"Z  c #329C32",
+"A  c #359F35",
+"S  c #36A036",
+"D  c #38A038",
+"F  c #39A139",
+"G  c #3DA03D",
+"H  c #42A542",
+"J  c #45A545",
+"K  c #47A647",
+"L  c #4AA84A",
+"P  c #53A953",
+"I  c #5BAE5B",
+"U  c #5EAF5E",
+"Y  c #68B468",
+"T  c #69B469",
+"R  c #868686",
+"E  c #898989",
+"W  c #8D8D8D",
+"Q  c gray60",
+"!  c gray62",
+"~  c #A0A0A0",
+"^  c #A2A2A2",
+"/  c #A4A4A4",
+"(  c gray65",
+")  c #A7A7A7",
+"_  c #A9A9A9",
+"`  c #AAAAAA",
+"'  c #ACACAC",
+"]  c gray68",
+"[  c #AEAEAE",
+"{  c #AFAFAF",
+"}  c gray69",
+"|  c #B2B2B2",
+" . c #B4B4B4",
+".. c #B7B7B7",
+"X. c #B9B9B9",
+"o. c #BCBCBC",
+"O. c gray74",
+"+. c gray",
+"@. c gray75",
+"#. c #8CC28C",
+"$. c #91C391",
+"%. c #90C490",
+"&. c #94C594",
+"*. c #96C696",
+"=. c #99C799",
+"-. c #9BC89B",
+";. c #A0CAA0",
+":. c #A1CAA1",
+">. c #A3CBA3",
+",. c #A8CDA8",
+"<. c #ACCFAC",
+"1. c #B1D1B1",
+"2. c #B5D2B5",
+"3. c #B5D3B5",
+"4. c #B6D3B6",
+"5. c #B7D3B7",
+"6. c #B8D3B8",
+"7. c #BED6BE",
+"8. c #BFD6BF",
+"9. c gray77",
+"0. c #C8C8C8",
+"q. c gray79",
+"w. c #CBCBCB",
+"e. c gray80",
+"r. c #CDCDCD",
+"t. c #CECECE",
+"y. c gray81",
+"u. c #C1D6C1",
+"i. c #C4D9C4",
+"p. c #C8DAC8",
+"a. c #C9DAC9",
+"s. c #C9DBC9",
+"d. c #CADBCA",
+"f. c #CFDDCF",
+"g. c #D0D0D0",
+"h. c gray82",
+"j. c #D2D2D2",
+"k. c LightGray",
+"l. c gray83",
+"z. c gray84",
+"x. c #D7D7D7",
+"c. c #D5DFD5",
+"v. c #D8D8D8",
+"b. c gray85",
+"n. c #DADADA",
+"m. c gray86",
+"M. c gainsboro",
+"N. c #DDDDDD",
+"B. c gray87",
+"V. c #DFDFDF",
+"C. c #D8E0D8",
+"Z. c #D9E1D9",
+"A. c #DCE2DC",
+"S. c #DFE3DF",
+"D. c gray88",
+"F. c #E1E1E1",
+"G. c #E1E3E1",
+"H. c #E2E2E2",
+"J. c #E2E3E2",
+"K. c gray89",
+"L. c #E0E4E0",
+"P. c #E1E4E1",
+"I. c #E2E4E2",
+"U. c #E3E4E3",
+"Y. c #E3E5E3",
+"T. c #E4E4E4",
+"R. c #E4E5E4",
+"E. c #E5E4E5",
+"W. c gray90",
+"Q. c #E5E6E5",
+"!. c #E6E5E6",
+"~. c #E6E6E6",
+"^. c #E7E6E7",
+"/. c #E7E7E7",
+"(. c #E6E8E6",
+"). c #E7E8E7",
+"_. c #E8E6E8",
+"`. c #E8E7E8",
+"'. c #E9E7E9",
+"]. c #EBE7EB",
+"[. c gray91",
+"{. c #E8E9E8",
+"}. c #E9E9E9",
+"|. c #EAE8EA",
+" X c #EBE8EB",
+".X c #EAEAEA",
+"XX c #EAEBEA",
+"oX c gray92",
+"OX c #EBECEB",
+"+X c #ECE8EC",
+"@X c #EDE8ED",
+"#X c #EDE9ED",
+"$X c #EEE9EE",
+"%X c #EFE9EF",
+"&X c #EFEAEF",
+"*X c #ECECEC",
+"=X c gray93",
+"-X c #EEEEEE",
+";X c #EFEFEF",
+":X c #F0EAF0",
+">X c #F1EAF1",
+",X c #F1EBF1",
+"<X c #F2EBF2",
+"1X c #F3EBF3",
+"2X c #F4EBF4",
+"3X c #F5ECF5",
+"4X c #F5EDF5",
+"5X c #F6ECF6",
+"6X c #F6EDF6",
+"7X c #F7ECF7",
+"8X c gray94",
+"9X c #F1F1F1",
+"0X c gray95",
+"qX c #F3F3F3",
+"wX c #F4F4F4",
+"eX c gray96",
+"rX c #F6F6F6",
+"tX c gray97",
+"yX c #F8F8F8",
+"uX c #F9F9F9",
+"iX c #FBFBFB",
+"pX c #FEFEFE",
+/* pixels */
+"                                                                                                ",
+"                                    X                                                           ",
+"                                                                                                ",
+"        # # # % # # # # % # # # # o # # # # # # % # # # # % o # # # # # % # # # # # # %         ",
+"      # y.N.m.m.m.m.m.m.m.m.m.K.9.( W.m.m.m.m.m.m.m.m.m.m.W.( 9.A.m.N.m.m.m.M.M.m.m.N.h.#       ",
+"      # N.*X}.}.}.}.}.}.}.}.W.8Xh.} 0XW.}.}.}.W.}.}.}.}.W.0X} h.<X`.}.}.}.}.`.}.}.W.}.N.#       ",
+"      # m.}.K.W.W.W.W.}.W.W.W.}.y.{ *XK.W.W.W.}.*XW.W.W.K.0X} y.*XW.W.W.K.W.#X`.W.W.}.m.#       ",
+"      # m.}.W.W.`.W.}.f.U.W.W.*Xy.{ 0XW.W.W.}.m.w.}.}.W.W.*X} y.*XW.W.W.#XW.i.Z.`.W.}.m.#       ",
+"      % m.}.W.W.U.6XY g 1.<XU.*Xy.} *XK.W.0X{ * & 5 m.W.K.*X} h.*XW.W.@Xd.A F I W.W.}.m.%       ",
+"      # m.}.W.U.6X>.F x ,.<XU.*Xy.} 0XW.W.}.w.y.y.  { 0XK.*X} h.*XW.U.qXP m %.7.}.W.}.m.#       ",
+"      # m.}.W.`.C.S 5.v ;.<XU.*Xy.} 0XW.W.W.*XpXt 2 K.W.K.0X} y.*XW.W.#XZ M K b Z.`.}.m.#       ",
+"      # m.}.U.:X4.x B h V U.W.OXy.} *XW.W.W.W.w : m.}.W.W.*X} y.OXW.U.6XG P U.g u.#XW.m.#       ",
+"      # m.}.W.`.U.f.7.x *.#XW.*Xy.} *XW.W.rX^   : * ( 0XK.*X} h.*XW.W.#X4.N M I }.W.}.M.#       ",
+"      # m.}.W.W.W.#X`.c.W.`.W.*Xy.} *XW.W.W.N.h.w.9.N.}.K.*X} h.*XW.W.W.#XA.d.#X`.W.`.M.#       ",
+"      % m.}.W.W.W.W.W.`.W.W.W.}.y.{ 0XK.W.W.}.*X}.*X}.W.W.*X{ y.OXU.W.W.T.`.#XW.W.W.`.m.#       ",
+"      % N.*X*X*X*X*XOXOXOX*XOX0Xl. .rX}.*X*X*X}.}.}.*X*X}.rX .h.0X#X*X*XOX#X}.*X*X*X*XD.%       ",
+"      # 9.h.y.y.y.y.y.y.y.y.y.l.X.! l.y.y.y.y.y.y.y.h.y.y.l.^ X.l.y.y.y.y.y.h.y.y.y.h.9.#       ",
+"      o _ } { } } } } { } } {  .! R  .{ } } } } } } } } {  .R !  .} } } } } } } } { } ( o       ",
+"      # W.0X*X0X*X0X*X0X*X0X*XrXm. .iX*X*X0X0X*X*X*X0X*X}.iX .m.rX*X*X0X*X0X*X*X0X*XrXW.%       ",
+"      # m.W.K.W.K.K.K.N.K.W.W.}.y.{ *XK.K.W.K.W.W.W.W.W.K.}.{ y.}.W.W.W.W.W.W.W.K.K.W.m.%       ",
+"      % m.}.W.W.W.0XiXiX0XW.W.*Xy.{ 0XK.W.W.W.}.W.W.W.W.W.0X} y.*XW.}.W.W.W.W.W.W.W.}.m.#       ",
+"      # m.}.W.W.}.^ s a } 0XK.*Xy.{ *XW.}.W.W.W.}.W.}.W.K.*X} y.*XW.W.W.W.}.W.}.W.W.}.m.#       ",
+"      # m.}.W.W.*X2 * q { *XK.*Xy.} *XK.W.}.W.}.W.W.W.}.W.0X} y.*XW.W.W.}.W.W.W.W.W.}.N.#       ",
+"      # N.}.W.W.*X7 - 1 } *XK.*Xy.} 0XW.W.W.W.W.}.W.W.W.K.*X} y.*XW.W.}.W.W.W.}.W.W.}.N.#       ",
+"      # m.}.W.W.W.N.0Xq , 0XK.*Xy.} *XK.W.W.W.W.W.W.W.}.W.0X} y.*XW.}.W.}.W.W.W.W.W.}.m.%       ",
+"      # m.}.W.}.m.s _ - 9 rXW.*Xy.} 0XW.}.W.}.W.}.W.W.W.K.*X} y.*XW.W.W.W.W.W.}.W.W.}.m.#       ",
+"      # N.}.W.W.W.p 5 t h.}.W.*Xy.} 0XK.W.W.W.}.W.}.W.}.W.0X} y.*XW.W.W.}.W.}.W.W.W.}.m.#       ",
+"      % N.}.W.W.W.rXrXrX}.W.W.*Xy.} *XW.}.W.W.W.W.W.W.W.K.*X} y.*XW.W.W.W.W.W.W.W.W.}.m.#       ",
+"      # m.W.W.W.W.K.K.K.K.W.K.}.y.} *XW.W.K.W.K.W.W.W.W.K.*X{ y.}.W.W.W.W.W.W.W.W.W.W.m.#       ",
+"      # K.0X0X*X0X*X*X*X*X0X*XrXl. .iX*X0X*X*X0X*X0X*X*X*XiX .l.rX*X*X0X*X0X*X*X0X*X0XW.%       ",
+"      o ( } { { } } } } } } {  .! R  .{ } } } } } } { { {  .R !  .} } } } } } } } { } _ o       ",
+"      # 9.h.y.y.y.y.y.y.y.h.y.l.X.! l.y.y.y.y.y.y.h.y.y.y.m.! X.h.y.y.y.y.h.y.y.y.y.h.9.#       ",
+"      % N.*X*X*X*X*X*X*X*X*X*X0Xk. .rX}.*X*X*X*X*XOX*X*X}.rX .k.0XOXOX*X}.*X*X*X*X}.*XK.#       ",
+"      % m.}.W.W.W.W.W.W.W.W.W.}.y.{ *XW.W.W.W.W.W.U.W.W.K.8X{ y.}.W.W.W.W.K.W.W.W.W.}.m.#       ",
+"      # m.}.W.}.W.0X0X*X*XW.W.*Xy.} *XU.W.W.}.:X:X:X`.W.U.8X} y.*XW.W.W.*XrX*XW.W.W.}.m.%       ",
+"      # m.}.W.}.l.6 , , u *XW.*Xy.} 0XW.W.#Xd.H V Y U.(.U.8X} y.*XW.U.0X( , q K.}.W.}.m.#       ",
+"      # m.}.W.W.N._ { # i rXK.*Xy.} 8XW.W.}.c.,.$.f 4.:XK.*X} y.*XW.W.}.w.i % K.}.K.}.m.#       ",
+"      # m.}.W.W.W.pXO.o l.*XW.*Xy.} *XW.W.U.<X-.v S W.`.K.0X} y.*XW.W.K.iX( # N.W.W.}.m.#       ",
+"      # m.}.W.W.W.rX9 w iXK.W.*Xy.} 8XU.(.W.W.W.4.j ;.2XK.8X{ y.*XW.W.K.iX_ % rX}.W.}.m.%       ",
+"      % m.}.W.W.*XO.X O.*XW.W.*Xh.} *XW.W.<X=.J L k 6.#XK.*X{ y.*XW.W.*X{ : X w m.}.}.m.#       ",
+"      # m.}.W.W.*X9.^ }.W.W.W.*Xy.} *XW.W.`.c.*.#.d.#XW.W.0X{ y.*XW.W.}.O.W Q W m.W.}.m.#       ",
+"      # m.}.W.W.W.*X0XW.W.W.W.}.y.} 0XK.W.W.`.6X6X`.W.W.K.*X{ y.*XW.W.W.*XrX0XiXW.W.}.m.#       ",
+"      # N.}.W.}.}.}.W.}.}.}.}.*Xh.} 0XW.}.}.}.(.W.}.}.}.W.0X} h.*X}.}.}.}.W.W.W.}.}.}.N.%       ",
+"      # h.N.m.m.N.m.m.m.m.m.m.K.9.( W.m.m.m.m.m.m.M.m.m.m.W.( 9.K.m.m.m.m.m.m.m.N.m.N.h.#       ",
+"        % # # # # # # % # # # # # o % # # # # % # # # # # % o # # # # # % # # # # # # #         ",
+"                                                                                                ",
+"                                                            X                                   ",
+"                                                                                                "
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/solo-web.png b/icons/solo-web.png
new file mode 100644 (file)
index 0000000..daacab5
Binary files /dev/null and b/icons/solo-web.png differ
diff --git a/icons/solo.ico b/icons/solo.ico
new file mode 100644 (file)
index 0000000..521eca4
Binary files /dev/null and b/icons/solo.ico differ
diff --git a/icons/solo.rc b/icons/solo.rc
new file mode 100644 (file)
index 0000000..631070c
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "solo.ico"
diff --git a/icons/tents-16d24.png b/icons/tents-16d24.png
new file mode 100644 (file)
index 0000000..e3fe538
Binary files /dev/null and b/icons/tents-16d24.png differ
diff --git a/icons/tents-16d4.png b/icons/tents-16d4.png
new file mode 100644 (file)
index 0000000..8e5c03a
Binary files /dev/null and b/icons/tents-16d4.png differ
diff --git a/icons/tents-16d8.png b/icons/tents-16d8.png
new file mode 100644 (file)
index 0000000..e48986e
Binary files /dev/null and b/icons/tents-16d8.png differ
diff --git a/icons/tents-32d24.png b/icons/tents-32d24.png
new file mode 100644 (file)
index 0000000..b8e248c
Binary files /dev/null and b/icons/tents-32d24.png differ
diff --git a/icons/tents-32d4.png b/icons/tents-32d4.png
new file mode 100644 (file)
index 0000000..b5a74ec
Binary files /dev/null and b/icons/tents-32d4.png differ
diff --git a/icons/tents-32d8.png b/icons/tents-32d8.png
new file mode 100644 (file)
index 0000000..dbe0f09
Binary files /dev/null and b/icons/tents-32d8.png differ
diff --git a/icons/tents-48d24.png b/icons/tents-48d24.png
new file mode 100644 (file)
index 0000000..f3bafb4
Binary files /dev/null and b/icons/tents-48d24.png differ
diff --git a/icons/tents-48d4.png b/icons/tents-48d4.png
new file mode 100644 (file)
index 0000000..7b05e55
Binary files /dev/null and b/icons/tents-48d4.png differ
diff --git a/icons/tents-48d8.png b/icons/tents-48d8.png
new file mode 100644 (file)
index 0000000..06eb375
Binary files /dev/null and b/icons/tents-48d8.png differ
diff --git a/icons/tents-base.png b/icons/tents-base.png
new file mode 100644 (file)
index 0000000..36a6d1b
Binary files /dev/null and b/icons/tents-base.png differ
diff --git a/icons/tents-ibase.png b/icons/tents-ibase.png
new file mode 100644 (file)
index 0000000..d033027
Binary files /dev/null and b/icons/tents-ibase.png differ
diff --git a/icons/tents-ibase4.png b/icons/tents-ibase4.png
new file mode 100644 (file)
index 0000000..21d514d
Binary files /dev/null and b/icons/tents-ibase4.png differ
diff --git a/icons/tents-icon.c b/icons/tents-icon.c
new file mode 100644 (file)
index 0000000..fecbc37
--- /dev/null
@@ -0,0 +1,719 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c #E7E7E7",
+".  c #EBE6EE",
+"X  c #EAE3ED",
+"o  c #EAE5EE",
+"O  c #EFE7F1",
+"+  c #F3E8F4",
+"@  c #ECE6F0",
+"#  c #EAE4EE",
+"$  c #EAE4ED",
+"%  c #EBE6EF",
+"&  c #F2E7F4",
+"*  c #F0E7F3",
+"=  c #E8E7E9",
+"-  c #E6E6E6",
+";  c gray90",
+":  c #E6E6E6",
+">  c #DFE1DD",
+",  c #B9D6A6",
+"<  c #BCE2AB",
+"1  c #BAD8A5",
+"2  c #A9D198",
+"3  c #9CD18F",
+"4  c #B2D29E",
+"5  c #BBDDA8",
+"6  c #BCE0AA",
+"7  c #B5D3A1",
+"8  c #9ED191",
+"9  c #A3D192",
+"0  c #D7DCD1",
+"q  c #E9E7EA",
+"w  c gray92",
+"e  c #E7E7E7",
+"r  c #DAE0D7",
+"t  c #A6EB75",
+"y  c #BFDD31",
+"u  c #B1EF71",
+"i  c #37C527",
+"p  c #00AF00",
+"a  c #6EDA53",
+"s  c #BDE956",
+"d  c #BEE346",
+"f  c #86E465",
+"g  c #00B300",
+"h  c #1BBE0E",
+"j  c #CCDBBF",
+"k  c #EBE7ED",
+"l  c #A4A5A3",
+"z  c gray88",
+"x  c #D9E2DB",
+"c  c #ABDB69",
+"v  c #C9BE12",
+"b  c #ADDB5D",
+"n  c #98E46F",
+"m  c #92CE4D",
+"M  c #9CEB7B",
+"N  c #BBCB36",
+"B  c #C3C426",
+"V  c #9EEA79",
+"C  c #86CD4C",
+"Z  c #8AD855",
+"A  c #CBDDC3",
+"S  c #EAE6EC",
+"D  c #BDBEBC",
+"F  c gray89",
+"G  c #D9DED6",
+"H  c #9DD973",
+"J  c #A6F279",
+"K  c #9FDD72",
+"L  c #78CF56",
+"P  c #5FCE43",
+"I  c #8BD262",
+"U  c #A4E877",
+"Y  c #A4EC77",
+"T  c #97D66C",
+"R  c #AFED7B",
+"E  c #A3E670",
+"W  c #C7D6BD",
+"Q  c #EBE8ED",
+"!  c #EBEBEA",
+"~  c #E7E7E7",
+"^  c #DBE0D7",
+"/  c #ACEB7F",
+"(  c #B9FF83",
+")  c #B5F382",
+"_  c #40C72E",
+"`  c #00B100",
+"'  c #78D956",
+"]  c #BDFE87",
+"[  c #B5FF81",
+"{  c #A7E977",
+"}  c #B7FF84",
+"|  c #AFFA7A",
+" . c #CBDAC0",
+".. c #E9E6EB",
+"X. c #A2A3A2",
+"o. c gray90",
+"O. c #DADFD6",
+"+. c #A1E077",
+"@. c #ADF87B",
+"#. c #A0E574",
+"$. c #9FDF6D",
+"%. c #A0D45D",
+"&. c #9EE273",
+"*. c #A7ED77",
+"=. c #ABF37A",
+"-. c #9BDD6F",
+";. c #ACF47C",
+":. c #A3ED71",
+">. c #C8D7BE",
+",. c #ECE8EE",
+"<. c #D3D4D2",
+"1. c #E4E4E4",
+"2. c #DADFD6",
+"3. c #A0DE76",
+"4. c #ABF679",
+"5. c #9DE171",
+"6. c #A1E473",
+"7. c #B1F072",
+"8. c #9ADD71",
+"9. c #A5EB75",
+"0. c #A8F079",
+"q. c #99DA6E",
+"w. c #AAF17A",
+"e. c #A1EA70",
+"r. c #C8D7BE",
+"t. c #EAE7ED",
+"y. c #DCDCDB",
+"u. c #E7E7E7",
+"i. c #DAE0D6",
+"p. c #ACEB7F",
+"a. c #BCFF84",
+"s. c #AAF382",
+"d. c #B6DF57",
+"f. c #D1C718",
+"g. c #A9EA76",
+"h. c #B4FB82",
+"j. c #B8FF83",
+"k. c #A7E978",
+"l. c #B9FF85",
+"z. c #B0FA7B",
+"x. c #CBDAC0",
+"c. c #E9E6EC",
+"v. c #A0A19F",
+"b. c #E4E4E4",
+"n. c #DADED7",
+"m. c #A2DC79",
+"M. c #ADF379",
+"N. c #9FE176",
+"B. c #A2D259",
+"V. c #B3D347",
+"C. c #9AD465",
+"Z. c #A2E976",
+"A. c #A6EC76",
+"S. c #97D76C",
+"D. c #A8EE79",
+"F. c #9EE66E",
+"G. c #C7D6BD",
+"H. c #ECE9EE",
+"J. c #E4E5E4",
+"K. c gray90",
+"L. c #EAE1E9",
+"P. c #6FC85B",
+"I. c #00B400",
+"U. c #57C63F",
+"Y. c #AFF282",
+"T. c #ACFF86",
+"R. c #9FE373",
+"E. c #AAF279",
+"W. c #AEF77C",
+"Q. c #9EE172",
+"!. c #B0F880",
+"~. c #A7F175",
+"^. c #C9D8BF",
+"/. c #EAE6EC",
+"(. c #C8C9C8",
+"). c #E7E7E7",
+"_. c #E6DFE7",
+"`. c #8BDD6C",
+"'. c #41C017",
+"]. c #79DC52",
+"[. c #B3F67F",
+"{. c #B8FF81",
+"}. c #A6EA77",
+"|. c #B2FA7F",
+" X c #B6FF82",
+".X c #A4E973",
+"XX c #B4FF7C",
+"oX c #ABFA72",
+"OX c #CADABE",
+"+X c #EAE7ED",
+"@X c #A8A9A7",
+"#X c gray89",
+"$X c #DADDDA",
+"%X c #B4D39B",
+"&X c #C8DA9A",
+"*X c #B2D594",
+"=X c #9CDD71",
+"-X c #A8ED79",
+";X c #97D66D",
+":X c #A2E475",
+">X c #A3EA74",
+",X c #9FD07E",
+"<X c #BAE1A0",
+"1X c #AFDA93",
+"2X c #CBD3C5",
+"3X c #EBE9EC",
+"4X c #ECECEB",
+"5X c #E6E6E6",
+"6X c #D8E1D2",
+"7X c #CFD5CB",
+"8X c #EEEAF8",
+"9X c #D3D6D2",
+"0X c #A7F374",
+"qX c #B2FF7A",
+"wX c #A0EA6F",
+"eX c #ACFA78",
+"rX c #AAFF70",
+"tX c #BBDBA6",
+"yX c #EEE3F6",
+"uX c #E1DDE4",
+"iX c #D5D4D6",
+"pX c #E7E7E7",
+"aX c #B6B6B6",
+"sX c #E6E6E6",
+"dX c #E1E4E0",
+"fX c #DEE2DB",
+"gX c gray91",
+"hX c #DFE2DD",
+"jX c #D2EBC1",
+"kX c #D6F1C3",
+"lX c #CFE8BF",
+"zX c #D4EDC2",
+"xX c #D3F0C0",
+"cX c #D7E3CF",
+"vX c #E7E7E8",
+"bX c #E3E5E2",
+"nX c gray88",
+"mX c #E7E7E7",
+"MX c #C6C6C6",
+"NX c #E4E4E4",
+"BX c #E7E6E7",
+"VX c #E8E7E8",
+"CX c #E5E6E5",
+"ZX c #E7E7E8",
+"AX c #EAE5EE",
+"SX c #E9E4ED",
+"DX c #EBE6EE",
+"FX c #EAE5ED",
+"GX c #EAE4EE",
+"HX c #E9E7EA",
+"JX c #E6E6E5",
+"KX c #E6E6E7",
+"LX c #E7E7E7",
+"PX c #E6E6E6",
+"IX c #ECECEC",
+"UX c #E6E6E6",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+"> , < 1 2 3 4 5 6 7 8 9 0 q w e ",
+"r t y u i p a s d f g h j k l z ",
+"x c v b n m M N B V C Z A S D F ",
+"G H J K L P I U Y T R E W Q ! ~ ",
+"^ / ( ) _ ` ' ] [ { } |  ...X.o.",
+"O.+.@.#.$.%.&.*.=.-.;.:.>.,.<.1.",
+"2.3.4.5.6.7.8.9.0.q.w.e.r.t.y.u.",
+"i.p.a.s.d.f.g.h.j.k.l.z.x.c.v.b.",
+"n.m.M.N.B.V.C.Z.A.S.D.F.G.H.J.K.",
+"L.P.I.U.Y.T.R.E.W.Q.!.~.^./.(.).",
+"_.`.'.].[.{.}.|. X.XXXoXOX+X@X#X",
+"$X%X&X*X=X-X;X:X>X,X<X1X2X3X4X5X",
+"6X7X8X9X0XqXwXeXrXtXyXuXiXpXaXsX",
+"dXfXgXhXjXkXlXzXxXcXvXbXnXmXMXNX",
+"BXVXCXZXAXSXDXFXGXHXJXKXLXPXIXUX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 169 2 ",
+"   c gray37",
+".  c #00AD00",
+"X  c #03B302",
+"o  c #04BA04",
+"O  c #0BB709",
+"+  c #1ABE13",
+"@  c #28BF1D",
+"#  c #479B0F",
+"$  c #499E12",
+"%  c #1EC112",
+"&  c #25C21A",
+"*  c #28C41B",
+"=  c #2FC222",
+"-  c #3EC72C",
+";  c #33CA24",
+":  c #38D024",
+">  c #54C83B",
+",  c #53DA39",
+"<  c #7AAE57",
+"1  c #7CB059",
+"2  c #5DC942",
+"3  c #5DD942",
+"4  c #63C749",
+"5  c #65C94B",
+"6  c #63CE47",
+"7  c #6ED145",
+"8  c #73D94A",
+"9  c #6FCF52",
+"0  c #72D352",
+"q  c #7FD15B",
+"w  c #6AE248",
+"e  c #8E8F1C",
+"r  c #8EA630",
+"t  c #B1A43A",
+"y  c #CEA700",
+"u  c #CDAC00",
+"i  c #CAB408",
+"p  c #CAB810",
+"a  c #C5CE2D",
+"s  c #C7C926",
+"d  c #C3D131",
+"f  c #CAD530",
+"g  c #C5DA3F",
+"h  c #80B75B",
+"j  c #82BA5D",
+"k  c #80AF61",
+"l  c #89BE65",
+"z  c #9BC24B",
+"x  c #8DD05F",
+"c  c #83D95E",
+"v  c #BDDF4D",
+"b  c #A3C656",
+"n  c #84E65F",
+"m  c #BEEC5C",
+"M  c #87C161",
+"N  c #8AC463",
+"B  c #8ECC65",
+"V  c #8FC868",
+"C  c #91CE67",
+"Z  c #92CF6A",
+"A  c #8FD261",
+"S  c #8ADC62",
+"D  c #93D266",
+"F  c #96DD67",
+"G  c #95D46B",
+"H  c #99D56E",
+"J  c #95D96B",
+"K  c #9BDB6E",
+"L  c #96C079",
+"P  c #99CA7E",
+"I  c #94D771",
+"U  c #9DD670",
+"Y  c #95DA72",
+"T  c #9DDD71",
+"R  c #A5D561",
+"E  c #A3DC73",
+"W  c #9CE56E",
+"Q  c #9FE96D",
+"!  c #87F162",
+"~  c #8CF567",
+"^  c #9CFB6E",
+"/  c #9EE171",
+"(  c #9CE779",
+")  c #AAE76F",
+"_  c #A0EE6C",
+"`  c #A4E26F",
+"'  c #BBED64",
+"]  c #B2E86F",
+"[  c #BAF065",
+"{  c #A2E475",
+"}  c #A5EA76",
+"|  c #A9ED77",
+" . c #A6E17A",
+".. c #A5EE7A",
+"X. c #AAEE79",
+"o. c #A9E479",
+"O. c #B8E978",
+"+. c #A0F673",
+"@. c #ACFC77",
+"#. c #AAF27A",
+"$. c #AEFC7A",
+"%. c #A6F775",
+"&. c #B9F670",
+"*. c #B2FD7E",
+"=. c #B6F877",
+"-. c #C4DF44",
+";. c #C5E146",
+":. c #C0E24C",
+">. c #C1E852",
+",. c #868686",
+"<. c #8B8B8B",
+"1. c #959595",
+"2. c #9A9A9A",
+"3. c #98AC8C",
+"4. c #9FB78E",
+"5. c #A8BF96",
+"6. c #A2B695",
+"7. c gray68",
+"8. c #AFB5AB",
+"9. c gray70",
+"0. c #BDBDBC",
+"q. c #9FCE82",
+"w. c #A6CD87",
+"e. c #AACE8B",
+"r. c #ACD98E",
+"t. c #A5C192",
+"y. c #AAC796",
+"u. c #ABC897",
+"i. c #ADC898",
+"p. c #ADFF88",
+"a. c #B5FE82",
+"s. c #BAFF85",
+"d. c #B3FF89",
+"f. c #BAFF8B",
+"g. c #B5E197",
+"h. c #B7EB94",
+"j. c #B8CDA0",
+"k. c #B6C7A9",
+"l. c #BECBBB",
+"z. c #BCC6B5",
+"x. c #C1FF8D",
+"c. c #C5FF95",
+"v. c #C1F79D",
+"b. c #C3FA9F",
+"n. c #C3CBBC",
+"m. c #C4FBA0",
+"M. c #C3C3C4",
+"N. c #CFCFCE",
+"B. c #C9CEC5",
+"V. c #D1CFCF",
+"C. c #CDD2C9",
+"Z. c #D2D1D1",
+"A. c #DAD4D7",
+"S. c #D7DFD2",
+"D. c #D9DFD4",
+"F. c #D7D7D8",
+"G. c #D8D6DA",
+"H. c #D9DBD8",
+"J. c #D7E4CE",
+"K. c #DAE2D5",
+"L. c #E3DDE7",
+"P. c #E5DFE8",
+"I. c #E5E5E5",
+"U. c #E7E8E6",
+"Y. c #EAE6EC",
+"T. c #EBEAEB",
+"R. c #E7E4EC",
+"E. c #F4EFF9",
+"W. c #F2F2F3",
+/* pixels */
+"I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.I.U.U.I.U.I.I.I.R.U.I.U.I.",
+"I.U.T.Y.T.T.T.T.T.U.Y.T.T.T.T.U.T.T.T.T.U.T.U.T.Y.I.I.U.I.I.I.I.",
+"U.I.N.N.N.N.V.N.N.A.A.A.Z.N.N.N.N.N.V.V.A.A.A.V.H.U.U.I.I.P.I.U.",
+"Y.K.l { { / } V G 9 4 4 J l ( { { { V G 0 5 5 c 5.Y.I.I.T.W.I.I.",
+"U.K.H f.' v f.E c o o X 3 E d.' -.f.o.S o X . , j.R.I.T.0.0.T.I.",
+"Y.K.G d.s i a. .> . o . = U d.a i a.o.2 . o . & i.I.I.W.2.  W.I.",
+"Y.K.I ' u y ;.( W ! # 8 +.I [ u y g ( W ~ $ 7 ^ i.Y.I.Y.2.<.T.I.",
+"Y.K.I >.a d ;.T | x.t O.a.I m a d -.T } x.t O.s.y.Y.I.U.U.T.U.I.",
+"T.S.< K I I Y 1 N U J Y G < H I I Y j j G J G x 4.Y.I.I.U.I.I.I.",
+"Y.K.G *.*.$.a.T W ; & & n U $.*.*.s.W { a.$.a.@.y.Y.I.I.I.U.I.I.",
+"U.K.H a.a.a.a.o.6 . X . - U *.a.*.s.T } a.a.a.@.i.Y.I.W.2.7.W.I.",
+"Y.K.G a.*.*.a.{ 0 * X + 3 H a.*.*.a.W ( a.a.a.$.y.Y.I.W.1.,.W.P.",
+"U.K.H s.a.a.s.T O.f.e ] x.G s.a.a.s.E } s.a.a.*.i.Y.I.T.0.9.U.I.",
+"Y.K.N | } } ..B K ..b { } j } } } #.B H | } } Q 5.Y.I.I.T.W.I.U.",
+"T.D.j { K K { M Z / ( / K h { K K { N B ` K { F 4.T.I.I.T.U.I.I.",
+"Y.K.H s.a.s.s.E X.f.-.=.a.H s.a.s.f.{ } s.s.s.*.i.Y.U.T.0.V.Y.I.",
+"U.K.G a.a.a.a.K ..&.u v p.G a.$.*.a.T { a.*.a.@.u.Y.I.W.1.2.W.I.",
+"Y.K.G a.$.a.a.U ..a u p #.G a.a.*.a.W } s.*.*.$.u.Y.I.W.2.,.T.I.",
+"Y.K.H a.a.a.s./ | f a s ' H a.a.a.s.E } s.a.s.$.i.Y.I.I.I.I.I.I.",
+"U.H.k K U I / 1 N Y I I G < H G G K j M J G G D 4.T.I.I.I.I.U.I.",
+"U.L.e.w @ @ , U { *.*.=.X.B a.$.#.a.K / *.#.*.%.y.Y.U.I.I.U.I.I.",
+"U.P.w.% . . O A X.s.a.*.a.G a.a.*.s.{ } s.a.a.*.y.Y.I.T.2.9.W.I.",
+"I.R.P : O o = q X.a.*.a.$.G a.*.a.a./ { a.*.a.$.y.Y.I.W.2.<.W.I.",
+"U.L.w.x.z r c.E X.a.a.a.a.H a.a.a.s./ } s.s.a.*.i.Y.I.Y.9.7.U.I.",
+"U.L.L +.R b @.A K #.| | | N #.| | #.G F %.} } _ t.Y.I.I.T.W.I.U.",
+"Y.S.3.B.l.l.B.6.x E K K J 1 K K K K l 8.n.z.n.n.9.Y.I.I.T.U.I.I.",
+"U.J.k.E.T.U.E.B.| s.s.s.a.H s.s.s.s. .G.W.T.Y.T.M.I.I.U.M.F.U.U.",
+"Y.J.k.Y.I.I.Y.l._ *.$.*.$.D $.$.*.*.K V.T.I.I.I.0.I.I.W.1.2.W.I.",
+"T.K.n.Y.I.I.Y.C.h.m.v.v.v.r.m.v.v.m.g.G.Y.U.I.I.N.I.I.W.7.2.W.I.",
+"U.U.U.U.I.I.U.U.Y.R.R.Y.R.Y.Y.U.U.U.Y.U.I.I.I.U.I.I.I.I.I.U.I.I.",
+"U.I.I.I.U.I.U.R.U.I.I.U.U.I.I.I.I.I.I.U.I.U.I.U.I.I.I.I.U.I.I.I.",
+"I.I.R.I.I.U.I.I.I.I.I.I.I.I.I.I.I.R.I.U.I.I.I.I.R.I.I.U.I.I.R.U."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 171 2 ",
+"   c #3C3C3C",
+".  c #484848",
+"X  c #5B5B5B",
+"o  c #535353",
+"O  c #6B6B6B",
+"+  c #626262",
+"@  c gray48",
+"#  c #A45A02",
+"$  c #A66407",
+"%  c #369801",
+"&  c #00AD00",
+"*  c #04B402",
+"=  c #00B800",
+"-  c #0CB609",
+";  c #0BB808",
+":  c #0AB807",
+">  c #1ABE13",
+",  c #418E00",
+"<  c #5B8000",
+"1  c #26C21C",
+"2  c #2FCC21",
+"3  c #31CD23",
+"4  c #5FC835",
+"5  c #46D332",
+"6  c #4DD334",
+"7  c #51D636",
+"8  c #54D83B",
+"9  c #669249",
+"0  c #69944C",
+"q  c #77B051",
+"w  c #7BB454",
+"e  c #7EB35A",
+"r  c #778F67",
+"t  c #789167",
+"y  c #7D9070",
+"u  c #5BDA41",
+"i  c #62DC44",
+"p  c #6ADC4C",
+"a  c #69D947",
+"s  c #74DD4E",
+"d  c #79DA4D",
+"f  c #76DC50",
+"g  c #68E149",
+"h  c #76E552",
+"j  c #7CEB55",
+"k  c #CEAD00",
+"l  c #D0A800",
+"z  c #CCB301",
+"x  c #CBBB0D",
+"c  c #C8BE15",
+"v  c #C9C31A",
+"b  c #C7C21C",
+"n  c #C6C926",
+"m  c #C7C720",
+"M  c #C4D133",
+"N  c #84BC5D",
+"B  c #88BF5F",
+"V  c #80B75C",
+"C  c #86BF60",
+"Z  c #89BF65",
+"A  c #85C15C",
+"S  c #88C05F",
+"D  c #9CD95D",
+"F  c #A4C64E",
+"G  c #BFD943",
+"H  c #BFDF4C",
+"J  c #A6CC55",
+"K  c #B4C257",
+"L  c #81E659",
+"P  c #91E05B",
+"I  c #BDE04E",
+"U  c #BDE454",
+"Y  c #BBE658",
+"T  c #87C162",
+"R  c #8AC363",
+"E  c #8DC964",
+"W  c #89CB69",
+"Q  c #90C667",
+"!  c #92C569",
+"~  c #94C86B",
+"^  c #93DF60",
+"/  c #94CF71",
+"(  c #B8DF6D",
+")  c #9BE868",
+"_  c #8BF065",
+"`  c #9AF36C",
+"'  c #95F06A",
+"]  c #9FE372",
+"[  c #99F770",
+"{  c #9EF873",
+"}  c #A2ED6D",
+"|  c #ADE96D",
+" . c #BAED63",
+".. c #A4F66D",
+"X. c #B6F36C",
+"o. c #B8F56E",
+"O. c #A4EE73",
+"+. c #A9EF75",
+"@. c #A7EF78",
+"#. c #A8EF78",
+"$. c #BAED78",
+"%. c #B8E370",
+"&. c #A5F373",
+"*. c #ACF275",
+"=. c #ACFD76",
+"-. c #ABF47A",
+";. c #AFFA7C",
+":. c #A5F977",
+">. c #B6F673",
+",. c #B2FD7E",
+"<. c #B8FD78",
+"1. c #B2F67B",
+"2. c #C0D740",
+"3. c #848484",
+"4. c #888888",
+"5. c #989898",
+"6. c #91A285",
+"7. c #94AB85",
+"8. c #97B783",
+"9. c #99B685",
+"0. c #97B881",
+"q. c #9CB986",
+"w. c #9DB58D",
+"e. c #9FB98C",
+"r. c #9DA896",
+"t. c #A5AE9F",
+"y. c #A2B792",
+"u. c #A4B993",
+"i. c #AABB96",
+"p. c #A4B599",
+"a. c #ABBB98",
+"s. c #A2A2A2",
+"d. c #AAABAA",
+"f. c #ACB7A4",
+"g. c #ACB8A5",
+"h. c #AEBAAA",
+"j. c #B3BBAB",
+"k. c #B5B5B5",
+"l. c #BABABA",
+"z. c #ADFC84",
+"x. c #B4FF81",
+"c. c #B9FF84",
+"v. c #B2FF89",
+"b. c #BAFF89",
+"n. c #BFC2BD",
+"m. c #C8DABD",
+"M. c #C0C0C0",
+"N. c #CFCFCF",
+"B. c #CED8C7",
+"V. c #CED7C8",
+"C. c #D2D7CE",
+"Z. c #D5D5D5",
+"A. c #DBDBDB",
+"S. c #D6EEC6",
+"D. c #DFE5DB",
+"F. c #E0EDD7",
+"G. c #E3ECDE",
+"H. c #E0E3DF",
+"J. c #E2DEE4",
+"K. c #E6E6E6",
+"L. c #E8E8E7",
+"P. c #E7E5E8",
+"I. c #EAE6ED",
+"U. c #EBEAEB",
+"Y. c #E4E8E2",
+"T. c #EFECF1",
+"R. c #F0EEF1",
+"E. c #F3EBF8",
+"W. c #F3F2F3",
+"Q. c #F9F9F9",
+"!. c #F8F2FD",
+/* pixels */
+"K.K.K.K.L.L.P.K.K.K.K.K.L.K.K.K.K.K.K.L.K.K.K.K.K.K.K.K.K.K.K.K.L.K.K.K.K.L.L.K.K.K.L.K.K.K.K.K.",
+"K.K.L.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.L.K.K.K.K.K.L.K.K.K.K.K.K.K.K.K.K.L.K.L.K.K.K.",
+"K.L.K.K.K.K.K.K.K.K.K.L.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.L.K.K.K.L.K.K.K.P.L.K.K.K.K.K.P.K.",
+"K.K.K.L.P.Y.K.K.K.K.K.L.K.K.K.K.Y.K.K.K.Y.K.K.K.K.K.K.K.P.Y.K.K.K.K.Y.K.K.K.K.K.K.K.L.K.K.K.K.K.",
+"K.K.L.K.T.I.I.I.I.I.I.I.R.I.I.I.I.I.I.I.R.I.I.T.I.I.I.I.I.I.I.I.P.I.I.I.L.K.K.K.K.L.K.K.K.K.K.L.",
+"K.K.L.H.6.w.w.w.w.w.y.w.6.w.i.a.a.a.u.w.6.w.w.w.w.w.w.w.6.y.a.a.a.a.a.7.m.I.K.K.K.K.P.L.P.K.K.K.",
+"K.K.P.G.N :.=.=.;.=.=.=.N =.i 7 6 6 g =.A ,.=.=.=.=.=.&.A =.8 7 7 6 j } d.I.Y.K.L.L.T.L.K.K.K.K.",
+"K.K.L.Y.Z x.x.c.M <.x.,.Q [ & & * & - -.R c.x.>.M x.c.-.~ _ & * & & 1 #.f.T.K.K.L.A.M.A.L.K.P.K.",
+"K.K.P.G.Z ;.v.Y k I v.,.! u & * * * & a ! ,.v.G l  .v.*.~ 5 & * * * * s j.R.J.K.U.N.o O W.K.K.K.",
+"L.K.P.G.Z ,.x.b k c ,.z.! 8 * * = * * i Q x.1.x z n v.+.Q 5 & * = * * s j.T.Y.K.K.U.@ X W.K.K.K.",
+"K.K.P.Y.Z z.Y k z l H v.N c.&.a % s :.;.S v.G k z z  .z.R c.[ 4 % L :.&.g.T.K.Y.W.l.X @ U.K.K.P.",
+"K.L.L.G.T ;.b k z z c ,.T ,.b.( # $.b.,.T <.x z z z n z.S c.b.K $ b.b.} g.T.K.K.K.H.A.U.K.K.K.L.",
+"K.K.L.G.Z 1.X.X.o.o.o.,.S ,.;.*.F -.,.-.S ,.X.o.o.o.o.-.T c.;.| J ;.x.O.g.T.K.K.K.L.L.P.P.K.K.K.",
+"K.K.P.H.0 N W T T T T T 9 T ! ~ / ! ! C 9 T T T T T T e 9 E T T W T R q s.T.Y.K.K.K.K.K.K.K.K.K.",
+"K.K.L.G.Z ,.c.,.x.,.,.,.C c.u 5 5 5 g ,.T c.,.,.x.x.c.-.R c.x.,.x.,.c.&.g.W.H.P.P.L.W.K.K.K.K.K.",
+"K.L.K.G.Z ;.,.,.x.z.c.;.T [ & & & & - &.R c.,.,.z.x.c.-.T x.;.x.,.x.x.} g.T.K.K.L.A.k.H.L.K.K.K.",
+"K.K.L.G.T ;.x.x.x.,.x.;.! 8 & : & - & i ! x.x.,.c.,.x.-.T c.;.,.x.x.c.} g.T.Y.J.P.Z.  k.W.P.K.K.",
+"K.P.L.G.Z ;.x.x.x.x.x.;.! u * * = * * p Q ,.z.,.x.,.x.-.E c.,.x.,.x.x.O.g.T.Y.K.Y.Q.O d.W.K.K.K.",
+"K.K.L.Y.Z ;.x.,.,.x.x.x.Z c.:.f , L ;.x.S c.z.,.,.x.x.-.T c.,.x.,.x.x.O.g.T.Y.P.L.N.. @ U.K.K.P.",
+"K.K.L.Y.Z ,.,.c.x.x.,.c.N ,.b.( # $.b.-.S c.,.x.x.x.c.-.T c.x.x.x.c.c.O.g.T.Y.K.P.P.P.K.K.K.K.K.",
+"K.K.L.G.C -.z.;.;.;.;.-.N ;.;.*.J -.;.-.N ,.;.;.;.;.;.@.S ,.;.;.;.;.x.) f.T.J.K.L.L.P.K.P.K.L.K.",
+"K.K.P.D.0 N Z T T T T T 9 T C T W R R N 9 R S T C T R N 9 E C T T N T w t.R.Y.Y.K.K.Y.P.K.K.K.K.",
+"K.K.P.Y.Z ,.x.c.c.c.c.c.T c.x.x.<.c.c.z.R c.x.c.c.c.c.-.T c.c.c.c.c.c.O.f.T.Y.P.K.L.W.L.K.K.K.K.",
+"K.K.L.G.Z ;.x.,.;.,.,.;.C c.x.>.m 1.x.;.N c.,.,.,.;.c.-.R c.;.;.,.,.c.O.f.T.P.K.L.A.d.A.L.K.K.K.",
+"K.K.P.Y.Z ;.x.x.,.x.x.x.T ,.v.G l U v.;.T x.x.x.x.x.x.-.T c.;.,.x.x.c.} g.T.Y.J.U.A.  k.R.K.K.K.",
+"K.K.L.G.Z ;.x.,.x.x.;.x.C x.>.c k c ,.,.S c.,.,.,.x.x.-.E c.,.x.,.x.x.O.g.T.Y.K.H.Q.O d.R.K.P.L.",
+"K.K.L.G.T ;.x.x.,.,.,.,.N v.M z z k I z.N c.,.x.x.x.x.-.T c.,.x.,.x.c.O.g.T.Y.P.U.N.o @ U.Y.K.K.",
+"K.K.L.Y.Z ;.c.x.c.x.x.c.R ,.v x x x b ,.T c.,.c.x.x.c.-.R c.x.x.,.c.c.O.g.T.Y.K.K.K.U.U.K.L.K.K.",
+"K.K.K.G.C @.-.@.-.-.-.-.e +.+.*.*.*.*.+.N -.-.-.-.-.-.O.N ;.-.-.-.-.-.) f.T.K.K.K.K.K.K.K.K.K.K.",
+"K.K.K.K.r N ~ E E Q Q R 9 E R T R R R C 0 T R R T T R N 0 E T R T R E w t.R.H.K.K.K.H.K.K.K.K.P.",
+"K.K.K.I.y.,.8 2 3 3 5 c.T c.c.c.c.x.c.x.Z c.c.x.c.c.c.-.R c.c.c.c.c.b.@.f.T.K.P.K.L.W.U.K.K.K.K.",
+"K.K.K.I.y.` * & & & & ' R x.x.,.x.,.c.-.C x.x.,.,.c.c.-.R c.,.;.,.,.v.{ f.T.H.K.U.Z.5.A.U.K.K.K.",
+"L.K.K.I.a.7 & * : * & 6 ! ,.x.x.x.,.c.;.C c.,.,.c.x.x.-.T c.,.x.,.,.x.&.g.T.K.K.L.A.. k.W.K.K.K.",
+"K.K.K.I.u.h > ; = ; > h Z x.x.,.x.,.x.;.T x.z.x.,.,.x.-.T c.,.,.x.x.c.O.g.T.H.K.J.Q.+ s.W.H.K.K.",
+"K.K.K.I.w.1.c.) < P c.c.C x.x.,.,.x.x.-.S c.;.,.x.;.c.-.R c.;.x.x.,.c.` g.T.H.K.U.N.X 4.U.K.K.K.",
+"K.K.K.T.w.;.b.$.$ %.b.c.T x.x.c.c.x.c.x.T c.c.x.x.c.c.-.Z b.c.c.x.c.b.+.g.T.K.K.K.L.W.U.K.P.K.K.",
+"K.K.K.I.7.) &.} D } O.} w &.@.@.@.@.@.O.e -.@.@.@.@.+.} e &.O.} O.O.&.D f.T.Y.K.K.K.H.K.K.K.K.K.",
+"K.K.L.H.t f.f.f.h.g.f.h.r S E R E R R Z 0 E T E E E E N y j.f.f.f.f.j.r.d.R.K.K.K.K.J.K.K.K.K.K.",
+"K.K.P.F.e.T.R.R.T.T.T.E.e.,.b.c.c.c.c.x.R b.x.c.x.c.b.*.f.!.T.T.T.I.E.J.k.U.K.K.K.U.Q.L.K.K.K.L.",
+"K.K.P.F.8.K.K.J.Y.K.K.P.9.=.x.,.,.,.x.,.N c.,.,.,.x.x.&.p.I.Y.Y.Y.Y.L.Z.k.U.K.K.L.Z.4.Z.L.K.K.P.",
+"K.K.L.F.9.J.K.K.K.K.K.I.9.,.c.,.x.x.v.;.R c.c.,.x.x.x.=.p.T.K.K.K.K.U.Z.k.R.K.K.K.K.. k.W.K.K.K.",
+"K.P.L.D.8.P.K.P.K.K.K.I.9.=.,.=.=.;.,.=.A ,.=.,.,.=.,.` p.T.K.K.K.K.U.Z.k.U.K.K.K.W.X s.W.K.K.K.",
+"K.K.K.Y.V.L.K.K.K.K.K.P.V.S.S.S.S.S.S.S.m.S.S.S.S.S.S.S.C.L.K.K.K.K.K.K.Z.K.K.P.K.A.s.l.U.K.K.K.",
+"K.L.K.P.I.L.L.K.K.K.K.K.I.I.I.P.I.I.L.I.P.I.I.I.I.I.I.I.U.K.K.K.K.K.K.K.L.K.K.K.P.K.W.R.K.K.K.K.",
+"P.K.K.K.K.K.K.K.L.K.L.K.K.Y.K.K.K.K.K.K.K.K.K.K.K.K.K.K.P.K.K.K.K.K.K.L.P.K.K.K.K.K.K.K.K.K.K.K.",
+"K.K.K.K.P.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.K.L.K.K.K.L.K.K.L.K.K.K.K.K.K.K.K.K.L.K.",
+"L.K.L.K.L.K.K.K.K.L.K.L.K.L.K.K.K.P.K.L.K.K.K.L.K.K.K.K.K.K.K.K.P.K.L.K.K.K.L.K.K.K.K.K.L.K.K.K.",
+"P.K.K.K.K.K.K.K.K.P.K.L.K.K.K.K.K.L.K.K.K.K.K.L.K.K.K.K.K.K.K.K.K.K.L.K.L.K.K.K.K.K.K.K.K.K.K.K."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/tents-web.png b/icons/tents-web.png
new file mode 100644 (file)
index 0000000..f2ed992
Binary files /dev/null and b/icons/tents-web.png differ
diff --git a/icons/tents.ico b/icons/tents.ico
new file mode 100644 (file)
index 0000000..9056209
Binary files /dev/null and b/icons/tents.ico differ
diff --git a/icons/tents.rc b/icons/tents.rc
new file mode 100644 (file)
index 0000000..ec89f8e
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "tents.ico"
diff --git a/icons/towers-16d24.png b/icons/towers-16d24.png
new file mode 100644 (file)
index 0000000..37e41b4
Binary files /dev/null and b/icons/towers-16d24.png differ
diff --git a/icons/towers-16d4.png b/icons/towers-16d4.png
new file mode 100644 (file)
index 0000000..fdb779c
Binary files /dev/null and b/icons/towers-16d4.png differ
diff --git a/icons/towers-16d8.png b/icons/towers-16d8.png
new file mode 100644 (file)
index 0000000..632de37
Binary files /dev/null and b/icons/towers-16d8.png differ
diff --git a/icons/towers-32d24.png b/icons/towers-32d24.png
new file mode 100644 (file)
index 0000000..41047cc
Binary files /dev/null and b/icons/towers-32d24.png differ
diff --git a/icons/towers-32d4.png b/icons/towers-32d4.png
new file mode 100644 (file)
index 0000000..c802adb
Binary files /dev/null and b/icons/towers-32d4.png differ
diff --git a/icons/towers-32d8.png b/icons/towers-32d8.png
new file mode 100644 (file)
index 0000000..8cae517
Binary files /dev/null and b/icons/towers-32d8.png differ
diff --git a/icons/towers-48d24.png b/icons/towers-48d24.png
new file mode 100644 (file)
index 0000000..3c3e368
Binary files /dev/null and b/icons/towers-48d24.png differ
diff --git a/icons/towers-48d4.png b/icons/towers-48d4.png
new file mode 100644 (file)
index 0000000..4f3fc47
Binary files /dev/null and b/icons/towers-48d4.png differ
diff --git a/icons/towers-48d8.png b/icons/towers-48d8.png
new file mode 100644 (file)
index 0000000..50e103a
Binary files /dev/null and b/icons/towers-48d8.png differ
diff --git a/icons/towers-base.png b/icons/towers-base.png
new file mode 100644 (file)
index 0000000..ce2c801
Binary files /dev/null and b/icons/towers-base.png differ
diff --git a/icons/towers-ibase.png b/icons/towers-ibase.png
new file mode 100644 (file)
index 0000000..4980e90
Binary files /dev/null and b/icons/towers-ibase.png differ
diff --git a/icons/towers-ibase4.png b/icons/towers-ibase4.png
new file mode 100644 (file)
index 0000000..c562492
Binary files /dev/null and b/icons/towers-ibase4.png differ
diff --git a/icons/towers-icon.c b/icons/towers-icon.c
new file mode 100644 (file)
index 0000000..aae6c24
--- /dev/null
@@ -0,0 +1,801 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 245 2 ",
+"   c #E6E6E6",
+".  c #E6E6E6",
+"X  c #E6E6E6",
+"o  c gray91",
+"O  c #EAEAEA",
+"+  c #E6E6E6",
+"@  c #E6E6E6",
+"#  c #E6E6E6",
+"$  c #EAEAEA",
+"%  c #E9E9E9",
+"&  c #E6E6E6",
+"*  c #E6E6E6",
+"=  c #E6E6E6",
+"-  c gray91",
+";  c gainsboro",
+":  c #D7D7D7",
+">  c #E7E7E7",
+",  c #E6E6E6",
+"<  c #E6E6E6",
+"1  c #E6E6E6",
+"2  c gray91",
+"3  c #D7D7D7",
+"4  c #DADADA",
+"5  c gray91",
+"6  c #E6E6E6",
+"7  c #E6E6E6",
+"8  c #E4E4E4",
+"9  c #ECECEC",
+"0  c #C6C6C6",
+"q  c #767676",
+"w  c #EFEFEF",
+"e  c gray89",
+"r  c gray90",
+"t  c gray94",
+"y  c #AEAEAE",
+"u  c #5D5D5D",
+"i  c gray92",
+"p  c gray90",
+"a  c #E6E6E6",
+"s  c #E6E6E6",
+"d  c gray92",
+"f  c #EFEFEF",
+"g  c #CECECE",
+"h  c gray38",
+"j  c gray89",
+"k  c #EAEAEA",
+"l  c gray91",
+"z  c gray91",
+"x  c gray93",
+"c  c #AEAEAE",
+"v  c DimGray",
+"b  c gray91",
+"n  c #E7E7E7",
+"m  c #E6E6E6",
+"M  c #E6E6E6",
+"N  c #E7E7E7",
+"B  c gray76",
+"V  c gray76",
+"C  c #C0C0C0",
+"Z  c #B1B2B1",
+"A  c #C0C2C0",
+"S  c gray78",
+"D  c gray77",
+"F  c #C6C6C6",
+"G  c gray91",
+"H  c gray84",
+"J  c #DDDDDD",
+"K  c #E6E6E6",
+"L  c #E4E4E4",
+"P  c #E6E6E6",
+"I  c #E7E7E7",
+"U  c gray91",
+"Y  c #9F9F9F",
+"T  c #DADADA",
+"R  c #E6E7E6",
+"E  c #E9E8E9",
+"W  c #F0E8F0",
+"Q  c #E2E2E2",
+"!  c #E7E6E7",
+"~  c gray72",
+"^  c #C1C1C1",
+"/  c gray79",
+"(  c #C4C6C4",
+")  c gray77",
+"_  c gray78",
+"`  c gray",
+"'  c gray86",
+"]  c gray92",
+"[  c gray68",
+"{  c #DDDDDD",
+"}  c #EDEAED",
+"|  c #DFE3DF",
+" . c #A9CEA9",
+".. c #E8E7E8",
+"X. c gray91",
+"o. c gray78",
+"O. c gray90",
+"+. c #ECE9EC",
+"@. c #F5EDF5",
+"#. c #ECE9EC",
+"$. c #EBECEB",
+"%. c gray82",
+"&. c gray83",
+"*. c #EAEAEA",
+"=. c #A9AAA9",
+"-. c #DBDCDB",
+";. c #F0EBF0",
+":. c #87C087",
+">. c #3FA03F",
+",. c gray90",
+"<. c gray91",
+"1. c #C4C5C4",
+"2. c #EAE6EA",
+"3. c #C5D9C5",
+"4. c #80BD80",
+"5. c #C9DAC9",
+"6. c #F0EDF0",
+"7. c #CFD0CF",
+"8. c gray83",
+"9. c #EAEAEA",
+"0. c #AAAAAA",
+"q. c #DEDDDE",
+"w. c #E5E7E5",
+"e. c #71B771",
+"r. c #349E34",
+"t. c #CDDCCD",
+"y. c #EDEAED",
+"u. c #C4C5C4",
+"i. c #E4E4E4",
+"p. c #E5E6E5",
+"a. c #69B469",
+"s. c #9DC89D",
+"d. c #F9F0F9",
+"f. c #CDCFCD",
+"g. c gray83",
+"h. c #EAEAEA",
+"j. c #A9A9A9",
+"k. c gainsboro",
+"l. c #E9E8E9",
+"z. c #EBE8EB",
+"x. c #C9DAC9",
+"c. c #E4E5E4",
+"v. c #E8E7E8",
+"b. c #C3C5C3",
+"n. c #EEE8EE",
+"m. c #B0D1B0",
+"M. c #38A038",
+"N. c #C6D8C6",
+"B. c #F0EDF0",
+"V. c #CECFCE",
+"C. c gray92",
+"Z. c #AEAEAE",
+"A. c gray87",
+"S. c #EAEAEA",
+"D. c #E6E7E6",
+"F. c #EEEAEE",
+"G. c #E7E7E7",
+"H. c #E9E9E9",
+"J. c #C8C8C8",
+"K. c #E8E7E8",
+"L. c #DAE2DA",
+"P. c #C5DAC5",
+"I. c #D8E1D8",
+"U. c #EFEDEF",
+"Y. c gray82",
+"T. c gray83",
+"R. c gray56",
+"E. c #A4A4A4",
+"W. c gray68",
+"Q. c #AAABAA",
+"!. c #A9AAA9",
+"~. c #ACACAC",
+"^. c #A7A7A7",
+"/. c #AAAAAA",
+"(. c #E4E4E4",
+"). c #E3E1E3",
+"_. c #E9E4E9",
+"`. c #E3E1E3",
+"'. c gray90",
+"]. c #CDCDCD",
+"[. c gray83",
+"{. c #D8D8D8",
+"}. c gray64",
+"|. c #E1E1E1",
+" X c gray86",
+".X c #E0DEE0",
+"XX c #DEDDDE",
+"oX c #DDDEDD",
+"OX c #D7D7D7",
+"+X c #AAAAAA",
+"@X c #BBBBBB",
+"#X c #B9B9B9",
+"$X c #B8B9B8",
+"%X c #B9B9B9",
+"&X c #BBBBBB",
+"*X c #AAAAAA",
+"=X c gray86",
+"-X c #E4E4E4",
+";X c gray79",
+":X c #E9E9E9",
+">X c #E9E8E9",
+",X c #D8E2D8",
+"<X c #E1E5E1",
+"1X c #EBEAEB",
+"2X c gray89",
+"3X c gray",
+"4X c #D5D5D5",
+"5X c #D2D2D2",
+"6X c #D2D2D2",
+"7X c LightGray",
+"8X c gray82",
+"9X c gray75",
+"0X c gray91",
+"qX c #E6E6E6",
+"wX c gray89",
+"eX c #E6E6E6",
+"rX c #E6E6E6",
+"tX c #D9E0D9",
+"yX c #E0E3E0",
+"uX c #E7E6E7",
+"iX c gray90",
+"pX c #E6E6E6",
+"aX c #EAEAEA",
+"sX c #EAEAEA",
+"dX c #EAEAEA",
+"fX c #EAEAEA",
+"gX c #EAEAEA",
+"hX c gray90",
+"jX c #E6E6E6",
+"kX c #E7E7E7",
+"lX c #E6E6E6",
+"zX c #E6E6E6",
+"xX c #E9E7E9",
+"cX c #E7E7E7",
+"vX c #E6E6E6",
+"bX c #E6E6E6",
+"nX c #E6E6E6",
+"mX c gray90",
+"MX c gray90",
+"NX c gray90",
+"BX c gray90",
+"VX c gray90",
+"CX c #E6E6E6",
+"ZX c #E6E6E6",
+"AX c white",
+/* pixels */
+"  . X o O + .   @ # $ % & *     ",
+"  = - ; : > , < 1 2 3 4 5 6     ",
+"7 8 9 0 q w e r e t y u i p a   ",
+"s d f g h j k l z x c v b n m M ",
+"N B V C Z A S D F G H J K L P I ",
+"U Y T R E W Q ! ~ ^ / ( ) _ ` ' ",
+"] [ { } |  ...X.o.O.+.@.#.$.%.&.",
+"*.=.-.;.:.>.,.<.1.2.3.4.5.6.7.8.",
+"9.0.q.w.e.r.t.y.u.i.p.a.s.d.f.g.",
+"h.j.k.l.z.x.c.v.b.n.m.M.N.B.V.g.",
+"C.Z.A.S.D.F.G.H.J.K.L.P.I.U.Y.T.",
+"b R.E.W.Q.!.~.^./.(.)._.`.'.].[.",
+"{.}.|. X.XXXoXOX+X@X#X$X%X&X*X=X",
+"-X;X:X>X,X<X1X2X3X4X5X6X7X8X9X0X",
+"qXwXeXrXtXyXuXiXpXaXsXdXfXgXhX# ",
+"jXkXlXzXxXcXvXbXnXmXMXNXBXVXCXZX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 194 2 ",
+"   c gray6",
+".  c #1B1B1B",
+"X  c #232323",
+"o  c gray18",
+"O  c #3C3C3C",
+"+  c #3E3E3E",
+"@  c #414141",
+"#  c #434343",
+"$  c #515151",
+"%  c #535353",
+"&  c gray35",
+"*  c gray36",
+"=  c #676767",
+"-  c #686868",
+";  c gray42",
+":  c gray46",
+">  c #777777",
+",  c gray47",
+"<  c gray49",
+"1  c #7E7E7E",
+"2  c gray50",
+"3  c #008400",
+"4  c #038903",
+"5  c #129112",
+"6  c #169316",
+"7  c #199419",
+"8  c #1B941B",
+"9  c #1E911E",
+"0  c #219721",
+"q  c #2A9B2A",
+"w  c #2E982E",
+"e  c #2E9D2E",
+"r  c #309730",
+"t  c #379E37",
+"y  c #389C38",
+"u  c #41A241",
+"i  c #43A543",
+"p  c #4AA84A",
+"a  c #4EA94E",
+"s  c #51A751",
+"d  c #5BAE5B",
+"f  c #63B263",
+"g  c #6BB56B",
+"h  c #71B771",
+"j  c #7FBD7F",
+"k  c gray51",
+"l  c #838383",
+"z  c #848484",
+"x  c #868686",
+"c  c #8B8B8B",
+"v  c #909090",
+"b  c gray57",
+"n  c #929292",
+"m  c #939393",
+"M  c gray58",
+"N  c #959595",
+"B  c gray59",
+"V  c #979797",
+"C  c #989898",
+"Z  c gray60",
+"A  c #9A9A9A",
+"S  c #9B9B9B",
+"D  c #9D9D9D",
+"F  c #81BE81",
+"G  c #84BF84",
+"H  c #A0A0A0",
+"J  c gray64",
+"K  c #A4A4A4",
+"L  c gray65",
+"P  c gray66",
+"I  c #A9A9A9",
+"U  c #AAAAAA",
+"Y  c gray67",
+"T  c #AEAEAE",
+"R  c #AFAFAF",
+"E  c gray69",
+"W  c #B1B1B1",
+"Q  c #B2B2B2",
+"!  c gray70",
+"~  c #B4B4B4",
+"^  c gray71",
+"/  c #B6B6B6",
+"(  c #B7B7B7",
+")  c #B9B9B9",
+"_  c gray73",
+"`  c #BBBBBB",
+"'  c #BCBCBC",
+"]  c gray74",
+"[  c gray",
+"{  c #8EC38E",
+"}  c #97C697",
+"|  c #97C797",
+" . c #A0CAA0",
+".. c #AACEAA",
+"X. c #AFD0AF",
+"o. c #B2D1B2",
+"O. c #B5D2B5",
+"+. c #B8D3B8",
+"@. c #B9D4B9",
+"#. c #BAD5BA",
+"$. c #C1C1C1",
+"%. c gray76",
+"&. c gray77",
+"*. c #C5C5C5",
+"=. c #C6C6C6",
+"-. c gray78",
+";. c #C8C8C8",
+":. c gray79",
+">. c #CACACA",
+",. c #CBCBCB",
+"<. c #CDCDCD",
+"1. c #CECECE",
+"2. c gray81",
+"3. c #C5D9C5",
+"4. c #C7D9C7",
+"5. c #C7DAC7",
+"6. c #CADBCA",
+"7. c #CCDCCC",
+"8. c #CEDCCE",
+"9. c #CEDDCE",
+"0. c #D0D0D0",
+"q. c gray82",
+"w. c #D2D2D2",
+"e. c #D5D5D5",
+"r. c #D7D7D7",
+"t. c #D3DED3",
+"y. c #D5DFD5",
+"u. c gray85",
+"i. c gray86",
+"p. c #DDDDDD",
+"a. c gray87",
+"s. c #D6E0D6",
+"d. c #D7E0D7",
+"f. c #DEE3DE",
+"g. c gray88",
+"h. c #E1E1E1",
+"j. c #E1E3E1",
+"k. c #E2E2E2",
+"l. c #E2E3E2",
+"z. c gray89",
+"x. c #E0E4E0",
+"c. c #E1E4E1",
+"v. c #E3E4E3",
+"b. c #E3E5E3",
+"n. c #E4E4E4",
+"m. c #E4E5E4",
+"M. c gray90",
+"N. c #E5E6E5",
+"B. c #E6E6E6",
+"V. c #E6E7E6",
+"C. c #E7E6E7",
+"Z. c #E7E7E7",
+"A. c #E8E7E8",
+"S. c #E9E7E9",
+"D. c #EAE7EA",
+"F. c gray91",
+"G. c #E9E9E9",
+"H. c #EAE8EA",
+"J. c #EBE8EB",
+"K. c #EAEAEA",
+"L. c gray92",
+"P. c #ECE8EC",
+"I. c #EDE9ED",
+"U. c #EEE9EE",
+"Y. c #EFE9EF",
+"T. c #EEEAEE",
+"R. c #EFEAEF",
+"E. c #ECECEC",
+"W. c #ECEDEC",
+"Q. c gray93",
+"!. c #EEEEEE",
+"~. c #EFEFEF",
+"^. c #EFF0EF",
+"/. c #F0EAF0",
+"(. c #F0EBF0",
+"). c #F1EAF1",
+"_. c #F3EBF3",
+"`. c #F2ECF2",
+"'. c #F3ECF3",
+"]. c #F4EBF4",
+"[. c #F5ECF5",
+"{. c #F6EDF6",
+"}. c gray94",
+"|. c #F1F1F1",
+" X c gray95",
+".X c #F3F3F3",
+"XX c #F4F4F4",
+"oX c gray96",
+"OX c #F6F6F6",
+"+X c gray97",
+"@X c #FEF0FE",
+"#X c #FFF1FF",
+"$X c #F8F8F8",
+"%X c #F9F9F9",
+/* pixels */
+"B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.",
+"B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.z.B.B.B.B.B.B.B.B.B.B.",
+"B.B.B.B.B.B.B.G.G.B.B.B.B.B.B.B.B.B.B.B.B.~.G.z.B.B.B.B.B.B.B.B.",
+"B.B.B.B.B.B.G.i.2.z.B.B.B.B.B.B.B.B.B.B.B.:.2.~.B.B.B.B.B.B.B.B.",
+"B.B.B.B.B.z.~.M   L  Xz.B.B.B.B.B.B.B.G.q.= o 2  Xz.B.B.B.B.B.B.",
+"B.B.B.B.B.B.z.XX# M XXB.B.B.B.B.B.B.B.B.~.P . z XXz.B.B.B.B.B.B.",
+"B.B.B.B.B.B.z. X+ m XXz.B.B.B.z.B.B.B.B.a.q.& $ XXB.B.B.B.B.B.B.",
+"B.B.B.B.~.G.XXM X @ q. XG.G.~.G.G.G.z.~._ $ + c  Xz.B.B.B.B.B.B.",
+"B.B. Xz.2.q.q.-.-.$.2.q.2.2.q.q.q.z.v.z.N.r.a.~.z.z.z.z.B.B.B.B.",
+"B.z.$.: T T T Q Q Q Q T Q T T Q C ] %X~.^. X`.~.~. X X~.~.~.B.B.",
+"B.G.C : XX X~.^.~.~.~.~.~.~.^.XXe.m ' ^ ^ ( ^ ^ ^ ^ ^ ^ ^ ^ z.B.",
+"B.~.-.l G.z.B.v.n.z.f.z.v.z.B.G.:.D 2.-.-.-.-.-.-.-.:.-.q.D :.~.",
+"z.~.] 2 ~.z.B.B.B.B.[.Y.B.B.B.L.:._ XX~.~.L.L.~.~.L.~.G.XX_ :.~.",
+"z.~.] 2 G.B.B.B.D.f.i F _.v.v.~.:.^ ~.z.B.v.G.B.z.B.B.z. XQ :.~.",
+"z.~.] 2 ~.B.B.v.[.f 3 s `.v.v.L.:.! ~.z.B.G.s.f.Y.B.B.z. X^ :.~.",
+"z.~.] 2 G.B.v._.} h g p #Xv.B.~.,.! ^.z.Y.d 0 7 | Y.B.z.~.^ :.G.",
+"h.].[ 1 L.B.v.Y.y u q 5 O.Y.z.~.:.!  Xv.N.X.N.s r `.B.v.^.^ :.~.",
+"h.].[ 1 L.B.B.D. .F w 8 6.D.z.~.,.^  Xv.v.#Xs.7 { [.v.v. XQ :.~.",
+"D.).' 1 L.B.B.v._.#Xo...[.B.B.G.:.! ~.z.Y.O.6 j _.v.B.v.~.^ :.~.",
+"k.Y.) h L.B.B.B.v.z.Y._.v.B.B.~.,.! ~.z.Y.t 4 e a D.B.B. X^ :.G.",
+"k.Y.] 1 G.z.B.z.v.z.z.f.z.z.z.G.-.! ^.B.B.7.3.@.6.B.B.z.~.Q :.~.",
+"C.).' z  X~.~.~.~.~.~.~.~.~.~. Xw.^ ~.v.B.P.Y._.Y.B.B.z.~.^ :.~.",
+"n._.*.; _ ^ ^ Q ^ Q ^ ^ Q ^ ^ ] A R  XB.B.B.z.v.v.B.B.z. XQ :.~.",
+"n.P.< * D c m m m m m m m m m M : q.G.v.B.B.B.v.v.B.B.z.~.^ :.~.",
+"n.Y.- ] G.z.z.z.z.z.z.z.z.z.z.B.M L T P T P P P P P P P Q 2 q.L.",
+"G.i.x :.`.N.N.B.B.B.B.N.N.B.B.G.J :.q.0.2.q.q.q.q.q.q.q.:.J G.B.",
+"B.~._ $.~.z.N.N.Y.Y.G.B.N.B.B.~.M P Q T T R T T Q T T ( c _ ^.B.",
+"n.~.] $.~.B.B.G.7.O.7.D.G.B.B.B.Y L.^.^.^.`.~.~.~.~.~.XX2.] ~.z.",
+"B.B.z.z.B.B.B.B.y.5.s.B.B.B.B.B.f.z.v.B.B.z.z.B.z.z.z.B.z.z.B.B.",
+"B.B.B.B.B.B.B.B.G.Y.D.B.B.B.B.B.D.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.",
+"B.B.B.B.B.B.B.B.v.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.",
+"B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 239 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c #040404",
+"O  c #0C0C0C",
+"+  c #0E0E0E",
+"@  c #111111",
+"#  c #131313",
+"$  c #151515",
+"%  c gray13",
+"&  c #2C2C2C",
+"*  c #3F3F3F",
+"=  c #007900",
+"-  c #007C00",
+";  c #007D00",
+":  c #007F00",
+">  c gray26",
+",  c gray29",
+"<  c #4C4C4C",
+"1  c gray31",
+"2  c #505050",
+"3  c gray32",
+"4  c #555555",
+"5  c #5D5D5D",
+"6  c gray37",
+"7  c #626262",
+"8  c gray39",
+"9  c #646464",
+"0  c gray40",
+"q  c DimGray",
+"w  c #6A6A6A",
+"e  c gray44",
+"r  c #717171",
+"t  c #727272",
+"y  c gray45",
+"u  c gray46",
+"i  c gray47",
+"p  c #797979",
+"a  c gray48",
+"s  c #7B7B7B",
+"d  c #7C7C7C",
+"f  c #7E7E7E",
+"g  c gray50",
+"h  c #008200",
+"j  c #008300",
+"k  c #008500",
+"l  c #018501",
+"z  c #008600",
+"x  c #008800",
+"c  c #028B02",
+"v  c #078C07",
+"b  c #078D07",
+"n  c #098C09",
+"m  c #0E8D0E",
+"M  c #148D14",
+"N  c #109010",
+"B  c #1D951D",
+"V  c #1F951F",
+"C  c #1E961E",
+"Z  c #299A29",
+"A  c #2A9B2A",
+"S  c #2E9B2E",
+"D  c #2F9D2F",
+"F  c #37A037",
+"G  c #39A139",
+"H  c #3EA23E",
+"J  c #3FA33F",
+"K  c #43A143",
+"L  c #42A442",
+"P  c #46A646",
+"I  c #49A649",
+"U  c #4CA64C",
+"Y  c #4BA84B",
+"T  c #4EA84E",
+"R  c #5AAE5A",
+"E  c #63B163",
+"W  c #66B366",
+"Q  c #69B469",
+"!  c #6AB46A",
+"~  c #6FB46F",
+"^  c #70B770",
+"/  c #72B772",
+"(  c #77BA77",
+")  c #7FBD7F",
+"_  c #818181",
+"`  c gray51",
+"'  c #848484",
+"]  c #868686",
+"[  c gray53",
+"{  c #888888",
+"}  c #898989",
+"|  c gray54",
+" . c #8B8B8B",
+".. c gray55",
+"X. c gray56",
+"o. c #909090",
+"O. c gray57",
+"+. c #929292",
+"@. c gray58",
+"#. c #959595",
+"$. c gray59",
+"%. c #989898",
+"&. c gray60",
+"*. c #9B9B9B",
+"=. c #A0A0A0",
+"-. c #A2A2A2",
+";. c gray64",
+":. c #A4A4A4",
+">. c gray65",
+",. c gray66",
+"<. c #A9A9A9",
+"1. c gray67",
+"2. c #ACACAC",
+"3. c gray68",
+"4. c #AEAEAE",
+"5. c gray69",
+"6. c #B1B1B1",
+"7. c #B2B2B2",
+"8. c gray71",
+"9. c #B6B6B6",
+"0. c #B7B7B7",
+"q. c gray72",
+"w. c #B9B9B9",
+"e. c gray73",
+"r. c #BBBBBB",
+"t. c #BCBCBC",
+"y. c gray",
+"u. c gray75",
+"i. c #90C390",
+"p. c #91C291",
+"a. c #95C695",
+"s. c #97C697",
+"d. c #97C797",
+"f. c #9BC89B",
+"g. c #A0CAA0",
+"h. c #A4CBA4",
+"j. c #A5CCA5",
+"k. c #A6CDA6",
+"l. c #ADCFAD",
+"z. c #AFD0AF",
+"x. c #B2D2B2",
+"c. c #B7D3B7",
+"v. c #BAD4BA",
+"b. c #BDD5BD",
+"n. c #BDD6BD",
+"m. c #BFD7BF",
+"M. c #C3C3C3",
+"N. c gray77",
+"B. c #C5C5C5",
+"V. c #C6C6C6",
+"C. c gray78",
+"Z. c #C8C8C8",
+"A. c gray79",
+"S. c #CACACA",
+"D. c #CECECE",
+"F. c gray81",
+"G. c #C2D8C2",
+"H. c #C5D9C5",
+"J. c #C6D9C6",
+"K. c #C7D9C7",
+"L. c #CADBCA",
+"P. c #D0D0D0",
+"I. c gray82",
+"U. c #D2D2D2",
+"Y. c LightGray",
+"T. c gray83",
+"R. c #D4DFD4",
+"E. c gray85",
+"W. c #DADADA",
+"Q. c gray86",
+"!. c #DDDDDD",
+"~. c gray87",
+"^. c #DFDFDF",
+"/. c #D8E2D8",
+"(. c #DAE1DA",
+"). c #DBE2DB",
+"_. c #DCE2DC",
+"`. c #DEE3DE",
+"'. c gray88",
+"]. c #E1E1E1",
+"[. c #E2E2E2",
+"{. c gray89",
+"}. c #E0E4E0",
+"|. c #E1E4E1",
+" X c #E2E4E2",
+".X c #E2E5E2",
+"XX c #E3E5E3",
+"oX c #E4E4E4",
+"OX c #E4E5E4",
+"+X c gray90",
+"@X c #E5E6E5",
+"#X c #E6E6E6",
+"$X c #E7E6E7",
+"%X c #E7E7E7",
+"&X c #E8E7E8",
+"*X c #E9E7E9",
+"=X c gray91",
+"-X c #E9E9E9",
+";X c #EAE8EA",
+":X c #EBE8EB",
+">X c #EAEAEA",
+",X c gray92",
+"<X c #ECE9EC",
+"1X c #EDE9ED",
+"2X c #EEE9EE",
+"3X c #EFEAEF",
+"4X c #ECECEC",
+"5X c gray93",
+"6X c #EEEEEE",
+"7X c #EFEFEF",
+"8X c #F0EAF0",
+"9X c #F1EAF1",
+"0X c #F1EBF1",
+"qX c #F2EBF2",
+"wX c #F4EBF4",
+"eX c #F4ECF4",
+"rX c #F5ECF5",
+"tX c #F6ECF6",
+"yX c #F6EDF6",
+"uX c #F7EDF7",
+"iX c #F8EDF8",
+"pX c #F9EEF9",
+"aX c #FAEEFA",
+"sX c gray94",
+"dX c #F1F1F1",
+"fX c gray95",
+"gX c #F3F3F3",
+"hX c #F4F4F4",
+"jX c gray96",
+"kX c #F6F6F6",
+"lX c gray97",
+"zX c #FFF0FF",
+"xX c #FFF1FF",
+"cX c #F8F8F8",
+"vX c #F9F9F9",
+"bX c gray98",
+"nX c #FBFBFB",
+"mX c gray99",
+"MX c white",
+/* pixels */
+"#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X#X#X{.{.#X=X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X{.{.{.#X#X#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X#X4XnXnX=X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X=XhXmXhX=X#X#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X4Xq.e u U.=X#X#X#X#X#X#X#X#X#X#X#X#X#X=XQ._ 0 ] Q.=X#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X{.fX} & X q.fX{.#X#X#X#X#X#X#X#X#X#X#X#X4XV.4 q X < fX{.#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X{.nX9.X t.4X{.#X#X#X#X#X#X#X#X#X#X#X#X#X4XV.e # e fX{.#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X#X4X>.X t.fX#X#X#X#X#X#X#X#X#X#X#X#X#X{.fX4.< # +.fX#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X{.fX<.X t.fX{.#X#X#X#X#X#X#X#X#X#X#X#X=XU.^.mX> % =X#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X{.#X{.{.fX_ + X + @.4X{.{.#X{.{.#X#X{.#X#X#X{.hX+.# % o _ 4X{.#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#XfXfXfX4XhXT.q.M.q.Q.hXfXfXfXfXfXfXfXhX4X#X#X#X#X{.q.4.S.4X#X#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X=X4X^.6.6.6.6.6.q.t.t.t.9.6.6.6.6.6.6.6.6.4.S.=X#X#X#X#XfXfX=X#X#X#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#XQ.^.8 ] 6.<.<.<.<.<.>.>.<.<.<.<.<.<.<.<.4.=.d 4X#X#X#X#X#X#X#X#X#X&X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X4XD.a > U.nXfXfXhXfXfXhXfXhXfXhXfXhXhXfXhXhX4X} #X{.#X{.#X{.{.{.#X{.#X#XoX{.#XXX#X=X#X#X#X#X",
+"#X#XXXhXU.7 V.,X{.oXoX{.oXoXXXXX#X{.XX{.#X{.{.#X{.0 ] } } } [ } } [ } } [ } } [ } [ } a ^.%X#X#X",
+"#X#X#X4XM.6 Z.6X{.#X#X#X#X#X#X#X#X#X#X#X#X#X#X%X^.} 4X#X%X=X=X%X=X%X%X=X=X%X=X%X%X#XhX+.D.4X#X#X",
+"#X#X#X4XV.6 Z.6XoX#X#X#X#X#X#X&X1X&X#X#X#X#X#X=X{.} =X#X#X#X#X#X#X#X#X#X%X#X#X#X#X{.fX+.U.,X#X#X",
+"#X#XXX4XV.6 S.0XoX#X#X#X#X#X=X`.L.(.&X#X#X#X#X=X^.[ 4X#X#X#X#X#X#X#X#X%X#X#X#X#X#X{.fX+.F.=X#X#X",
+"#X#X{.4XV.6 Z.4XoX#X#X#X#X%XXXS h ^ rXXX#X#X#X=X`.} =X#X#X#X#X#XXXXXXXXX#X#X#X#X#X{.fX+.D.,XXX#X",
+"#X#X#X4XV.6 Z.4XoX#X#X#XXXrXE m z ! rXXX#X#X#X=X^.} ,X#X#X#X#X1XrXzXrX1XoX#X#X#X#X{.fXo.F.,X#X#X",
+"#X#X#X4XV.6 S.4XoX#X#XXXrXk.M a.z Q wXXX#X#X#X=X^.} ,X#X#X#X=Xc.E Y E c.1X#X#X#X#X{.fX+.F.4X#X#X",
+"#X#X#X4XV.6 S.4XoX#X#X&X(.B g.(.: ( xXXX#X#X#X%X^.} =X#X#X#XwXK M G z n b.1X#X#X#X{.fXo.F.4X#X#X",
+"#X#XXX4XZ.6 S.4XoX#XXXrXi.h R L x B f.1X#X#X#X=X^.} 4X#X#X#X#XG.XXaX( : i.wXXX#X#X{.fX+.D.4X#X#X",
+"#X#X#X0XV.6 S.4XoX#XXXqXk.Z Z B x v ) qXXX#X#X=X^.} =X#X#X#X&X=X&XqXI z G.qXoX#X#X{.fX+.U.=X#X#X",
+"#X#X#X4XV.6 S.4XoX#X#X#X#X#XrXb.: ^ pXXX#X#X#X=X^.} =X#X#X#X#X=X&XU z a.qXoX#X#X#X{.fX+.D.4X#X#X",
+"#X#XXX4XV.6 S.4XoX#X#X#X#X#X=X(.h.K.&X#X#X#X#X=X^.} 1X#X#X#X&X(.J n x.xX&X#X#X#X#X{.fX+.D.4X#X#X",
+"#X#X#X6XV.6 S.4XoX#X#X#X#X#X#X#XwX&X#X#X#X#X#X&X`.} =X#X#XXXqXU = B I A a.qXXX#X#X{.fXX.U.=X#X#X",
+"#X#X#X4XV.6 S.4X{.#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X^.} ,X#X#X#X1X^ J L G S a.qXXX#X#X{.fX+.D.4X#X#X",
+"#X#XXX4XV.6 S.4X{.#X#X#X#X#X#X#X#X#X#X#X#X#X#X&X^.} 1X#X#X#X#XqXwXwXrXpX1X#X#X#X#X{.fX+.D.4X#X#X",
+"#X#X#X4XV.6 Z.4X{.#XoX#XoX#X#XoX#XoX#X#X#X#X#X#X^.} =XoX#X#X#X#XXXXX#X{.#X#X#X#X#X{.fXX.U.=X{.#X",
+"#X#XXX4XM.8 V.4X#X=X=X=X=X=X=X=X=X=X&X=X=X=X=X=X{.X.=X#X#X#X#X#X#X#X#X#X#X#X#X#X#X{.hX+.D.4X#X#X",
+"#X#XoXfXU.3 } &.@.@.@.@.@.@.&.@.@.@.@.@.&.@.@.&._ e 4X{.{.#X{.#X{.{.{.#X#X{.{.{.{.{.4X+.U.=X#X#X",
+"#X#X=XU.e & @.X.+.+.+.X.X.+.+.X.o.o.X.+.+.X.X.@.e M.mXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXmX@.U.4X#X#X",
+"#X#X&X4X, } Q.V.S.S.S.S.S.S.S.S.S.S.S.S.S.S.S.U.e =.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.<.9.a U.=X#X#X",
+"#X#X=XU.3 4.nX=X4X4X4X1X4X4X4X4X4X4X4X4X4X4X=XnX] =.6.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.>.q #X#X#X#X",
+"#X{.fX4.} 4.fX{.#X#X#X#X#X#X#X#X#X#X#X#X#X#XoX=XX.#XfX4XfX4XfX4X4X4XfX4X4X4XfX4X=XnX6.6.fX#X#X#X",
+"#X#X#X#X9.>.hX{.#X#X#X#X#XoXXXXX#X#X#X#X#X#X{.fXu a } } ] } ] ] } } ] ] } } ] ] } ] 0 #X#X#X#X#X",
+"#X#X#XfX9.=.hX#X#X#X#X#X&XqXqXqX&X#X#X#X#X#X#X4X} {.4X=X=X=X=X,X=X=X=X4X=X=X=X4X=X=X} #X#X#X#X#X",
+"#X#X#XfX9.>.fX{.#X#X#X&XR.l.f.x.`.#X#X#X#X#X#X4X} Q.#X{.#X#X{.#X#X{.#X#X{.#X#X#X#X=X} #X#X#X#X#X",
+"#X#X#X#X{.^.=X#X#X#X#X#X`.H.b.H.XX&X#X#X#X#X#X#XQ.#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#XQ.#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X#X#X&X1XqX1X#X#X#X#X#X#X#X#X=X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X=X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X",
+"#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X#X"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/towers-web.png b/icons/towers-web.png
new file mode 100644 (file)
index 0000000..a513844
Binary files /dev/null and b/icons/towers-web.png differ
diff --git a/icons/towers.ico b/icons/towers.ico
new file mode 100644 (file)
index 0000000..49f40f4
Binary files /dev/null and b/icons/towers.ico differ
diff --git a/icons/towers.rc b/icons/towers.rc
new file mode 100644 (file)
index 0000000..53ee43d
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "towers.ico"
diff --git a/icons/tracks-16d24.png b/icons/tracks-16d24.png
new file mode 100644 (file)
index 0000000..53540b1
Binary files /dev/null and b/icons/tracks-16d24.png differ
diff --git a/icons/tracks-16d4.png b/icons/tracks-16d4.png
new file mode 100644 (file)
index 0000000..c083827
Binary files /dev/null and b/icons/tracks-16d4.png differ
diff --git a/icons/tracks-16d8.png b/icons/tracks-16d8.png
new file mode 100644 (file)
index 0000000..4db47f1
Binary files /dev/null and b/icons/tracks-16d8.png differ
diff --git a/icons/tracks-32d24.png b/icons/tracks-32d24.png
new file mode 100644 (file)
index 0000000..f70b752
Binary files /dev/null and b/icons/tracks-32d24.png differ
diff --git a/icons/tracks-32d4.png b/icons/tracks-32d4.png
new file mode 100644 (file)
index 0000000..2ec6b26
Binary files /dev/null and b/icons/tracks-32d4.png differ
diff --git a/icons/tracks-32d8.png b/icons/tracks-32d8.png
new file mode 100644 (file)
index 0000000..5ddcdc7
Binary files /dev/null and b/icons/tracks-32d8.png differ
diff --git a/icons/tracks-48d24.png b/icons/tracks-48d24.png
new file mode 100644 (file)
index 0000000..d8fab1f
Binary files /dev/null and b/icons/tracks-48d24.png differ
diff --git a/icons/tracks-48d4.png b/icons/tracks-48d4.png
new file mode 100644 (file)
index 0000000..a32d694
Binary files /dev/null and b/icons/tracks-48d4.png differ
diff --git a/icons/tracks-48d8.png b/icons/tracks-48d8.png
new file mode 100644 (file)
index 0000000..b9b07c4
Binary files /dev/null and b/icons/tracks-48d8.png differ
diff --git a/icons/tracks-base.png b/icons/tracks-base.png
new file mode 100644 (file)
index 0000000..7332528
Binary files /dev/null and b/icons/tracks-base.png differ
diff --git a/icons/tracks-ibase.png b/icons/tracks-ibase.png
new file mode 100644 (file)
index 0000000..b344a80
Binary files /dev/null and b/icons/tracks-ibase.png differ
diff --git a/icons/tracks-ibase4.png b/icons/tracks-ibase4.png
new file mode 100644 (file)
index 0000000..ab3d693
Binary files /dev/null and b/icons/tracks-ibase4.png differ
diff --git a/icons/tracks-icon.c b/icons/tracks-icon.c
new file mode 100644 (file)
index 0000000..3689243
--- /dev/null
@@ -0,0 +1,642 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 247 2 ",
+"   c #D5D5D5",
+".  c #D5D5D5",
+"X  c #D5D5D5",
+"o  c LightGray",
+"O  c #CBCBCB",
+"+  c #D5D5D5",
+"@  c gray84",
+"#  c gray81",
+"$  c gray80",
+"%  c gray84",
+"&  c gray84",
+"*  c gray80",
+"=  c #D2D2D2",
+"-  c gray84",
+";  c #D5D5D5",
+":  c #D5D5D5",
+">  c #D5D5D5",
+",  c #D5D5D5",
+"<  c LightGray",
+"1  c gray43",
+"2  c #C5C5C5",
+"3  c #DFDFDF",
+"4  c gray71",
+"5  c #7E7E7E",
+"6  c #DADADA",
+"7  c gray87",
+"8  c #979797",
+"9  c gray66",
+"0  c gray87",
+"q  c LightGray",
+"w  c #D5D5D5",
+"e  c #D5D5D5",
+"r  c #D7D7D7",
+"t  c LightGray",
+"y  c gray62",
+"u  c #D0D0D0",
+"i  c gray87",
+"p  c #BBBBBB",
+"a  c #A2A2A2",
+"s  c gainsboro",
+"d  c gray86",
+"f  c #AEAEAE",
+"g  c gray69",
+"h  c gainsboro",
+"j  c gray83",
+"k  c #D5D5D5",
+"l  c gray84",
+"z  c gray82",
+"x  c #CBCBCB",
+"c  c #D3D3D4",
+"v  c #CECECE",
+"b  c #CDCDCD",
+"n  c #D0D0CF",
+"m  c #D2D2D2",
+"M  c #CACACB",
+"N  c gray82",
+"B  c #D8D8D8",
+"V  c #D8D8D8",
+"C  c #D2D2D2",
+"Z  c gray83",
+"A  c #D8D8D8",
+"S  c #C6C6C6",
+"D  c #A5A5A3",
+"F  c #A8A7A6",
+"G  c #9A978E",
+"H  c #9B9993",
+"J  c #9E9C95",
+"K  c #A8A8A7",
+"L  c #A9A9A8",
+"P  c #CDCDCD",
+"I  c gray82",
+"U  c #D0D0D0",
+"Y  c gray82",
+"T  c gray83",
+"R  c gray83",
+"E  c #D8D8D7",
+"W  c #C7C7C8",
+"Q  c #A7A6A4",
+"!  c #918D82",
+"~  c #918D81",
+"^  c #938E7F",
+"/  c #8F8B80",
+"(  c #99958B",
+")  c #ADADAE",
+"_  c gray81",
+"`  c gray77",
+"'  c gray77",
+"]  c gray83",
+"[  c gray83",
+"{  c gray83",
+"}  c #D7D8D8",
+"|  c #C8C8C6",
+" . c #97948C",
+".. c #918D7F",
+"X. c #8D856D",
+"o. c #877D5F",
+"O. c #918A76",
+"+. c #8F8C82",
+"@. c #A6A49E",
+"#. c #D2D3D5",
+"$. c #D2D2D3",
+"%. c #D1D2D3",
+"&. c #D4D5D6",
+"*. c gray83",
+"=. c gray83",
+"-. c #D7D7D8",
+";. c #C9C8C7",
+":. c #969287",
+">. c #928C7B",
+",. c #938C77",
+"<. c #A7A18D",
+"1. c #8F8A79",
+"2. c #918B7A",
+"3. c #98917D",
+"4. c #BEBDB7",
+"5. c #C0BFBB",
+"6. c #BFBDB9",
+"7. c #C2C1BE",
+"8. c #D5D5D6",
+"9. c gray83",
+"0. c #D8D8D8",
+"q. c #C7C6C4",
+"w. c #928D7D",
+"e. c #908A79",
+"r. c #989488",
+"t. c #B0AFAD",
+"y. c #95928B",
+"u. c #918B7A",
+"i. c #8C846C",
+"p. c #908977",
+"a. c #908B7C",
+"s. c #8C8676",
+"d. c #9D998D",
+"f. c #D6D7D8",
+"g. c #D5D5D5",
+"h. c gray83",
+"j. c #D8D8D8",
+"k. c #C7C6C3",
+"l. c #928D7F",
+"z. c #908A79",
+"x. c #969182",
+"c. c gray69",
+"v. c #A4A29C",
+"b. c #908C82",
+"n. c #928D80",
+"m. c #928D7D",
+"M. c #918B7A",
+"N. c #8E8876",
+"B. c #9D998C",
+"V. c #D6D6D8",
+"C. c #D5D5D5",
+"Z. c gray83",
+"A. c #D7D7D7",
+"S. c #CACAC9",
+"D. c #969181",
+"F. c #908B7A",
+"G. c #999588",
+"H. c #ADADAB",
+"J. c #A9A9A8",
+"K. c #A7A6A4",
+"L. c #9C9991",
+"P. c #9C988E",
+"I. c #999588",
+"U. c #969285",
+"Y. c #A5A298",
+"T. c #D6D6D8",
+"R. c #D5D5D5",
+"E. c gray85",
+"W. c #DCDDE0",
+"Q. c #BAB5A8",
+"!. c #574F35",
+"~. c #6B6657",
+"^. c #777369",
+"/. c #C8C8C8",
+"(. c #CBCBCB",
+"). c gray80",
+"_. c gray80",
+"`. c #CBCBCB",
+"'. c #CECECE",
+"]. c #CDCDCD",
+"[. c #CDCDCD",
+"{. c #D5D5D5",
+"}. c gainsboro",
+"|. c #6C6C6C",
+" X c #BDBEC0",
+".X c #A6A299",
+"XX c #5A533E",
+"oX c #4B483C",
+"OX c #908E89",
+"+X c #CBCBCB",
+"@X c gray82",
+"#X c #C8C8C8",
+"$X c LightGray",
+"%X c #D5D5D5",
+"&X c #CBCACA",
+"*X c #CCCCCB",
+"=X c gray83",
+"-X c gray83",
+";X c gray82",
+":X c gray48",
+">X c #B6B7B8",
+",X c #ADACA7",
+"<X c #464237",
+"1X c #848179",
+"2X c #ADACAA",
+"3X c #C4C4C5",
+"4X c #CECECE",
+"5X c gray76",
+"6X c #D2D2D2",
+"7X c gray83",
+"8X c #C6C6C6",
+"9X c gray78",
+"0X c LightGray",
+"qX c gray83",
+"wX c #D5D5D5",
+"eX c #DFDFDF",
+"rX c #DDDDDD",
+"tX c #C0C0C0",
+"yX c #A8A59F",
+"uX c #B8B9BB",
+"iX c gray67",
+"pX c #C5C5C5",
+"aX c gray83",
+"sX c LightGray",
+"dX c gray82",
+"fX c gray82",
+"gX c LightGray",
+"hX c LightGray",
+"jX c gray82",
+"kX c gray83",
+"lX c #D5D5D5",
+"zX c LightGray",
+"xX c gray83",
+"cX c gray84",
+"vX c #D4D5D6",
+"bX c gray82",
+"nX c LightGray",
+"mX c LightGray",
+"MX c gray83",
+"NX c LightGray",
+"BX c gray83",
+"VX c gray83",
+"CX c gray83",
+"ZX c gray83",
+"AX c gray83",
+"SX c #D5D5D5",
+"DX c white",
+/* pixels */
+"    . X o O + @ # $ % & * = - ; ",
+"  : > , < 1 2 3 4 5 6 7 8 9 0 q ",
+"  w e r t y u i p a s d f g h j ",
+"  k l z x c v b n m M N B V C . ",
+"  Z A S D F G H J K L P I U Y T ",
+"  R E W Q ! ~ ^ / ( ) _ ` ' ] [ ",
+"  { } |  ...X.o.O.+.@.#.$.%.&.*.",
+"  =.-.;.:.>.,.<.1.2.3.4.5.6.7.8.",
+"  9.0.q.w.e.r.t.y.u.i.p.a.s.d.f.",
+"g.h.j.k.l.z.x.c.v.b.n.m.M.N.B.V.",
+"C.Z.A.S.D.F.G.H.J.K.L.P.I.U.Y.T.",
+"R.E.W.Q.!.~.^./.(.)._.`.'.].[.{.",
+"}.|. X.XXXoXOX+X@X#X$X%X&X*X=X-X",
+";X:X>X,X<X1X2X3X4X5X6X7X8X9X0XqX",
+"wXeXrXtXyXuXiXpXaXsXdXfXgXhXjXkX",
+"lXzXxXcXvXbXnXmXMXNXBXVXCXZXAXSX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 122 2 ",
+"   c #040506",
+".  c #1A1300",
+"X  c #121315",
+"o  c #15171C",
+"O  c gray11",
+"+  c #211C0E",
+"@  c #38321F",
+"#  c #161922",
+"$  c gray18",
+"%  c #3E3823",
+"&  c #33312C",
+"*  c #3A372F",
+"=  c #3A3A3A",
+"-  c #403C34",
+";  c #4F4116",
+":  c #4A422A",
+">  c #3E3F42",
+",  c #444444",
+"<  c #4B4B4C",
+"1  c #525252",
+"2  c #545559",
+"3  c #5C5C5C",
+"4  c #796C47",
+"5  c gray39",
+"6  c #6C6C6C",
+"7  c #7B7460",
+"8  c #74726C",
+"9  c #7D796D",
+"0  c #717171",
+"q  c #7E7C75",
+"w  c #7D7C79",
+"e  c #8B773C",
+"r  c #877748",
+"t  c #86784D",
+"y  c #827551",
+"u  c #8A7E5B",
+"i  c #887F65",
+"p  c #847E6E",
+"a  c #817E74",
+"s  c #8E825E",
+"d  c #958557",
+"f  c #95865B",
+"g  c #8E8260",
+"h  c #87816F",
+"j  c #8C846C",
+"k  c #928665",
+"l  c #968A64",
+"z  c #9B8D64",
+"x  c #90866B",
+"c  c #968B6C",
+"v  c #998E6C",
+"b  c #9E916C",
+"n  c #858175",
+"m  c #8B8574",
+"M  c #85827A",
+"N  c #89857B",
+"B  c #8C897E",
+"V  c #928A72",
+"C  c #938D7A",
+"Z  c #9D9273",
+"A  c #9E957C",
+"S  c #A0936A",
+"D  c #A89768",
+"F  c #A0977A",
+"G  c #A49A7E",
+"H  c #858481",
+"J  c #898782",
+"K  c #8A8984",
+"L  c #858689",
+"P  c #87888A",
+"I  c #8C8C8A",
+"U  c #949085",
+"Y  c #9A9484",
+"T  c #9F9885",
+"R  c #96938B",
+"E  c #98958D",
+"W  c #9E998C",
+"Q  c #8B8C90",
+"!  c #8A8D98",
+"~  c #8E9096",
+"^  c #8E9199",
+"/  c #939393",
+"(  c #999792",
+")  c #9D9A92",
+"_  c #95979E",
+"`  c #9C9C9B",
+"'  c #A29A84",
+"]  c #A29C8A",
+"[  c #A29E92",
+"{  c #A5A194",
+"}  c #AAA495",
+"|  c #A6A39A",
+" . c #A9A69C",
+".. c #9295A0",
+"X. c #9D9EA0",
+"o. c #A6A6A5",
+"O. c #A8A7A2",
+"+. c #ACAAA4",
+"@. c #A7A8AB",
+"#. c #ABABAB",
+"$. c #B9B6AF",
+"%. c #ADAEB1",
+"&. c #AFB0B3",
+"*. c #B4B4B4",
+"=. c #B8B7B5",
+"-. c #B8B8B7",
+";. c #B3B4B9",
+":. c #BBBBBB",
+">. c #BBBCC0",
+",. c #BFC0C3",
+"<. c #C2C3C3",
+"1. c #C3C5C8",
+"2. c #CDCDCD",
+"3. c #D5D5D5",
+"4. c #D8D7D7",
+"5. c #D8D8D7",
+"6. c #D7D7D8",
+"7. c #D7D8DB",
+"8. c #DADADA",
+"9. c #E0E0DF",
+"0. c #E3E3E3",
+"q. c gray91",
+/* pixels */
+"3.3.6.3.3.3.3.5.3.3.8.6.3.3.3.3.3.6.8.4.3.3.3.3.3.6.6.3.3.3.3.6.",
+"3.3.3.3.3.3.3.3.3.3.>.2.6.3.3.3.6.1.<.8.3.3.3.3.3.<.2.3.3.3.3.3.",
+"3.3.3.3.3.3.3.3.6.3.6 < 6.3.3.3.6.o., ( 0.3.3.3.3., / 0.3.3.3.3.",
+"3.3.3.3.6.3.3.3.3.9.[ = 3.3.3.3.3.6.5 #.8.3.3.3.q.M I q.3.3.3.3.",
+"3.3.3.3.3.3.3.3.5.2.6 1 2.3.3.3.0.0 $ :.6.3.3.3.5.< 3 8.3.3.3.3.",
+"3.5.3.3.3.3.3.3.4.3.:.3.4.3.3.3.3.2.<.2.3.3.3.3.3.1.1.3.3.3.3.3.",
+"3.3.3.3.3.3.3.6.5.5.8.5.3.6.5.5.3.6.8.8.5.5.3.3.3.8.6.6.3.6.3.3.",
+"3.3.3.3.3.3.3.2.<.<.<.<.1.1.<.1.1.<.<.<.<.<.2.3.3.2.2.2.3.2.3.3.",
+"3.3.3.3.3.3.6.-.o.o.o.#.[ ] ;. .T #.o.o.o.o.2.6.3.3.3.5.3.2.3.3.",
+"3.5.3.3.3.3.6.:.o.#.#.%.Y h _ B m *.#.#.#.#.2.3.<.5.3.<.3.3.3.3.",
+"3.3.3.3.3.3.3.-.#. .l / L h ` m M ^ c ' %.o.2.3.1.<.:.2.3.2.3.3.",
+"3.3.6.3.3.3.6.-.@.#.J 7 O.f { f  .n 9 o.%.#.2.3.8.$.:.5.3.3.3.3.",
+"3.3.3.3.3.3.3.:.| ` ! ' f L a H m b ../  .#.2.3.:.2.2.:.3.2.3.3.",
+"5.3.3.6.5.3.3.:.v p j A H y e r a Y k a v O.2.3.3.6.3.3.3.3.3.3.",
+"3.3.3.3.3.3.6.:.;.I ) C n d +.z i m { K | #.2.3.3.3.3.3.3.2.3.3.",
+"3.3.3.3.3.3.5.:.v M V C n A ;.*.( I b a t z #.O.+.O. .#.} :.3.3.",
+"3.3.3.3.3.3.6.-.[ J W R K { *.{ g a ] U 9 u c Y V Y k ) u #.6.4.",
+"3.3.3.3.3.3.6.-.c M l j n Z &.#.#.^ / d R a H M M J M K a ` 4.3.",
+"3.6.3.3.3.3.6.-.[ J ) E K | #.#.#.W 7 / A F ' A Z ] z } f -.6.3.",
+"3.3.3.3.3.3.6.-.l n f j n Z *.#.%.A ] ! a K B J N K n I a [ 4.3.",
+"3.3.3.5.3.3.5.-.| J ) ( K  .&.#.#.%.%.#.f X.C C V U j E i +.6.3.",
+"3.3.3.3.3.3.5.-.l J k j n v *.o.o.o.o.o.[ %.} [ ] | ] O.Y =.5.3.",
+"3.3.3.3.3.3.6.=.z * Y w 2 :.*.1.<.<.<.<.1.<.<.1.1.1.<.<.1.<.4.3.",
+"3.3.3.0.3.3.7.D ; X S % @ { -.6.6.6.3.8.4.3.3.3.4.4.5.5.3.3.3.3.",
+"3.6.:.1 2.3.8.-   4 O.o 9 } -.3.2.2.8.1.1.3.2.3.<.3.3.<.3.3.3.3.",
+"3.0.P O o.9.7.j Z } . , ;.@.*.6.3.<.:.<.3.3.3.3.2.:.,.2.3.2.3.3.",
+"3.6.< = 3 9.7.U : # & l #.o.-.3.3.2.#.2.5.3.3.3.3.-.-.6.3.2.3.3.",
+"3.2.#.3.#.3.8.< + 8 -. .#.@.-.3.2.:.8.:.2.3.2.3.:.3.2.:.5.2.3.3.",
+"3.3.8.6.8.3.6.,.G +.#.+.#.o.$.8.3.3.3.3.3.3.2.3.3.3.3.2.4.2.3.3.",
+"3.5.3.3.3.3.6.:.#.%.&.&.&.#.-.2.2.3.2.3.3.2.2.3.2.3.3.3.3.2.3.3.",
+"3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.",
+"3.5.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 150 2 ",
+"   c #020201",
+".  c #0C0A05",
+"X  c #0A0A0C",
+"o  c #110B00",
+"O  c #1D1C17",
+"+  c #1D1C1B",
+"@  c #221E14",
+"#  c #26231C",
+"$  c #373019",
+"%  c #252525",
+"&  c #2B2B2C",
+"*  c #2D2E32",
+"=  c #343434",
+"-  c #3A3A3A",
+";  c #4F4423",
+":  c #5F532F",
+">  c #454135",
+",  c #715E26",
+"<  c #695B33",
+"1  c #796938",
+"2  c #414141",
+"3  c gray29",
+"4  c #545453",
+"5  c #5B5B5B",
+"6  c #636364",
+"7  c #6D6D6D",
+"8  c #7D7766",
+"9  c #78746A",
+"0  c #7E796B",
+"q  c #6F7177",
+"w  c #757575",
+"e  c #7D7C77",
+"r  c #7E7E7D",
+"t  c #866D24",
+"y  c #866F29",
+"u  c #87702C",
+"i  c #89722D",
+"p  c #91782F",
+"a  c #8A7535",
+"s  c #86733D",
+"d  c #8B7639",
+"f  c #8E793C",
+"g  c #867645",
+"h  c #887745",
+"j  c #8D7A44",
+"k  c #83764F",
+"l  c #87784E",
+"z  c #8A7A4C",
+"x  c #947F42",
+"c  c #917F49",
+"v  c #857956",
+"b  c #837A5F",
+"n  c #8A7E59",
+"m  c #8A7C53",
+"M  c #837C66",
+"N  c #847E6B",
+"B  c #827E73",
+"V  c #807F7C",
+"C  c #99823D",
+"Z  c #94814B",
+"A  c #8F8051",
+"S  c #8D815B",
+"D  c #928253",
+"F  c #9B8954",
+"G  c #94865B",
+"H  c #8D8363",
+"J  c #8B836C",
+"K  c #928660",
+"L  c #978963",
+"P  c #9A8C65",
+"I  c #93896B",
+"U  c #998E6D",
+"Y  c #9C916E",
+"T  c #858174",
+"R  c #8D8774",
+"E  c #84827C",
+"W  c #888479",
+"Q  c #918A75",
+"!  c #948E79",
+"~  c #9D9377",
+"^  c #9C947B",
+"/  c #A39569",
+"(  c #A0967A",
+")  c #7E7F81",
+"_  c #7F8082",
+"`  c #828282",
+"'  c #888783",
+"]  c #8A8885",
+"[  c #84858A",
+"{  c #86888D",
+"}  c #8C8C8C",
+"|  c #908D85",
+" . c #9C9683",
+".. c #9E9885",
+"X. c #9A968B",
+"o. c #9E998A",
+"O. c #868991",
+"+. c #8C8D91",
+"@. c #8F9093",
+"#. c #939494",
+"$. c #989796",
+"%. c #9E9B94",
+"&. c #9C9B9A",
+"*. c #A09984",
+"=. c #A49E8C",
+"-. c #A29E93",
+";. c #A09E99",
+":. c #AFA587",
+">. c #A8A28F",
+",. c #A6A194",
+"<. c #A9A390",
+"1. c #A5A39C",
+"2. c #A9A69C",
+"3. c #ACA89A",
+"4. c #9C9EA3",
+"5. c #A5A5A4",
+"6. c #A9A7A5",
+"7. c #AAA8A4",
+"8. c #A5A6AA",
+"9. c #A6A8AC",
+"0. c #AAAAAA",
+"q. c #B0AFAE",
+"w. c #B0B0AF",
+"e. c #A7AAB3",
+"r. c #ACAEB2",
+"t. c #AFB1B4",
+"y. c #B2B2B2",
+"u. c #B8B7B3",
+"i. c #B3B5BC",
+"p. c #B7B8BB",
+"a. c #BBBBBB",
+"s. c #C0BEB7",
+"d. c #B2B5C0",
+"f. c #B5B9C5",
+"g. c #B9BBC1",
+"h. c #B6BBC8",
+"j. c #BEC2CC",
+"k. c #C3C3C4",
+"l. c #C8C8C7",
+"z. c #C3C5C9",
+"x. c #C6C8CF",
+"c. c #CDCDCD",
+"v. c #D5D5D5",
+"b. c #D8D7D7",
+"n. c #D8D8D7",
+"m. c #D5D7DC",
+"M. c #DADADA",
+"N. c #DCDEE3",
+"B. c #E2E2E2",
+"V. c #EAEAEA",
+/* pixels */
+"v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.",
+"v.v.v.v.v.v.b.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.v.n.v.v.v.M.N.v.v.v.v.v.v.v.v.v.M.M.v.v.v.v.v.v.v.v.v.M.M.v.v.v.v.v.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.v.v.v.v.n.l.0.c.n.v.v.v.v.v.v.v.k.y.M.M.v.v.v.v.v.v.v.a.k.v.v.n.v.v.v.v.v.v.",
+"v.v.v.b.v.v.v.v.v.v.v.v.v.v.M.} 3 & k.M.v.v.v.v.v.c.4 * 5 M.n.v.v.v.v.v.k.& - B.v.v.v.v.v.v.v.v.",
+"v.v.v.v.b.v.v.v.v.v.v.v.v.n.n.c.r % l.M.v.v.v.v.v.c.V.} & N.v.v.v.v.v.v.B.#.= B.v.v.v.v.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.v.v.v.v.n.v.V + u.M.v.v.v.v.v.M.0.- a.M.v.v.v.v.v.v.V.1.- V.v.v.v.v.v.v.v.v.",
+"v.v.v.v.v.v.b.v.v.v.v.v.v.v.N.w 5 % p.M.v.v.v.v.v.v.+ # w v.v.v.v.v.v.v.x.2 X } M.v.v.v.v.v.v.v.",
+"b.v.v.v.v.v.v.v.v.v.v.v.v.v.M.a.$.z.M.v.v.v.v.v.v.v.w.5.6.n.v.v.v.v.v.v.c.5.5.y.M.v.v.v.v.v.v.b.",
+"v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.M.B.n.v.v.v.v.v.v.v.v.M.N.N.v.v.v.v.v.v.v.v.B.B.M.v.v.v.v.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.v.n.v.v.v.v.v.v.v.n.n.v.n.n.v.v.v.v.n.n.n.v.v.v.v.v.v.v.v.v.v.v.b.v.v.v.v.v.",
+"v.v.v.b.v.v.v.m.v.v.v.v.c.c.v.c.c.c.v.c.c.c.c.c.c.c.v.c.c.c.c.c.v.c.c.c.c.v.c.c.v.c.c.v.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.n.k.7.0.0.0.0.0.0.t.0.0.y.0.t.0.0.0.0.0.0.0.y.v.v.v.v.c.v.c.c.v.c.c.v.n.v.v.",
+"v.v.v.v.b.v.v.v.v.v.n.j.6.0.0.6.0.0.0.P ,.y.u.1.L 0.0.0.0.0.0.0.0.v.v.v.n.v.b.v.M.b.v.c.v.v.v.v.",
+"b.v.v.v.v.v.v.v.v.v.v.k.6.0.0.t.0.0.t.S J 4.4.Q z t.0.0.t.0.0.7.t.v.n.l.c.n.v.b.k.v.b.c.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.n.k.8.0.0...1.0.#.` _ E ` _ ` } 6.7.^ 0.0.0.t.v.n.c.y.c.M.a.a.n.v.c.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.v.k.7.0.r.G z O._ | z 6.0.z | ` O.v D r.0.6.y.v.v.v.c.u.u.g.M.v.v.c.v.v.b.v.",
+"v.b.v.v.v.b.v.v.v.v.n.k.6.0.0.5.r 8 1.i.d *.3.a t.5.0 e 5.0.6.0.w.v.v.v.M.a.5.v.b.v.v.c.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.n.k.0.r.r.} { K d 5.T E E J 5.f D { ] 0.t.8.w.v.v.v.a.k.v.y.c.b.v.c.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.b.k.5.~ X.) 4.d.S 8 _ T T _ 0 S i.8._ X.~ 5.r.v.M.k.a.M.v.c.u.v.v.c.v.v.v.v.",
+"v.v.v.v.v.b.v.v.v.v.v.k.5.D b V D ~ } _ z i u j E { ^ A V M A 1.y.v.v.v.v.v.v.v.v.v.v.c.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.v.j.5.t.} ' U j r v t ..,.y v _ h P ' ] d.0.q.v.v.M.n.n.M.v.b.b.v.v.v.v.v.v.",
+"v.v.v.n.v.v.v.v.v.v.v.k.w.p.{ #.j.r._ =.<.i.p.>.*._ e.j.#.E L =.g.k.z.k.k.k.k.z.k.k.k.l.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.n.k.*.f T N d z _ z P t.w.t.0._ R j g _ g i ,.1.=.0.o.5.5...9.;.o.g.n.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.v.k.1.=.' ] =.X.)  .,.r.y...a B T ~ ;.{ E s P Y D f.d =.2.i i.L D x.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.M.k.5.6.{ } 7.&.) ;.7.0.y.1.,.#._ e.,.s _ _ ' E T } T ' ] B } W e 4.M.v.v.v.",
+"v.v.v.v.v.v.v.n.v.v.v.z. .i B M i h ` s D r.0.0.t.6.[ ] d ~ 8.k @.R T @.M ' ] N @.W B 5.n.v.v.v.",
+"v.v.n.v.v.v.v.v.v.v.M.k.7.t.] +.i.5.) 8.y.0.y.0.6.t.X.9 E e.=.a g.P D f.d >.3.i i.P Z x.b.v.v.v.",
+"v.v.b.v.v.v.v.v.v.v.v.k.-.U E W P I _ I ^ r.w.7.0.5.d ! ] _ T J r.I H e.z o.%.h 9.I S g.n.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.v.k.o.Z E T D G ) S U t.y.0.0.0.,.0.8.#.E _ r _ _ _ _ _ _ _ _ ` r #.M.v.v.v.",
+"v.v.v.v.v.v.v.n.v.v.v.k.0.f.{ #.h.e.r e.t.0.t.7.0.0.r.0.0.7.a %.r.I S e.g X.%.s 9.I n g.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.b.z.o.d T N d l ` h G r.w.0.0.0.0.0.0.1.~ 0.p.( I i.G ,.7.D t.~ I j.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.n.k.1.*.E ' >. .e | >.0.w.7.0.0.0.0.0.0.r.0.0.r.0.0.0.0.0.0.0.0.0.a.M.v.v.v.",
+"n.v.v.v.v.v.v.v.v.v.v.x.~ c O > s.}   4.g.y.k.c.l.l.x.l.l.x.l.l.l.l.l.l.l.l.l.x.x.l.l.l.v.v.v.v.",
+"v.v.v.v.v.M.M.v.v.v.M.:.p <   : C ;   J 7.7.x.M.n.M.n.n.b.n.n.n.c.v.M.M.v.n.n.v.M.n.n.c.v.v.v.v.",
+"v.v.v.v.n.k.l.n.v.v.N.Y ;   O 5.y.# + j ^ r.l.n.v.c.b.v.b.v.c.b.c.v.v.c.v.v.v.b.c.v.b.c.v.v.v.v.",
+"b.v.v.v.M.% * M.v.v.B.4   * s / `   6 a.6.0.l.M.c.y.c.M.v.u.c.m.v.c.n.x.u.v.n.l.p.v.v.c.v.v.v.v.",
+"v.v.v.B.5.= = 0.M.v.M.$., 2.u.1   & 0.0.0.0.c.v.n.c.y.c.u.x.b.v.c.v.v.n.k.a.c.y.v.b.v.c.v.v.b.v.",
+"v.v.v.B.6 = * 7 B.v.b.m.F Q w X . v t.0.0.8.c.v.v.M.c.&.k.M.v.b.c.v.v.v.M.p.&.b.b.v.v.c.v.v.v.v.",
+"v.v.v.v.& 5 4 = v.v.M.` # .   = X.Z ,.0.7.0.x.n.v.v.u.k.u.c.b.b.c.v.v.n.l.a.k.p.v.v.v.c.v.v.v.v.",
+"v.v.v.v.0.B.B.y.v.v.B.5 . $ V w.t.0.0.0.0.8.l.n.v.y.x.M.c.y.c.b.c.c.M.l.y.v.M.k.p.b.v.c.b.v.v.v.",
+"v.v.v.v.M.v.v.M.v.v.v.k.0.Z 3.0.6.0.0.0.0.0.c.n.c.c.M.v.M.c.c.b.v.v.M.x.v.v.v.n.l.v.v.c.v.v.v.v.",
+"v.v.v.b.v.v.v.v.v.v.v.k.5.1.5.0.7.0.0.8.7.6.c.M.n.n.b.v.n.n.n.b.c.v.n.n.b.v.v.n.n.n.n.c.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.v.k.0.y.y.y.t.w.w.t.t.w.l.c.c.c.c.c.v.c.c.v.c.l.c.v.c.c.c.c.c.c.c.c.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.c.v.v.v.v.v.c.v.v.c.v.v.c.v.c.v.v.c.v.v.c.v.v.c.v.v.v.v.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.b.b.n.v.v.v.v.b.v.v.v.v.v.v.v.b.v.v.v.v.v.b.n.v.v.v.",
+"v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.b.v.v.v.v.v.b.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.",
+"v.b.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.v.n.v.v.v.v.v."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/tracks-web.png b/icons/tracks-web.png
new file mode 100644 (file)
index 0000000..6227527
Binary files /dev/null and b/icons/tracks-web.png differ
diff --git a/icons/tracks.ico b/icons/tracks.ico
new file mode 100644 (file)
index 0000000..549e2b6
Binary files /dev/null and b/icons/tracks.ico differ
diff --git a/icons/tracks.rc b/icons/tracks.rc
new file mode 100644 (file)
index 0000000..89943e1
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "tracks.ico"
diff --git a/icons/twiddle-16d24.png b/icons/twiddle-16d24.png
new file mode 100644 (file)
index 0000000..32ecce5
Binary files /dev/null and b/icons/twiddle-16d24.png differ
diff --git a/icons/twiddle-16d4.png b/icons/twiddle-16d4.png
new file mode 100644 (file)
index 0000000..8587ce6
Binary files /dev/null and b/icons/twiddle-16d4.png differ
diff --git a/icons/twiddle-16d8.png b/icons/twiddle-16d8.png
new file mode 100644 (file)
index 0000000..32ecce5
Binary files /dev/null and b/icons/twiddle-16d8.png differ
diff --git a/icons/twiddle-32d24.png b/icons/twiddle-32d24.png
new file mode 100644 (file)
index 0000000..1a47225
Binary files /dev/null and b/icons/twiddle-32d24.png differ
diff --git a/icons/twiddle-32d4.png b/icons/twiddle-32d4.png
new file mode 100644 (file)
index 0000000..7b70389
Binary files /dev/null and b/icons/twiddle-32d4.png differ
diff --git a/icons/twiddle-32d8.png b/icons/twiddle-32d8.png
new file mode 100644 (file)
index 0000000..1a47225
Binary files /dev/null and b/icons/twiddle-32d8.png differ
diff --git a/icons/twiddle-48d24.png b/icons/twiddle-48d24.png
new file mode 100644 (file)
index 0000000..38146fa
Binary files /dev/null and b/icons/twiddle-48d24.png differ
diff --git a/icons/twiddle-48d4.png b/icons/twiddle-48d4.png
new file mode 100644 (file)
index 0000000..0e32a37
Binary files /dev/null and b/icons/twiddle-48d4.png differ
diff --git a/icons/twiddle-48d8.png b/icons/twiddle-48d8.png
new file mode 100644 (file)
index 0000000..38146fa
Binary files /dev/null and b/icons/twiddle-48d8.png differ
diff --git a/icons/twiddle-base.png b/icons/twiddle-base.png
new file mode 100644 (file)
index 0000000..7eed9af
Binary files /dev/null and b/icons/twiddle-base.png differ
diff --git a/icons/twiddle-ibase.png b/icons/twiddle-ibase.png
new file mode 100644 (file)
index 0000000..3018643
Binary files /dev/null and b/icons/twiddle-ibase.png differ
diff --git a/icons/twiddle-ibase4.png b/icons/twiddle-ibase4.png
new file mode 100644 (file)
index 0000000..61eda42
Binary files /dev/null and b/icons/twiddle-ibase4.png differ
diff --git a/icons/twiddle-icon.c b/icons/twiddle-icon.c
new file mode 100644 (file)
index 0000000..3814b7d
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qX7X5X5X5X5X3X4X6X5X5X5X5X5X5XqX",
+"0X1X1X8X7X1X9X6X2X8X5X2X2X1X0XtX",
+"7X1XrXhXeXrX).*XuXqXyXfXuXwXaXuX",
+"8X,XsXiX7XpX1.J.dX6XuXwXeXtXfXyX",
+"7X1XgX0XwXwXP.-XeX0XiX0XpXqXsXuX",
+"6X0XdX6X8X0XdXtX6XuXeX9X(.1XsXyX",
+"7X0XrX0X0X8X6X9X9XiX9XyXX.W.zXtX",
+"8X2XeXsXyXwXqX3XrXwXwX8XU.>XdXyX",
+"9X5X9Xv.@XtXqX5XiX8X8XqXsXwXaXuX",
+"7X1XwXW A.gX3X0XeXwXeX0X7X9XwXyX",
+"8X1XrX&X8XqX5XyXqXaXwXrXrX4XqXiX",
+"8X,XwXyXeX5XeXrX5XH.4XwXwX1XpXuX",
+"8X>X7X8X9X9XyXyX+XA .XpX5X2XsXyX",
+"7X,XqX6X3XrX0X0X9X}.3XqX>X7XpXuX",
+"8XwXfXsXdXiXuXsXsXlXgXiXtXdXgXyX",
+"qXtXrXrXrXtXtXrXrXeXrXtXtXrXeXqX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXqXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXeXqXqX",
+"qX0X3X4X4X4X4X3X2X4X4X4X4X4X4X4X4X4X3X3X4X4X4X4X4X4X4X4X4X3X0XqX",
+"qXwX2X#X%X%X$X-X,X#X%X%X%X%X%X%X$X&X,X;X#X$X%X%X%X%X%X%X@X4XtX0X",
+"qXwX>XeXrXrXqXbXfXwXrXrXeXwXwXrXrXrXuXgXhXyXwXeXrXrXrXrXqXvXiX9X",
+"qX0XOX0XqX9XuXcX8XqX0X0XyXpXpX9XqX0X0X9XeX9XzXtX0X9XqXqX8XxXiX9X",
+"qXqX@X0XwX9XvXiX9XqX0XuXk.~ S.pX9XqXqXeX2XdXhXaXgXyX0X0X8XcXiX9X",
+"qXqX@XqX9XpXbX9XwXqXqX8XrX9.( kX8XqXqX0X5XvX8X0XrXdXfXuX7XxXiX9X",
+"qXqX@XqX9XnXiX9XqXqX9XpXH.v [.yX0XqXeX1XdXsX9XwX0X0XrXdXaXnXiX9X",
+"qXqX@X8XdXmX8XqXqXqX9XaX6.Q v.yX0XqX0X3XvX9XqXqXqXqX0X0XqXmXiX9X",
+"qXqX@X9XxXeXqXwXqXqXqX0XdXgXyXqXqXrX,XsXdX9XqXqX9X8X0XwX8XxXiX9X",
+"qXqXOXuXnX4X<X7XeXwXqXqX9X8X0XqXqX9X<XvX9XqXqXwXaXhXtXqX9XcXiX9X",
+"qXqXoXbXhXuXuX4X<X7XeXwXqXqXqXqXrX:XaXdX9XqXwX8Xp.-.#XyX7XcXiX9X",
+"qX9X;XMX9X0XeXpXtX3X1X8XeXqXqXqX9X>XvX9XqXqX0XeXU.a L.fX6XcXiX9X",
+"qX9X:XiX9XwXqX9XeXiXrX2X1X9XwXtX-XaXdX9XqXqX0XwX(.k b.hX6XcXiX9X",
+"qX0XoX0XqXqXqX0X0X0XeXiXwX2X3X7X:XnX8XqXqX0XrX>X<.} '.iX7XcXiX9X",
+"qX9X=XqXqX0XwXuX0XqX0X0XrXyXwX&XiXiX0XwXqXqXqXeXwXiXiX0X8XcXiX9X",
+"0XrX8X9XqXrX9XOXuX0XqXqX0XqXqX=XcX3X1X8XeXqXqXqXqX9X0XwX8XcXiX9X",
+"qX0XoX0XqXqX| Y c.dX9XqX0XtX*X9XgXdXuX4X2X9XeXqXqXqXqXwX8XvXiX9X",
+"qXqX@X0XwX6X~ ) R jX8XqXwX8X&XjX8X0XyXdXuX5X3X9XwXqXqXwX7XsXpX9X",
+"qXqX@X0X0XuXA.h 0.gX8X0XtX*XrXpX9XqX0X0XtXsXyX5X4X0XwXrX-XyXsX9X",
+"qXqX@X0XqXrXE.F.wXwXqXwX7X=XlX9XqXqXqXqX0X0XtXsXyX6X5X0XOXxXpX9X",
+"qXqX@X0XqX0XaXfXqXqX0XrX&XuXiX9XqX0X0XrXqXqX0X0XtXaXuX>X;XbXiX9X",
+"qX0X@XqXqXqX9X8XqXqXwX6X:XzX8XwX0XeXyX;X9XwXqXqX0X0XwX;X9XcXiX9X",
+"qXqXOX8XeXqXqXqXqX0XrX&XsXiX9XqXwX0X#.+.-XtX0XqXqXrX:X1X0XxXiX9X",
+"qXqXOX,X2X9XwXqXqXwX5X,XcX8XwX9XsXE.y @._.iX0XqXwX9X&XwX8XcXiX9X",
+"qX0X@XqX6X<X3X0XwXtX&XgXiX0XqX0XpX_.F L p.jX8X0XrX;X1XrX8XcXiX9X",
+"qXqX@X0XwXwX6X1X6X2X3XvX7XwXqXqX0XuXH.f.8XwXqXwX8X$XwXqX8XcXiX9X",
+"qXqX@X0XqXqXwXqX7X:XjXrXqXqXqXqXqX0XsXhXwXqX0XrX*X<XeXqX8XcXiX9X",
+"wX8XoXqXwXwXqXwXwXrX0X:X3X0XwXwXqXwX9X9XqXqXeX7X#XeXqXwX9XvXiX9X",
+"qXqXpXNXbXnXnXnXnXbXnXbXlXcXmXlXbXmXnXnXnXnXnXxXxXmXbXnXcXbXuX9X",
+"qXqXwXeXqXwXqXqXqXqXqXwXeXwXwX0XeXwXqXqXqXqXqXwXwXqXqXwXqXqXwXqX",
+"qXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXeXwXwXwXwXwXwXwXeXeXwXwXwXwXwXwXwXwXwXwXwXwXeXeXeXwXwXwXwXwXwXwXwXwXwXwXwXwXwXeXqXqXqXqX",
+"qXqXqX0X3X5X5X5X5X5X5X6X4X4X5X5X5X5X5X5X5X5X5X5X5X5X5X4X5X6X5X5X5X5X5X5X5X5X5X5X5X5X5X4X0XqXqXqX",
+"qXqXqX0X-X X}.}.}.}.}.{.oXXX{.}.}.}.}.}.}.}.}.}.}.}. X+X X[.}.}.}.}.}.}.}.}.}.}.}.|.[.;XrX0XqXqX",
+"qXqX0XyXsX7XrXwXeXeXeXwXZXaXqXeXeXeXeXeXeXeXeXeXeXwXrXfXzXfXeXqXeXeXeXeXeXeXeXeXeXeXqXZXuX0XqXqX",
+"qXqX0XrX[.,XeX0XqXqX8XjXbX7XqXqXqXqX0X9X8X0XqXqXqXqX0X9XwXdXjXaX9X9X0XqXqXqXqXqXqXqX9XZXyX0XqXqX",
+"qXqX0XrX.X1XeXqXqXqXqXCXyX0XqXqXqXqXwXfXjXrX0XqXqXqXqXqXqX9XyX3XaXxXwX9X0XqXqXqXqXqX9XZXuX0XqXqX",
+"qXqX0XrX.X1XeXqXwX8XlXnX8XwXqXqXqXwX5XG.m.,XyX0XqXqXqXqXqXqX0X;XAXjXlXfXeX9X0XqXqXqX9XZXuX0XqXqX",
+"qXqX0XrX.X1XeXqXqXwXAXyX0XqXqXqX9XaXT.L m s 1XrX0XqXqXqXqXrX:XaXbX6XrXdXlXfXeX9X0XwX0XZXuX0XqXqX",
+"qXqX0XrX.X1XeXqX8XxXnX8XwXqXqXqXqXwX3XNXW.* *XyX0XqXqXqXqX0X;XZXrXqXqX9XwXsXlXfXeX0X9XZXuX0XqXqX",
+"qXqX0XrX.X1XrX0XeXDXyX0XqXqXqXqXqX9XdX Xg F.gX8XqXqXqX0XrX-XsXmX7XwXqXqXqX9XwXsXkXfXwXZXuX0XqXqX",
+"qXqX0XrX.X1XrX7XvXnX8XwXqXqXqXqX9XiX[.# n p.*XtX0XqXqXqX9X*XZXrX0XqXqXqXqXqXqX9XwXsXjXFXyX0XqXqX",
+"qXqX0XrX.X1XeXrXDXtX0XqXqXqXqXqX0XuX{.*.:.o.*XtX0XqX0XrX*XiXbX7XwXqXqXqXqXqXqXqXqX0XqXAXyX0XqXqX",
+"qXqX0XrX.X1X0XbXmX0XwXqXqXqXqXqXqX0XyXzXlXxXrX0XqXqXwX9X&XAXrX0XqXqXqXqXqXqXqXqXqXwX9XZXuX0XqXqX",
+"qXqX0XrX.X<XtXnX,X>XqXeXqXqXqXqXqXqX0X7X7X7X0XqXqX0XtX%XpXmX7XwXqXqXqX0X7X7X0XqXqXqX0XZXuX0XqXqX",
+"qXqX0XrX.X>XzXDXaX5X*X<XqXeXqXqXqXqXqXqXqXqXqXqXqXwX8X#XAXrX0XqXqXqX0XpXxXlXyX0XqXqX9XZXuX0XqXqX",
+"qXqX0XrX X1XHXsXeXhXdX3X*X2XwXeXqXqXqXqXqXqXqXqX0XtX#XiXnX7XwXqXqX0XuXW.( #.XXtX0XqX9XZXuX0XqXqX",
+"qXqX0XtX}.pXAX8XqX9XtXgXaX2X=X3XwXwXqXqXqXqXqXqXwX7X@XSXrX0XqXqXqX0XuXP.V.l K fX9XqX9XZXuX0XqXqX",
+"qXqX0XrX XbXdX9XwXqX0X9XtXgXiX<X=X4XeXwXqXqXqX0XtX+XiXmX7XwXqXqXqXqX0XpXe.6 p.fX9XqX9XZXuX0XqXqX",
+"qXqX0XrXXXiXeXqXqXqXqXqX0X9XtXfXyX,X-X5XeXwX0XwX6XOXAXrX0XqXqXqXqXqXqX8X[.J m aX0XqX9XZXuX0XqXqX",
+"qXqX0XrXXX2XeXqXqXqXqXqXqXqX0X9XyXdXrX>X;X6XwXyXoXuXnX7XwXqXqXqXqX9XaX,./ s ] aX9XqX9XZXuX0XqXqX",
+"qXqXqXrX].<XrXqXqXqXqXqXqXqXqXqX0X0XyXdXwX:X>X1X+XFXeX0XqXqXqXqXqX0XrX+XB.W.tXwXqXqX9XZXuX0XqXqX",
+"qXqXqX0X$X7XwXqXqXqX9X7X8XqXqXqXqXqX0X0XyXaXwXoXpXzX8XeXqXqXqXqXqXqX0XuXhXsX0XqXqXqX9XZXuX0XqXqX",
+"qXqX0XyXfX6XwXqXqX0XaXzXfXqXqXqXqXqXqXqX0XwX9X.XmX3X*X5XwXwXqXqXqXqXqX0X9X9XqXqXqXqX9XZXuX0XqXqX",
+"qXqX0XrX{.<XrXqX0XiXG.P p.tX0XqXqXqXqXqX0XtX X6XVXlXpX,X-X6XeXwXqXqXqXqXqXqXqXqXqXqX9XZXuX0XqXqX",
+"qXqX0XrX.X1XeX9XuX+X: m.t z.gX8XqXqXqXqXeX4X}.nX0XqXdXzXpX<X;X6XeXwXqXqXqXqXqXqXqXqX0XZXuX0XqXqX",
+"qXqX0XrX.X1XeX9XuXOX& a.7 +.lX7XqXqXqX0XtX XwXkX8XqX9XqXsXzXiX<X:X7XeXwXqXqXqXqXqXeX3XbXiX9XqXqX",
+"qXqX0XrX.X1XeXqX0XyXJ.=.: 8.kX8XqXqXqXeX3X XMXqXqXqXqXqX9XqXsXlXiX1X>X8XeXwXqXqX0XrXoXxXpX9XqXqX",
+"qXqX0XrX.X1XeX0XwX8X>.U Z -XtX0XqXqX0XtX|.yXkX8XqXqXqXqXqXqX9XqXaXkXuX1X,X8XeXqXeX4X XAXyX0XqXqX",
+"qXqX0XrX.X1XeXqXqXeX{.P.7XyX0XqXqXqXeX1XoXVX0XqXqXqXqXqXqXqXqXqX9XqXaXkXuX2X<X8XrXOX:XDXyX0XqXqX",
+"qXqX0XrX.X1XeXqXqXqXiXdXwX0XqXqXqX0XrX|.pXkX8XqXqXqXqXqXqXqXqXqXqXqX9XqXpXjXyX4X<XOX0XZXuX0XqXqX",
+"qXqX0XrX.X1XeXqXqXqX0X9X0XqXqXqXqXeX<X+XCX0XqXqXqXqXqX9XwXwXqXqXqXqXqXqX9X0XaXdX&X6XqXZXuX0XqXqX",
+"qXqX0XrX.X1XeXqXqXqXqXqXqXqXqXqXqXrX}.fXkX8XqXqXqXqXqXsX7X9XwXqXqXqXqXqXqXqXwX<X#XrX9XZXuX0XqXqX",
+"qXqX0XrX X<XtXqXqXqXqXqXqXqXqXqXrX,X$XZX0XqXqXqXqX0XyX2.B [ 1XeX0XqXqXqXqXqXeX@X5XeX9XZXuX0XqXqX",
+"qXqX0XrX.X+X4XqXwXqXqXqXqXqXqXqXrX}.jXjX8XqXqXqX9XdXF.; 9.T.wXqXqXqXqXqXqXeX<X#XrXqX0XZXuX0XqXqX",
+"qXqX0XrX.X>X2X;X3XqXwXqXqXqXqXrX:X*XSX9XqXqXqXqX7XlX0.# } r XXuX0XqXqXqXqXwXOX5XwXqX9XZXuX0XqXqX",
+"qXqX0XrX.X1XtX8X<X:X4XwXwXqXqXeX}.zXjX8XqXqXqXqX8XgXb.5 %X, J.dX9XqXqXqXrX>X#XrX0XqX9XZXuX0XqXqX",
+"qXqX0XrX.X<XeXqXeX8X<X>X5XqXtX;X;XSX9XqXqXqXqXqXqXqXqXo.d +.0XqXqXqXqXqXwX.X5XwXqXqX9XZXuX0XqXqX",
+"qXqX0XrX.X1XeXqXqXwXeX8X<X,X8X XnXhX8XqXqXqXqXqXqXqXeXaX8XaXeXqXqXqX0XrX;X@XrX0XqXqX9XZXuX0XqXqX",
+"qXqX0XrXXX1XrXqXqXqXqXwXeX9X;XqXCX0XeXqXqXqXqXqXqXqXqX0XwX9XqXqXqXqXwXwX X6XeXqXqXwX0XZXuX0XqXqX",
+"qXqX0XrX[.>XqX8X9X9X9X9X8X0X9XtX,X%X1X8X9X9X9X9X9X9X9X9X8X9X9X9X9X8XwX$XoXwX8X9X9X9X7XCXuX0XqXqX",
+"qXqXqX0X+XeXfXsXsXsXsXsXsXsXsXaXsXyX5X8XiXdXsXsXpXsXsXsXsXsXsXsXsXsXsX;XyXdXsXsXsXsXaXSXyX0XqXqX",
+"qXqX0XtXhXCXAXBXVXVXVXVXVXVXVXVXVXCXCXBXBXBXZXjXVXAXBXVXVXVXVXVXVXVXBXVXVXBXVXVXBXZXkXMXuX0XqXqX",
+"qXqXqXqX6XqX9X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X6XqX9X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X6XqXwXqXqXqX",
+"qXqXqXqXwXqXqXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXqXqXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXwXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
+"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/twiddle-web.png b/icons/twiddle-web.png
new file mode 100644 (file)
index 0000000..1b3924a
Binary files /dev/null and b/icons/twiddle-web.png differ
diff --git a/icons/twiddle.ico b/icons/twiddle.ico
new file mode 100644 (file)
index 0000000..332817f
Binary files /dev/null and b/icons/twiddle.ico differ
diff --git a/icons/twiddle.rc b/icons/twiddle.rc
new file mode 100644 (file)
index 0000000..5d60596
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "twiddle.ico"
diff --git a/icons/undead-16d24.png b/icons/undead-16d24.png
new file mode 100644 (file)
index 0000000..dd44656
Binary files /dev/null and b/icons/undead-16d24.png differ
diff --git a/icons/undead-16d4.png b/icons/undead-16d4.png
new file mode 100644 (file)
index 0000000..ecc24cd
Binary files /dev/null and b/icons/undead-16d4.png differ
diff --git a/icons/undead-16d8.png b/icons/undead-16d8.png
new file mode 100644 (file)
index 0000000..7ff57a3
Binary files /dev/null and b/icons/undead-16d8.png differ
diff --git a/icons/undead-32d24.png b/icons/undead-32d24.png
new file mode 100644 (file)
index 0000000..a2b3323
Binary files /dev/null and b/icons/undead-32d24.png differ
diff --git a/icons/undead-32d4.png b/icons/undead-32d4.png
new file mode 100644 (file)
index 0000000..ae41cbf
Binary files /dev/null and b/icons/undead-32d4.png differ
diff --git a/icons/undead-32d8.png b/icons/undead-32d8.png
new file mode 100644 (file)
index 0000000..a6dab64
Binary files /dev/null and b/icons/undead-32d8.png differ
diff --git a/icons/undead-48d24.png b/icons/undead-48d24.png
new file mode 100644 (file)
index 0000000..5463687
Binary files /dev/null and b/icons/undead-48d24.png differ
diff --git a/icons/undead-48d4.png b/icons/undead-48d4.png
new file mode 100644 (file)
index 0000000..29b5db4
Binary files /dev/null and b/icons/undead-48d4.png differ
diff --git a/icons/undead-48d8.png b/icons/undead-48d8.png
new file mode 100644 (file)
index 0000000..2e1565b
Binary files /dev/null and b/icons/undead-48d8.png differ
diff --git a/icons/undead-base.png b/icons/undead-base.png
new file mode 100644 (file)
index 0000000..4708fcf
Binary files /dev/null and b/icons/undead-base.png differ
diff --git a/icons/undead-ibase.png b/icons/undead-ibase.png
new file mode 100644 (file)
index 0000000..d3d53f2
Binary files /dev/null and b/icons/undead-ibase.png differ
diff --git a/icons/undead-ibase4.png b/icons/undead-ibase4.png
new file mode 100644 (file)
index 0000000..521ede8
Binary files /dev/null and b/icons/undead-ibase4.png differ
diff --git a/icons/undead-icon.c b/icons/undead-icon.c
new file mode 100644 (file)
index 0000000..a5a2ece
--- /dev/null
@@ -0,0 +1,616 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 249 2 ",
+"   c #E6E6E6",
+".  c #E6E6E6",
+"X  c gray91",
+"o  c #D5D5D5",
+"O  c gainsboro",
+"+  c gray91",
+"@  c #E6E6E6",
+"#  c #E7E7E7",
+"$  c #E4E4E4",
+"%  c #DDDDDD",
+"&  c gray91",
+"*  c gray90",
+"=  c #E6E6E6",
+"-  c #E6E6E6",
+";  c gray90",
+":  c #EEEEEE",
+">  c gray69",
+",  c #989898",
+"<  c #F1F1F1",
+"1  c #E1E1E1",
+"2  c gray95",
+"3  c #A2A2A2",
+"4  c #656565",
+"5  c gray91",
+"6  c #E6E6E6",
+"7  c #E6E6E6",
+"8  c #E6E6E6",
+"9  c #E6E6E6",
+"0  c gray89",
+"q  c gray94",
+"w  c #939393",
+"e  c #A5A5A5",
+"r  c gray94",
+"t  c #E1E1E1",
+"y  c gray94",
+"u  c #ACACAC",
+"i  c #767676",
+"p  c gray91",
+"a  c #E6E6E6",
+"s  c #E6E6E6",
+"d  c #E6E6E6",
+"f  c #E6E6E6",
+"g  c #E6E6E6",
+"h  c #E6E6E6",
+"j  c #EAEAEA",
+"k  c gray91",
+"l  c #DDDDDD",
+"z  c #DFDFDF",
+"x  c gray91",
+"c  c #E9E9E9",
+"v  c gray91",
+"b  c #EAEAEA",
+"n  c #E9E9E9",
+"m  c gray91",
+"M  c #E7E7E7",
+"N  c #E6E6E6",
+"B  c #E6E6E6",
+"V  c #E6E6E6",
+"C  c #E6E6E6",
+"Z  c gray90",
+"A  c gray",
+"S  c #C1C1C1",
+"D  c #D1D0D0",
+"F  c #D0CFCF",
+"G  c #C2C1C1",
+"H  c gray73",
+"J  c #C0C0C0",
+"K  c #C0C0C0",
+"L  c #C1C1C1",
+"P  c #C5C5C5",
+"I  c #CACACA",
+"U  c #E7E7E7",
+"Y  c #E6E6E6",
+"T  c #E4E4E4",
+"R  c gray91",
+"E  c #DFDFDF",
+"W  c gray76",
+"Q  c #E5E6E6",
+"!  c #9B9C9C",
+"~  c #9F9F9F",
+"^  c #E4E5E5",
+"/  c #D2D2D2",
+"(  c #E1E1E1",
+")  c gray90",
+"_  c gray90",
+"`  c #C5C5C5",
+"'  c #E6E6E6",
+"]  c #E6E6E6",
+"[  c #EEEEEE",
+"{  c #9B9B9B",
+"}  c LightGray",
+"|  c #E4E3E3",
+" . c #C7C8C8",
+".. c #C5C0C0",
+"X. c #887A7A",
+"o. c #8A7C7C",
+"O. c #C6C1C1",
+"+. c #D8D9D9",
+"@. c gray90",
+"#. c #F1F1F1",
+"$. c gray60",
+"%. c gray72",
+"&. c gray93",
+"*. c gray90",
+"=. c gray95",
+"-. c gray53",
+";. c gray71",
+":. c #EAE9E9",
+">. c #C1C2C2",
+",. c #D1C6C6",
+"<. c #CBB6B6",
+"1. c #CCB6B6",
+"2. c #CFC4C4",
+"3. c #D4D5D5",
+"4. c gray90",
+"5. c #989898",
+"6. c gray71",
+"7. c gray95",
+"8. c #E4E4E4",
+"9. c #E6E6E6",
+"0. c #E7E7E7",
+"q. c #CACACA",
+"w. c #D7D7D7",
+"e. c #E1E1E1",
+"r. c #C6C6C6",
+"t. c #E2E1E1",
+"y. c #BFB3B3",
+"u. c #C0B4B4",
+"i. c #DFDEDE",
+"p. c #DEDFDF",
+"a. c #C6C6C6",
+"s. c #B9B9B9",
+"d. c gray96",
+"f. c #E6E6E6",
+"g. c gray91",
+"h. c #E6E6E6",
+"j. c #E6E6E6",
+"k. c gray92",
+"l. c gray92",
+"z. c gray88",
+"x. c #B9B9B9",
+"c. c #DBDCDC",
+"v. c #DAD9D9",
+"b. c #DBDADA",
+"n. c #D9DADA",
+"m. c #C5C5C5",
+"M. c #D6D7D6",
+"N. c #E1E0E1",
+"B. c #DAD8DA",
+"V. c gray84",
+"C. c #DADADA",
+"Z. c #E7E7E7",
+"A. c gray90",
+"S. c gray92",
+"D. c #E9E9E9",
+"F. c #E0DFDF",
+"G. c gray",
+"H. c #E6E3E3",
+"J. c #CCD6D6",
+"K. c #CED7D7",
+"L. c #E5E1E1",
+"P. c #CBCDCC",
+"I. c #E1DEE1",
+"U. c #D4D7D4",
+"Y. c #CAD4CA",
+"T. c #E2DEE2",
+"R. c #E1E1E1",
+"E. c #E6E6E6",
+"W. c gray92",
+"Q. c #A9A9A9",
+"!. c gray85",
+"~. c #E1E2E2",
+"^. c #C9C6C6",
+"/. c #C5D7D7",
+"(. c #70C6C6",
+"). c #72C6C6",
+"_. c #C4D3D3",
+"`. c #DFDADC",
+"'. c #D2DBD3",
+"]. c #76CE76",
+"[. c #65D165",
+"{. c #ADD2AD",
+"}. c #EDE8ED",
+"|. c #E4E6E4",
+" X c gray95",
+".X c #8B8B8B",
+"XX c #BCBCBC",
+"oX c #E7E9E9",
+"OX c #C9C1C1",
+"+X c #97D1D1",
+"@X c #69CECE",
+"#X c #68CDCD",
+"$X c #94CCCA",
+"%X c #E6D7DE",
+"&X c #ACD2AE",
+"*X c #5CCE5C",
+"=X c #61CE61",
+"-X c #7BCF7B",
+";X c #E9E2E9",
+":X c #E5E7E5",
+">X c #EAEAEA",
+",X c gray70",
+"<X c #CACACA",
+"1X c #E3E4E4",
+"2X c #C7C2C2",
+"3X c #A3CDCD",
+"4X c #7BD2D2",
+"5X c #7BD3D3",
+"6X c #A4CCCB",
+"7X c #DDD6D7",
+"8X c #D5DDD6",
+"9X c #80C280",
+"0X c #6BC56B",
+"qX c #B4D5B4",
+"wX c #ECE7EC",
+"eX c #E5E6E5",
+"rX c gray90",
+"tX c #EFEFEF",
+"yX c gray93",
+"uX c #DFDFDF",
+"iX c #C5C6C6",
+"pX c #E7E4E4",
+"aX c #E3DDDD",
+"sX c #E3DDDD",
+"dX c #E5E2E2",
+"fX c #D4D5D4",
+"gX c #E8E6E8",
+"hX c #E2E2E2",
+"jX c #DADEDA",
+"kX c #EBE6EB",
+"lX c #E6E6E6",
+"zX c #E6E6E6",
+"xX c #E6E6E6",
+"cX c #E4E4E4",
+"vX c gray90",
+"bX c #E6E6E6",
+"nX c gray89",
+"mX c #E7E8E8",
+"MX c #E7E8E8",
+"NX c #E7E8E8",
+"BX c #E7E7E7",
+"VX c #E5E4E5",
+"CX c #E5E6E5",
+"ZX c #E7E7E7",
+"AX c #E9E8E9",
+"SX c #E5E6E5",
+"DX c #E6E6E6",
+"FX c #E6E6E6",
+"GX c white",
+/* pixels */
+"        . X o O + @ # $ % & * = ",
+"      - ; : > , < 1 2 3 4 5 6 7 ",
+"  - 8 9 0 q w e r t y u i p a s ",
+"d f g h j k l z x c v b n m M N ",
+"B V C Z A S D F G H J K L P I U ",
+"Y T R E W Q ! ~ ^ / ( ) _ ` ' ] ",
+"[ { } |  ...X.o.O.+.@.#.$.%.&.*.",
+"=.-.;.:.>.,.<.1.2.3.4.5.6.7.8.9.",
+"0.q.w.e.r.t.y.u.i.p.a.s.d.f.g.h.",
+"j.k.l.z.x.c.v.b.n.m.M.N.B.V.C.Z.",
+"A.S.D.F.G.H.J.K.L.P.I.U.Y.T.R.E.",
+"W.Q.!.~.^./.(.)._.`.'.].[.{.}.|.",
+" X.XXXoXOX+X@X#X$X%X&X*X=X-X;X:X",
+">X,X<X1X2X3X4X5X6X7X8X9X0XqXwXeX",
+"rXtXyXuXiXpXaXsXdXfXgXhXjXkXlXzX",
+"xXcXvXbXnXmXMXNXBXVXCXZXAXSXDXFX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 104 2 ",
+"   c #181818",
+".  c #222222",
+"X  c #323333",
+"o  c #393939",
+"O  c #434343",
+"+  c gray30",
+"@  c #515151",
+"#  c #5C5C5C",
+"$  c #6A5D5D",
+"%  c #656565",
+"&  c #6C6060",
+"*  c #6C6C6C",
+"=  c #706363",
+"-  c #777777",
+";  c #7D7D7D",
+":  c #55A555",
+">  c #6EAC6E",
+",  c #72AA72",
+"<  c #59CE59",
+"1  c #5FD65F",
+"2  c #63C763",
+"3  c #6DC36D",
+"4  c #6BCF6B",
+"5  c #60D260",
+"6  c #69D369",
+"7  c #6BDC6B",
+"8  c #74C874",
+"9  c #7FC27F",
+"0  c #72DE72",
+"q  c #6BE56B",
+"w  c #6EE86E",
+"e  c #7F8181",
+"r  c #5FB5B5",
+"t  c #6EBCBC",
+"y  c #72B8B8",
+"u  c #5CC3C3",
+"i  c #5ECCCC",
+"p  c #6BC6C6",
+"a  c #64CCCC",
+"s  c #73C3C3",
+"d  c #6ED6D6",
+"f  c #65DADA",
+"g  c #69DBDB",
+"h  c #7BDBDB",
+"j  c #6EE6E6",
+"k  c #71E3E3",
+"l  c #74EAEA",
+"z  c #808C8C",
+"x  c gray54",
+"c  c #929393",
+"v  c #9E9E9E",
+"b  c #A59494",
+"n  c #A89797",
+"m  c #8BBA8B",
+"M  c #9CBC9C",
+"N  c #87AAAA",
+"B  c #8CAAAA",
+"V  c #82BBBB",
+"C  c #93BBBB",
+"Z  c #A3A3A3",
+"A  c #ABABAB",
+"S  c #B3A1A1",
+"D  c #B8A6A6",
+"F  c #BBABAB",
+"G  c #A0BEA0",
+"H  c #B5B5B5",
+"J  c #BBBBBB",
+"K  c #C2B1B1",
+"L  c #CAB6B6",
+"P  c #C5BBBB",
+"I  c #CBB9B9",
+"U  c #D2BDBD",
+"Y  c #93C193",
+"T  c #A3C0A3",
+"R  c #AFC2AF",
+"E  c #B5C5B5",
+"W  c #B8C6B8",
+"Q  c #81CCCC",
+"!  c #BBC7C7",
+"~  c #BAC8C8",
+"^  c #C5C5C5",
+"/  c #C8C6C6",
+"(  c #C6CCC6",
+")  c #C2CDCD",
+"_  c #CACBCB",
+"`  c #DBC5C5",
+"'  c #CDD3D3",
+"]  c #D4D4D4",
+"[  c #DAD7DA",
+"{  c #DCDCDC",
+"}  c #E0C8C8",
+"|  c #E2DDDD",
+" . c #DFE0DF",
+".. c #E2DDE2",
+"X. c #E5E5E5",
+"o. c #E9E5E5",
+"O. c #EBE5EB",
+"+. c #E7E8E8",
+"@. c #ECECEC",
+"#. c #F0EDED",
+"$. c #F5EFF5",
+"%. c #EFF0F0",
+"&. c #F2F2F2",
+"*. c gray99",
+/* pixels */
+"X.X.+.X.+.+.X.X.X.X.+.X.+.#.O.X.+.X.+.X.+.o.+.+.@.o.X.X.X.X.X.X.",
+"X.X.X.X.X.X.o.+.+.X.X.+.X.^ { @.X.X.X.X.+.O.+.o._ @.X.X.X.X.X.X.",
+"X.X.+.+.X.X.X.X.X.X.X.@.^ % + _ @.X.X.X.O...O., X c &.X.X.X.X.X.",
+"+.X.X.X.+.X.X.X.X.X.X.X.@.+.O ] @.X.X.X...O...+ - # $.X.+.X.X.+.",
+"X.X.X.+.X.X.+.X.X.X.X.+.{ O v $.X.X.X.X.X.X.@.@ * # %.X.X.+.X.X.",
+"+.+.X.X.+.X.+.X.X.+.X.&.A O % _ @.X.X.X.X.X.#.A + J @.X.X.X.+.X.",
+"o.X.+.X.X.X.X.X.X.X.X.X.+.&.+.+.X.X.X.+.X.+.X.@.&.@.o.X.X.+.X.X.",
+"X.X.X.X.X.X.o.+.+.@.@.%.@.@.@.@.@.@.@.@.#.@.@.@.@.@.%.@.#.+.X.X.",
+"X.+.X.X.X.X.+.+.{ ^ ^ / ^ / ( ^ / _ ( _ / / ( ^ / ( / / ^ ] +.X.",
+"X.X.X.+.+.X.o.@.c Z H A A A A A A A Z c A A A A A A A A A ^ +.X.",
+"X.X.o.X.X.X.X.@.v X.&.%.*.*.*.*.$.&.X._ *.%.@.&.&.%.*.&.%.@.X.+.",
+"X.X.@.&.+.X.X.@.v [ +.X.e X o x @.+.] ^ +.X.X.o...&.c J @.X.X.X.",
+"X.$.A % { +.X.@.v { &.; & & & $ x &.{ / @.X.X. .*.c + ..+.X.X.X.",
+"X.+.( o ( @.X.@.v X.( D L I L I S _ { / +.X.X.*.x @ @.@.X.X.X.X.",
+"X.X.*.# ] @.X.@.v  ./ } F K F F ` _  .^ @.X.*.c @ @.+.X.X.+.+.X.",
+"X.@.Z   - O.X.@.v { ] K L U U L H { { / X.*.x @ @.+.X.X.X.X.X.X.",
+"X.+.^ A J X.+.@.v [ @.P b D S n / @.[ ^ &.c @ @.@.X.X.X.+.X.X.X.",
+"+.+.@.&.@.X.X.@.v [ @.o./ P P / o.+.] ^ @.H  .+.o.X.X.o.o.X.X.+.",
+"+.X.X.X.X.X.X.@.v  .@.+.#.+.+.@.@.@.{ _ $.&.@.+.+.O.+.+.+.+.X.X.",
+"+.X.X.X.+.X.X.@.v H / W ^ ^ ^ ^ ^ ^ H A ( J ^ ^ W ^ ^ ^ ^ ] +.X.",
+"X.X.X.o.+.X.o.@.v ]  .{  .o.o. .{ X.] ^ X.{  .X.+.+. ...{ ..X.X.",
+"X.X.@.@.X.X.X.@.v { @.@.| ! ! | @.+.{ ^ +.+.O./ W _ @.+.+.+.X.X.",
+"X.+.] J X.+.X.@.v { @.) p g f p _ @.[ ^ @...m 7 7 4 M O.X.X.+.X.",
+"o.&.Z . _ @.X.@.v { | t s d h t y o.{ ^ &.G 5 6 0 6 5 W @.X.X.X.",
+"X.X.*.# _ %.X.@.v  .) a c r Q z u '  .^ O.9 7 : 6 : q Y O.X.X.X.",
+"X.X.] o A @.X.@.v X.) g k l k l d '  .^ O.9 w 0 7 0 q Y $.X.X.X.",
+"X.@.v @ - X.X.@.v | ) i l g j j i ' { ^ $.E < , > 5 2 ^ @.X.X.X.",
+"X.X.@.&.&.X.X.@.v  .! B V C V C N ) ..^ +.O.G 3 4 8 E @.X.X.X.X.",
+"X.X.X.X.X.X.X.@.v {  .o.| o.| o.X.X.{ ^ @.X.O.{ _ | @.X.+.X.X.+.",
+"X.X.X.X.X.X.X.@.Z { @.X.X.X.+.+.X.+.{ / @.X.X.+.@.X.X.X.X.+.X.X.",
+"X.X.X.X.X.X.X.+. .+.X.X.X.X.X.X.X.X.X.X.X.X.X.o.X.+.X.+.X.X.+.X.",
+"+.X.X.+.X.+.X.X.O.+.X.X.X.X.+.X.X.X.X.X.+.X.X.X.o.+.+.X.X.X.X.o."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 140 2 ",
+"   c #060505",
+".  c #0B0A0A",
+"X  c #110F0F",
+"o  c #151515",
+"O  c #1D1D1D",
+"+  c #222222",
+"@  c gray17",
+"#  c gray21",
+"$  c #3C3C3C",
+"%  c #3E7D3E",
+"&  c #414141",
+"*  c #4D4D4D",
+"=  c #534C4C",
+"-  c #575353",
+";  c #5C5B5B",
+":  c #636262",
+">  c #6C6D6D",
+",  c #727272",
+"<  c #7C7575",
+"1  c #7D7D7D",
+"2  c #8A7C7C",
+"3  c #539E53",
+"4  c #5E955E",
+"5  c #57AD57",
+"6  c #58AF58",
+"7  c #5CB45C",
+"8  c #63B263",
+"9  c #65BC65",
+"0  c #7DA37D",
+"q  c #71B471",
+"w  c #5DD35D",
+"e  c #61C661",
+"r  c #66CD66",
+"t  c #65D165",
+"y  c #67DD67",
+"u  c #6BD36B",
+"i  c #6FDA6F",
+"p  c #72C772",
+"a  c #71DE71",
+"s  c #6BE66B",
+"d  c #6EED6E",
+"f  c #73E573",
+"g  c #74EC74",
+"h  c #77F377",
+"j  c #78F078",
+"k  c #6D9999",
+"l  c #769797",
+"z  c #799595",
+"x  c #54A7A7",
+"c  c #54AAAA",
+"v  c #57B4B4",
+"b  c #5CBEBE",
+"n  c #61B5B5",
+"m  c #6AB1B1",
+"M  c #60BABA",
+"N  c #71B5B5",
+"B  c #58C5C5",
+"V  c #56C9C9",
+"C  c #5BCDCD",
+"Z  c #62C2C2",
+"A  c #6CC6C6",
+"S  c #65CCCC",
+"D  c #65DCDC",
+"F  c #69D8D8",
+"G  c #72DEDE",
+"H  c #65E0E0",
+"J  c #6CE3E3",
+"K  c #6CEAEA",
+"L  c #73E6E6",
+"P  c #74EAEA",
+"I  c #7AEEEE",
+"U  c #77F6F6",
+"Y  c #848484",
+"T  c #8C8C8C",
+"R  c #959494",
+"E  c #A59696",
+"W  c #AE9D9D",
+"Q  c #84AB84",
+"!  c #89A989",
+"~  c #8DB18D",
+"^  c #94AC94",
+"/  c #95B295",
+"(  c #8CA3A3",
+")  c #84ADAD",
+"_  c #89ABAB",
+"`  c #97AFAF",
+"'  c #84B1B1",
+"]  c #82BABA",
+"[  c #9AB4B4",
+"{  c #9ABABA",
+"}  c #A4A4A4",
+"|  c #AAA2A2",
+" . c #ADACAC",
+".. c #B3A2A2",
+"X. c #B2AAAA",
+"o. c #BCA9A9",
+"O. c #A1B3A1",
+"+. c #ABB5B5",
+"@. c #AFBABA",
+"#. c #B4B4B4",
+"$. c #B9B6B6",
+"%. c #B5BBB5",
+"&. c #BABBBA",
+"*. c #C2AFAF",
+"=. c #C5B2B2",
+"-. c #CBB7B7",
+";. c #CDB8B8",
+":. c #D5BEBE",
+">. c #BEC0BE",
+",. c #BEC0C0",
+"<. c #C3C3C3",
+"1. c #CCC7C7",
+"2. c #CBCBCB",
+"3. c #D6C1C1",
+"4. c #DAC3C3",
+"5. c #D1CECE",
+"6. c #DFCACA",
+"7. c #D4CFD4",
+"8. c #D6D6D6",
+"9. c #DDD6D6",
+"0. c #D7D8D8",
+"q. c #DBDBDB",
+"w. c #E2CBCB",
+"e. c #EED5D5",
+"r. c #E1D9D9",
+"t. c #F3DBDB",
+"y. c #E1D9E1",
+"u. c #DFE1E1",
+"i. c #E6E6E6",
+"p. c #ECE5E5",
+"a. c #E7E9E7",
+"s. c #EDE7ED",
+"d. c #E6E8E8",
+"f. c #ECEBEB",
+"g. c #F1ECEC",
+"h. c #EEF0EE",
+"j. c #F1ECF1",
+"k. c #EFF0F0",
+"l. c #F3F3F3",
+"z. c gray99",
+/* pixels */
+"i.i.i.d.i.i.i.i.i.i.d.i.i.i.d.d.i.i.i.i.d.d.i.i.i.i.i.d.i.d.i.i.i.i.d.i.i.i.i.i.i.i.i.i.i.i.i.d.",
+"i.i.i.a.d.d.d.i.d.i.p.i.i.i.i.i.d.i.i.d.i.d.d.p.i.i.i.i.d.i.d.i.i.i.i.i.i.i.i.i.i.i.i.d.i.i.i.i.",
+"i.i.a.i.i.d.i.i.i.d.i.i.i.i.i.i.i.i.i.i.f.a.i.i.i.i.i.i.i.i.p.i.i.i.i.d.f.i.i.i.i.i.a.i.i.i.i.i.",
+"i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.d.2.0.f.i.i.i.i.i.i.i.i.i.i.i.f.q.q.f.i.i.i.a.i.i.i.i.i.i.",
+"i.i.i.i.i.i.d.i.p.i.i.i.i.i.i.i.d.i.l.1 @ + R l.i.i.i.i.i.i.i.i.i.j.#.+ O  .k.i.d.d.i.i.i.i.i.i.",
+"i.i.d.i.i.i.i.i.d.i.i.i.i.i.d.i.i.p.a.2.l.1 $ l.i.i.i.i.i.i.d.i.i.l.& < Y # l.i.d.i.i.i.i.i.p.d.",
+"i.d.i.i.p.i.i.i.i.i.i.i.i.d.i.i.i.i.u.l.q.+ R l.i.i.i.i.i.i.i.d.p.f.$ - : # d.i.d.i.i.i.i.d.i.i.",
+"i.i.i.d.i.i.i.d.i.p.d.i.i.i.i.d.i.i.d.r.$ R z.i.i.i.i.i.i.p.i.d.p.l.# R ( @ f.i.i.p.i.i.i.i.d.d.",
+"i.i.d.i.i.i.i.i.i.d.i.i.d.d.i.i.i.i.l.* . * , s.i.i.i.i.i.i.i.i.i.l.T O O 1 l.i.i.i.d.i.i.i.d.i.",
+"i.i.i.p.i.i.d.i.i.i.i.i.i.d.i.i.i.i.f. .R Y } d.i.i.i.i.i.i.i.i.i.i.a. .} f.i.i.i.i.i.i.i.i.i.i.",
+"i.i.i.i.d.i.i.i.i.i.i.i.i.i.i.i.i.i.i.h.l.z.l.i.i.i.i.i.i.i.i.i.i.i.i.k.l.i.i.i.d.i.i.i.i.d.d.i.",
+"i.i.i.d.i.p.i.d.i.i.d.p.i.i.i.i.i.i.i.i.u.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.",
+"d.i.i.i.i.i.i.i.d.i.i.i.d.p.f.k.f.f.h.f.f.h.f.h.l.f.f.l.f.f.f.k.k.h.f.k.k.f.h.f.g.g.g.a.i.i.i.i.",
+"i.i.d.p.d.i.i.i.i.i.i.i.a.8.<.<.<.<.<.<.<.<.<.<.<.<.<.<.1.<.<.<.<.1.<.<.<.<.<.<.<.<.<.q.a.i.i.i.",
+"i.d.i.i.i.i.i.i.i.i.i.i.s.> Y T T T T T T T T T T T T T > T T T T T T T T T T T T T Y 1.s.i.d.d.",
+"i.i.i.i.i.i.i.d.i.d.i.i.i.Y g.l.l.l.l.l.k.l.j.l.l.l.l.l.&.l.l.l.l.l.l.l.l.l.l.l.l.l.l.f.i.d.i.i.",
+"i.i.i.i.i.i.i.i.i.i.i.i.i.1 q.i.i.i.i.l.h.f.l.f.u.i.i.i. .i.i.u.i.i.y.i.i.u.i.k.i.i.u.d.i.i.i.i.",
+"i.i.i.i.i.f.f.i.i.i.i.i.i.1 i.i.i.f.q., $ $ : 5.l.i.i.a. .i.i.i.i.i.i.i.i.i.f.< 5.f.i.i.i.i.i.i.",
+"i.i.i.i.i.2.<.i.i.i.i.i.i.1 i.i.k.-.O .     X X ( l.p.a.X.i.d.i.i.i.i.i.i.l.* # i.i.i.i.i.i.i.i.",
+"i.i.i.k.#.o + i.d.i.i.i.i.1 i.a.u.- ..t.3.;.t.=.= 5.s.i. .i.i.d.i.i.i.i.l.* $ h.a.i.i.i.i.i.i.i.",
+"d.i.i.a.i. .+ i.a.i.i.d.i.1 q.l.} o.t.< =.4.< 6.:.R l.i.#.i.i.i.i.i.i.z.* # k.a.i.i.i.i.i.d.d.p.",
+"i.i.i.i.l.$.O u.d.i.d.i.i.1 i.f. .6.4.: ..;.; =.e.| i.a. .i.i.i.i.i.l.* # l.a.i.i.i.i.i.i.i.i.d.",
+"i.i.i.i.l.<.+ f.a.i.p.i.i.1 i.f.#.3.w.e.e.e.t.w.w.X.d.d. .i.a.i.i.l.* # f.a.i.i.i.i.i.i.i.i.i.d.",
+"i.i.i.l. .+ . $ 7.a.i.i.i.1 i.s.<.=.*.E ;.;.| ..-.$.f.i.#.i.i.a.z.* # l.a.i.i.i.i.i.i.d.a.i.d.i.",
+"i.i.i.a.2.}  .} r.a.d.i.i.1 i.i.f.| w.Y ..=.< 3.W u.d.d. .y.i.i.* # j.a.i.d.i.i.i.i.d.i.i.i.i.i.",
+"i.i.i.i.f.l.l.l.a.i.a.i.i.1 i.i.a.r.| ..3.4.o.| 0.a.i.a.#.i.l.} & f.a.i.i.i.i.i.i.i.i.i.a.i.i.i.",
+"i.i.i.i.i.i.i.i.i.i.i.i.i.1 i.a.i.a.f.2.$.%.<.d.f.i.i.d. .i.a.i.j.a.i.i.i.i.i.i.a.i.d.d.i.i.i.a.",
+"i.i.i.i.i.i.i.i.i.i.d.i.i.1 i.s.s.a.a.f.l.j.j.s.a.f.d.f.%.a.s.a.a.a.a.s.a.s.f.f.s.a.s.p.i.i.i.i.",
+"i.i.i.i.i.i.i.i.i.i.d.i.i.1 0.8.0.8.8.8.8.8.8.0.0.0.0.0.} 8.8.8.0.0.0.0.8.8.0.q.8.0.0.i.a.a.i.i.",
+"i.i.i.i.i.i.i.i.a.i.i.d.i.,  .&.%.%.$.$.%.%.#.$.#.#.%.&.T %.$.$.#.%.#.$.$.#.%.$.$.$.#.8.s.i.i.i.",
+"i.i.i.i.i.i.i.i.i.i.i.i.i.1 a.f.f.f.s.f.k.l.f.f.f.f.s.j.%.a.j.f.f.f.f.k.j.f.a.f.f.f.f.i.i.i.i.a.",
+"a.i.i.i.i.i.i.i.a.i.i.i.d.1 i.i.i.i.a.s.r.r.p.s.i.i.i.d. .i.i.i.i.f.f.y.y.s.d.i.i.i.i.i.i.i.i.i.",
+"i.i.d.d.i.f.l.i.i.i.i.i.i.< y.s.i.f.2._ N N ) ,.s.i.i.a. .i.d.i.f.<.Q q q Q 1.g.i.i.i.i.d.d.i.i.",
+"i.d.i.d.i.&.$.i.i.i.i.i.i.0 i.y.g.&.n K P P K b +.f.i.a. .i.i.j.$.7 s h g s 7 %.g.i.i.i.d.i.i.i.",
+"i.i.i.g.#.o + y.d.i.i.i.i.1 i.s.r.m F A L P A G b 2.f.d.#.i.a.8.8 g f f a f g 8 8.a.i.i.i.i.i.d.",
+"i.i.i.i.s.%.+ u.d.i.i.i.i.1 i.f.@.V { 2 v F  .> V [ g.i. .i.j.O.y a % r r % a y O.g.i.i.i.i.i.i.",
+"i.i.p.i.g.%.+ i.i.i.i.i.i.1 u.g.[ D N z S J ) k D ' p.d.X.i.j.~ s i 7 u u 6 i s ~ s.i.i.d.i.i.i.",
+"i.d.d.i.l.$.+ s.a.i.i.i.i.1 i.g.[ H P L P L J L K ' p.d. .i.j./ y f h d j h f y / g.i.i.i.i.i.d.",
+"d.i.i.j.} o . @ 2.f.i.i.i.1 u.s.` H I L I P L I P ) p.d.+.i.f.>.e f 4 q 3 5 f e -.k.i.i.d.p.i.i.",
+"i.i.i.d.0.#.,.%.i.a.i.i.i.1 i.g.{ B A U Z S U Z C ] p.d.X.i.i.s.! w p z i h w ! f.d.i.i.i.i.i.i.",
+"i.i.i.i.a.l.g.j.i.i.d.d.i.1 u.j.( ( +.x +.+.c +.` l g.i. .i.i.i.y.^ e w t 8 ^ y.d.i.i.i.i.i.i.i.",
+"i.d.i.i.i.i.i.i.i.i.i.d.i.2 i.d.8.d.p.1.f.d.1.f.p.5.i.a.#.i.i.p.a.g.7.&.&.8.j.i.i.i.i.i.d.d.i.i.",
+"i.i.i.i.i.i.i.p.i.i.d.i.y.< i.i.a.a.i.a.i.i.f.i.i.f.i.a. .i.d.i.a.d.a.f.k.f.i.p.i.i.i.i.d.i.d.i.",
+"d.d.i.i.i.i.i.d.i.i.i.i.y.0 i.i.i.i.i.i.i.i.i.d.i.i.i.i.#.i.i.i.i.i.i.i.i.i.d.i.i.i.i.i.i.i.i.i.",
+"i.i.i.i.d.i.i.i.i.i.i.i.s.q.d.d.d.i.d.i.i.i.i.i.i.i.i.i.y.a.d.d.i.i.i.i.i.p.d.i.i.i.i.i.i.i.i.d.",
+"d.i.i.d.i.i.i.i.i.i.d.i.d.s.i.i.d.i.p.i.i.p.d.d.i.i.i.i.p.i.d.i.a.i.i.i.i.i.i.i.i.i.d.i.i.i.i.i.",
+"i.d.i.i.i.i.i.i.i.d.i.d.i.i.i.i.i.i.i.i.i.i.i.d.i.i.d.i.i.i.i.i.i.i.i.a.i.i.i.i.i.i.i.i.d.i.i.i.",
+"i.i.i.i.i.i.d.i.i.i.i.i.i.i.i.d.i.i.i.i.i.i.d.d.i.a.i.i.i.i.d.i.i.i.i.i.i.d.i.i.i.d.d.i.d.i.d.i."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/undead-web.png b/icons/undead-web.png
new file mode 100644 (file)
index 0000000..6fbdc59
Binary files /dev/null and b/icons/undead-web.png differ
diff --git a/icons/undead.ico b/icons/undead.ico
new file mode 100644 (file)
index 0000000..f99957b
Binary files /dev/null and b/icons/undead.ico differ
diff --git a/icons/undead.rc b/icons/undead.rc
new file mode 100644 (file)
index 0000000..2a9c9eb
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "undead.ico"
diff --git a/icons/unequal-16d24.png b/icons/unequal-16d24.png
new file mode 100644 (file)
index 0000000..dc3ee89
Binary files /dev/null and b/icons/unequal-16d24.png differ
diff --git a/icons/unequal-16d4.png b/icons/unequal-16d4.png
new file mode 100644 (file)
index 0000000..be6eb44
Binary files /dev/null and b/icons/unequal-16d4.png differ
diff --git a/icons/unequal-16d8.png b/icons/unequal-16d8.png
new file mode 100644 (file)
index 0000000..8b63b11
Binary files /dev/null and b/icons/unequal-16d8.png differ
diff --git a/icons/unequal-32d24.png b/icons/unequal-32d24.png
new file mode 100644 (file)
index 0000000..a27b73d
Binary files /dev/null and b/icons/unequal-32d24.png differ
diff --git a/icons/unequal-32d4.png b/icons/unequal-32d4.png
new file mode 100644 (file)
index 0000000..ec1ee50
Binary files /dev/null and b/icons/unequal-32d4.png differ
diff --git a/icons/unequal-32d8.png b/icons/unequal-32d8.png
new file mode 100644 (file)
index 0000000..867b23a
Binary files /dev/null and b/icons/unequal-32d8.png differ
diff --git a/icons/unequal-48d24.png b/icons/unequal-48d24.png
new file mode 100644 (file)
index 0000000..0cfb26c
Binary files /dev/null and b/icons/unequal-48d24.png differ
diff --git a/icons/unequal-48d4.png b/icons/unequal-48d4.png
new file mode 100644 (file)
index 0000000..4004ea8
Binary files /dev/null and b/icons/unequal-48d4.png differ
diff --git a/icons/unequal-48d8.png b/icons/unequal-48d8.png
new file mode 100644 (file)
index 0000000..5377f9c
Binary files /dev/null and b/icons/unequal-48d8.png differ
diff --git a/icons/unequal-base.png b/icons/unequal-base.png
new file mode 100644 (file)
index 0000000..9dd11a4
Binary files /dev/null and b/icons/unequal-base.png differ
diff --git a/icons/unequal-ibase.png b/icons/unequal-ibase.png
new file mode 100644 (file)
index 0000000..161d9a4
Binary files /dev/null and b/icons/unequal-ibase.png differ
diff --git a/icons/unequal-ibase4.png b/icons/unequal-ibase4.png
new file mode 100644 (file)
index 0000000..79f823e
Binary files /dev/null and b/icons/unequal-ibase4.png differ
diff --git a/icons/unequal-icon.c b/icons/unequal-icon.c
new file mode 100644 (file)
index 0000000..29846a6
--- /dev/null
@@ -0,0 +1,733 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 253 2 ",
+"   c LightGray",
+".  c #CACACA",
+"X  c #CBCBCB",
+"o  c #CBCBCB",
+"O  c #CBCBCB",
+"+  c #CACACA",
+"@  c #D0D0D0",
+"#  c #D5D5D5",
+"$  c #D5D5D5",
+"%  c #CECECE",
+"&  c #CACACA",
+"*  c #D1CDD1",
+"=  c #CFCCCF",
+"-  c #CACACA",
+";  c #CCCBCC",
+":  c gray83",
+">  c #C6C6C6",
+",  c #CECECE",
+"<  c gray80",
+"1  c #CDCDCD",
+"2  c #CBCBCB",
+"3  c gray76",
+"4  c gainsboro",
+"5  c #D7D7D7",
+"6  c #C1C1C1",
+"7  c #CFCECF",
+"8  c #B6C3B6",
+"9  c #BBC5BB",
+"0  c #D0CFD0",
+"q  c #C3C3C3",
+"w  c gray81",
+"e  c #CBCBCB",
+"r  c #CECECE",
+"t  c gray85",
+"y  c #D7D7D7",
+"u  c #D7D7D7",
+"i  c gray84",
+"p  c #C6C6C6",
+"a  c gray52",
+"s  c #C8C8C8",
+"d  c #CBCCCB",
+"f  c #DFDADF",
+"g  c #6AAB6A",
+"h  c #499D49",
+"j  c #E5DEE5",
+"k  c #C9CAC9",
+"l  c #CECECE",
+"z  c #CBCBCB",
+"x  c gray80",
+"c  c gray83",
+"v  c #D5D5D5",
+"b  c #D2D2D2",
+"n  c #CDCDCD",
+"m  c #BBBBBB",
+"M  c #626262",
+"N  c #C6C7C6",
+"B  c #DFD9DF",
+"V  c #BCCABC",
+"C  c #539F53",
+"Z  c #E8DEE8",
+"A  c #C6C8C6",
+"S  c #CFCECF",
+"D  c #CBCBCB",
+"F  c #CDCDCD",
+"G  c #D7D7D7",
+"H  c #D5D5D5",
+"J  c #D5D5D5",
+"K  c LightGray",
+"L  c gray80",
+"P  c #909090",
+"I  c #8D8D8D",
+"U  c #CBCBCB",
+"Y  c #DDD9DD",
+"T  c #75AE75",
+"R  c #208C20",
+"E  c #BACCBA",
+"W  c #CFCCCF",
+"Q  c #CDCECD",
+"!  c #CACACA",
+"~  c #CBCBCB",
+"^  c gray84",
+"/  c gray83",
+"(  c gray83",
+")  c LightGray",
+"_  c #C1C1C1",
+"`  c gray69",
+"'  c #DADADA",
+"]  c #C5C5C5",
+"[  c #D5D5D5",
+"{  c #B6C8B6",
+"}  c #ADC4AD",
+"|  c #C6CFC6",
+" . c #CBC9CB",
+".. c #CDCECD",
+"X. c gray81",
+"o. c gray77",
+"O. c gray78",
+"+. c #C6C6C6",
+"@. c gray78",
+"#. c #C5C5C5",
+"$. c gray79",
+"%. c gray87",
+"&. c gray83",
+"*. c #C6C6C6",
+"=. c #C5C6C5",
+"-. c #CDC9CD",
+";. c #CFCACF",
+":. c #CAC8CA",
+">. c gray77",
+",. c #D2D2D2",
+"<. c gray84",
+"1. c #D7D7D7",
+"2. c gray84",
+"3. c gray84",
+"4. c gray84",
+"5. c gray84",
+"6. c gray84",
+"7. c LightGray",
+"8. c #D7D7D7",
+"9. c gray84",
+"0. c #D5D6D5",
+"q. c #D5D6D5",
+"w. c gray84",
+"e. c #D7D7D7",
+"r. c #D5D5D5",
+"t. c #D5D5D5",
+"y. c gray83",
+"u. c LightGray",
+"i. c #D1D2D1",
+"p. c LightGray",
+"a. c gray83",
+"s. c #D5D5D5",
+"d. c #D5D5D5",
+"f. c #D5D5D5",
+"g. c #D5D5D5",
+"h. c LightGray",
+"j. c LightGray",
+"k. c #D0D0D0",
+"l. c LightGray",
+"z. c gray83",
+"x. c #D5D5D5",
+"c. c #CECECE",
+"v. c gray76",
+"b. c #CAC8CA",
+"n. c #D4CCD4",
+"m. c #CAC8CA",
+"M. c gray77",
+"N. c #C6C6C6",
+"B. c #D7D7D7",
+"V. c #D5D5D5",
+"C. c gray77",
+"Z. c #C5C5C5",
+"A. c gray79",
+"S. c #D5D5D5",
+"D. c #C8C8C8",
+"F. c gray76",
+"G. c gray82",
+"H. c gray79",
+"J. c #D2CFD2",
+"K. c #C2CFC2",
+"L. c #55A255",
+"P. c #B4C8B4",
+"I. c #DCD8DC",
+"U. c #C4C5C4",
+"Y. c gray84",
+"T. c LightGray",
+"R. c gray77",
+"E. c gray87",
+"W. c gray77",
+"Q. c #585858",
+"!. c gray80",
+"~. c #CDCDCD",
+"^. c #CDCDCD",
+"/. c #CACBCA",
+"(. c #CBCCCB",
+"). c #DFDADF",
+"_. c #539E53",
+"`. c #9ABC9A",
+"'. c #E2DAE2",
+"]. c #C4C5C4",
+"[. c gray84",
+"{. c LightGray",
+"}. c #C6C6C6",
+"|. c #747474",
+" X c gray17",
+".X c #C0C0C0",
+"XX c gray81",
+"oX c #CDCDCD",
+"OX c #CACACA",
+"+X c #CBCCCB",
+"@X c #DFDADF",
+"#X c #509C50",
+"$X c #7EB07E",
+"%X c #DED8DE",
+"&X c #C4C5C4",
+"*X c gray84",
+"=X c #D2D2D2",
+"-X c gray80",
+";X c #BBBBBB",
+":X c #444444",
+">X c #1E1E1E",
+",X c #909090",
+"<X c #D5D5D5",
+"1X c gray80",
+"2X c #C9CAC9",
+"3X c #D3D0D3",
+"4X c #C2D0C2",
+"5X c #62A862",
+"6X c #78B178",
+"7X c #D4D5D4",
+"8X c gray78",
+"9X c gray84",
+"0X c LightGray",
+"qX c gray78",
+"wX c #D8D8D8",
+"eX c #D0D0D0",
+"rX c gray51",
+"tX c gray77",
+"yX c gray81",
+"uX c #CDCDCD",
+"iX c #CCCBCC",
+"pX c #C3C3C3",
+"aX c #CDCCCD",
+"sX c #D8CFD8",
+"dX c #D6CFD6",
+"fX c #C8C8C8",
+"gX c gray77",
+"hX c #D7D7D7",
+"jX c gray83",
+"kX c gray76",
+"lX c #CACACA",
+"zX c gray80",
+"xX c #D5D5D5",
+"cX c #CECECE",
+"vX c gray76",
+"bX c #D0D0D0",
+"nX c gray83",
+"mX c gray81",
+"MX c #CECECE",
+"NX c #CBCDCB",
+"BX c #CCCDCC",
+"VX c #CECECE",
+"CX c #D2D2D2",
+"ZX c #D5D5D5",
+"AX c #D5D5D5",
+"SX c gray82",
+"DX c #CECECE",
+"FX c #CECECE",
+"GX c gray80",
+"HX c #CDCDCD",
+"JX c #D0D0D0",
+"KX c #D5D5D5",
+"LX c white",
+/* pixels */
+"  . X o O + @ # $ % & * = - ; : ",
+". > , < 1 2 3 4 5 6 7 8 9 0 q w ",
+"e r t y u i p a s d f g h j k l ",
+"z x y c v b n m M N B V C Z A S ",
+"D F G H J K L P I U Y T R E W Q ",
+"! ~ ^ / ( ) _ ` ' ] [ { } |  ...",
+"X.o.O.+.@.#.$.%.&.*.=.-.;.:.>.,.",
+"<.1.2.3.4.5.6.7.v 8.9.0.q.w.e.r.",
+"t.y.u.i.p.a.s.d.f.g.h.j.k.l.z.x.",
+"c.v.b.n.m.M.N.B.V.C.Z.A.S.D.F.G.",
+"H.J.K.L.P.I.U.Y.T.R.E.W.Q.!.~.^.",
+"/.(.)._.`.'.].[.{.}.1.|. X.XXXoX",
+"OX+X@X#X$X%X&X*X=X-X;X:X>X,X<X1X",
+"2X3X4X5X6X7X8X9X0XqXwXeXrXtXyXuX",
+"iXpXaXsXdXfXgXhXjXkXlXzXxXcXvXbX",
+"nXmXMXNXBXVXCXZXAXSXDXFXGXHXJXKX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 191 2 ",
+"   c black",
+".  c #070707",
+"X  c gray3",
+"o  c #111111",
+"O  c #191919",
+"+  c #1E1E1E",
+"@  c #232323",
+"#  c #252525",
+"$  c #2A2A2A",
+"%  c #2C2C2C",
+"&  c #323232",
+"*  c #343434",
+"=  c #007600",
+"-  c #007900",
+";  c #007A00",
+":  c #007D00",
+">  c #007E00",
+",  c #007F00",
+"<  c #017F01",
+"1  c #047E04",
+"2  c #484848",
+"3  c gray32",
+"4  c #646464",
+"5  c #6F6F6F",
+"6  c #717171",
+"7  c #797979",
+"8  c gray48",
+"9  c #078107",
+"0  c #088208",
+"q  c #0A830A",
+"w  c #2D912D",
+"e  c #469B46",
+"r  c #61A661",
+"t  c #67A867",
+"y  c #69A969",
+"u  c #6FAC6F",
+"i  c #72AB72",
+"p  c #71AD71",
+"a  c #74AE74",
+"s  c #79B079",
+"d  c #7DB27D",
+"f  c #838383",
+"g  c gray52",
+"h  c gray54",
+"j  c gray57",
+"k  c gray60",
+"l  c #87B687",
+"z  c #8CB78C",
+"x  c #8CB88C",
+"c  c #8EB98E",
+"v  c #94BB94",
+"b  c #9BBF9B",
+"n  c #A0A0A0",
+"m  c gray64",
+"M  c gray66",
+"N  c #AAAAAA",
+"B  c #AEAEAE",
+"V  c #AFAFAF",
+"C  c #A0BFA0",
+"Z  c gray69",
+"A  c #B1B1B1",
+"S  c #B2B2B2",
+"D  c gray70",
+"F  c #B4B4B4",
+"G  c #B7B7B7",
+"H  c gray72",
+"J  c #B8B9B8",
+"K  c #B9B9B9",
+"L  c #B9BBB9",
+"P  c gray73",
+"I  c #BABBBA",
+"U  c #BBBBBB",
+"Y  c #BABCBA",
+"T  c #BBBCBB",
+"R  c #BCBCBC",
+"E  c #BCBDBC",
+"W  c gray74",
+"Q  c gray",
+"!  c gray75",
+"~  c #A1C0A1",
+"^  c #AAC3AA",
+"/  c #A9C4A9",
+"(  c #AAC4AA",
+")  c #ABC6AB",
+"_  c #AFC5AF",
+"`  c #B2C7B2",
+"'  c #B5C8B5",
+"]  c #B5CAB5",
+"[  c #B6C9B6",
+"{  c #BFC0BF",
+"}  c #B8C9B8",
+"|  c #BACABA",
+" . c #BDCBBD",
+".. c #BECBBE",
+"X. c #BFCEBF",
+"o. c #C0C0C0",
+"O. c #C1C1C1",
+"+. c gray76",
+"@. c gray77",
+"#. c #C5C5C5",
+"$. c #C6C6C6",
+"%. c gray78",
+"&. c #C6CFC6",
+"*. c #C8C6C8",
+"=. c #C8C8C8",
+"-. c gray79",
+";. c #CACACA",
+":. c #CBCBCB",
+">. c #C9CFC9",
+",. c #CCC8CC",
+"<. c #CCCBCC",
+"1. c #CEC9CE",
+"2. c gray80",
+"3. c #CDCDCD",
+"4. c #CECECE",
+"5. c gray81",
+"6. c #C8D0C8",
+"7. c #C9D0C9",
+"8. c #CDD2CD",
+"9. c #CED2CE",
+"0. c #CED4CE",
+"q. c #D0CDD0",
+"w. c #D4CED4",
+"e. c #D0D0D0",
+"r. c gray82",
+"t. c #D0D2D0",
+"y. c #D0D3D0",
+"u. c #D1D2D1",
+"i. c #D1D3D1",
+"p. c #D2D2D2",
+"a. c #D2D3D2",
+"s. c LightGray",
+"d. c #D0D5D0",
+"f. c #D2D4D2",
+"g. c #D3D4D3",
+"h. c #D7D0D7",
+"j. c gray83",
+"k. c #D5D4D5",
+"l. c #D5D5D5",
+"z. c #D5D6D5",
+"x. c #D5D7D5",
+"c. c #D6D4D6",
+"v. c #D6D5D6",
+"b. c #D7D5D7",
+"n. c gray84",
+"m. c #D6D7D6",
+"M. c #D7D7D7",
+"N. c #D7D8D7",
+"B. c #D8D6D8",
+"V. c #D8D7D8",
+"C. c #D8D8D8",
+"Z. c #D8D9D8",
+"A. c #D9D8D9",
+"S. c gray85",
+"D. c #DBD9DB",
+"F. c #DADADA",
+"G. c gray86",
+"H. c #DCD8DC",
+"J. c #DCD9DC",
+"K. c #DDD8DD",
+"L. c #DCDADC",
+"P. c #DFD8DF",
+"I. c #DEDBDE",
+"U. c #DFDBDF",
+"Y. c gainsboro",
+"T. c #DDDDDD",
+"R. c gray87",
+"E. c #DFDFDF",
+"W. c #E1D9E1",
+"Q. c #E1DAE1",
+"!. c #E2DAE2",
+"~. c #E3DBE3",
+"^. c #E0DCE0",
+"/. c #E2DDE2",
+"(. c #E3DDE3",
+"). c #E4DBE4",
+"_. c #E5DBE5",
+"`. c #E5DCE5",
+"'. c #E5DEE5",
+"]. c #EBDEEB",
+"[. c gray88",
+"{. c #E2E2E2",
+"}. c gray89",
+"|. c #E4E4E4",
+" X c #E6E6E6",
+".X c #E7E7E7",
+"XX c gray91",
+"oX c #E9E9E9",
+"OX c gray92",
+"+X c gray93",
+"@X c #F4F4F4",
+/* pixels */
+"l.l.G.G.G.G.G.G.G.G.G.G.G.r.l.l.l.l.G.G.G.G.G.G.G.G.G.G.G.G.f.l.",
+"l.r.o.o.o.o.o.! o.o.! ! o.l.l.l.l.l.2.! o.o.! ! ! ! o.o.{ @.l.l.",
+"G.o.G -.#.#.#.#.#.#.#.-.D -.l.r.r.G.U U -.#.*.*.,.#.#.#.=.Z 2.G.",
+"G.o.-.Y.G.l.G.G.G.G.l.G.! -.XXG.r.G.! 2.Y.l.G.X.] 0.P.N.Y.! 2.l.",
+"G.o.#.l.r.r.l.l.l.l.r.G.! -.f U Y.G.! -.l.P.t 9 - z ~.r.G.G 2.G.",
+"G.o.#.G.l.l.l.l.l.l.l.G.U r.f + ! }.U 2.l.l.| v - x ~.f.N.U 2.l.",
+"G.o.#.G.l.l.l.l.l.l.l.l.! #.@Xh @ o.o.-.G.f.~.] - x ~.r.G.U 2.G.",
+"G.o.#.G.r.l.l.l.l.l.r.G.! -.r.@X4 & #.-.l.l.P.` - x _.f.l.U 2.l.",
+"G.o.#.G.r.l.l.l.l.l.l.G.U #.+Xk @ D o.-.N.r.B./ - x H.r.G.U 2.l.",
+"G.! o.G.l.l.l.l.l.l.r.G.! r.k O M XXY -.l.~.y , , , e H.l.U 2.N.",
+"G.o.#.G.r.l.l.r.r.r.r.G.U 2.6 M }.l.U -.N.l.| ~ ^ ~ _ k.l.U 9.B.",
+"G.! -.Y.G.l.G.G.G.G.G.Y.! -. XY.r.G.! 2.G.G.Y.`.`.`./.G.Y.! 2.B.",
+"G.o.D o.! U ! ! ! ! U ! B 2.l.l.k.G.U D o.! ! U Y Y U ! ! B r.l.",
+"l.r.-.-.-.-.-.-.-.-.-.-.2.l.l.l.l.l.r.-.-.-.-.-.-.-.-.-.-.2.l.l.",
+"l.l.G.l.G.l.G.l.l.G.l.G.l.l.l.l.l.l.l.G.G.l.l.G.G.G.G.l.l.G.l.l.",
+"l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.l.r.l.l.l.l.l.l.",
+"l.l.l.r.l.l.k.k.l.f.l.f.l.l.l.l.l.l.l.l.r.l.l.r.r.l.l.l.r.r.l.l.",
+"l.l.G.G.G.l.G.B.G.B.G.B.G.l.l.l.l.l.l.G.G.l.G.G.G.G.l.G.G.G.l.l.",
+"l.2.U R U U U U U U ! ! Y r.l.l.l.l.-.U ! ! U ! U U U ! U ! l.l.",
+"G.o.! 2.-.-.w.k.q.-.-.2.G -.l.l.l.G.U o.2.-.-.-.r.l.-.-.2.G 2.N.",
+"G.o.-.G.B.f./ b X.G.l.P.! -.l.l.l.G.! 2.G.l.l.Y.D k r.G.G.U 2.G.",
+"G.o.#.l.~.s q - i _.9.G.! -.G.l.l.l.! -.l.r.}.m   . ! l.l.U 2.l.",
+"G.o.#.G.l.7.' , p `.f.N.U -.B.l.l.G.U -.G.l.2.% & . ! G.l.U 2.G.",
+"G.o.o.G.r.H.&., u _.9.G.! -.G.l.r.G.U -.l.}.3 5 j   2.G.G.U 2.l.",
+"G.o.#.G.r.G.>., a ].r.G.Y -.G.f.l.l.! -.Y.D . 8 2   8 l.G.U 2.l.",
+"G.o.@.G.l.9./ - r 9.r.G.! -.B.l.l.G.U -.Y.D $ # o   & 2.G.H 2.l.",
+"G.o.#.N.~.d , 0 , w l.G.Y -.B.l.r.G.U -.G.l.l.XX8   #.G.l.U r.G.",
+"G.o.#.N.k.>.|  .| X.r.l.! -.G.f.r.G.! -.l.k.l.l.-.U r.l.B.U 2.l.",
+"G.{ -.Y.l.G.P.P.P.Y.N.Y.! -.G.l.l.l.Y 2.G.l.G.l.Y.Y.G.G.Y.U 2.N.",
+"G.@.Z ! U U J J U U U U B 2.l.l.l.G.! D U U U G U G H U U Z r.l.",
+"r.l.2.2.2.2.2.9.2.2.2.2.r.l.l.l.l.l.l.q.2.r.2.2.2.2.2.2.9.r.l.l.",
+"l.l.G.l.G.l.G.l.G.l.G.N.l.l.l.l.l.l.l.N.l.l.G.G.l.G.N.B.B.l.l.l."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 166 2 ",
+"   c black",
+".  c #020202",
+"X  c gray1",
+"o  c gray4",
+"O  c #101010",
+"+  c gray9",
+"@  c gray11",
+"#  c #1D1D1D",
+"$  c #1E1E1E",
+"%  c gray14",
+"&  c #252525",
+"*  c gray15",
+"=  c #2D2D2D",
+"-  c gray18",
+";  c #323232",
+":  c #007200",
+">  c #007300",
+",  c #007500",
+"<  c #007700",
+"1  c #007800",
+"2  c #007900",
+"3  c #007E00",
+"4  c #494949",
+"5  c #4B4B4B",
+"6  c #4C4C4C",
+"7  c gray30",
+"8  c #5D5D5D",
+"9  c gray37",
+"0  c #5F5F5F",
+"q  c #606060",
+"w  c #626262",
+"e  c gray39",
+"r  c #656565",
+"t  c #676767",
+"y  c #6A6A6A",
+"u  c gray42",
+"i  c #6D6D6D",
+"p  c gray43",
+"a  c #717171",
+"s  c #747474",
+"d  c gray46",
+"f  c gray50",
+"g  c #098209",
+"h  c #098309",
+"j  c #0D840D",
+"k  c #1C8B1C",
+"l  c #248D24",
+"z  c #278F27",
+"x  c #288E28",
+"c  c #298F29",
+"v  c #4B9D4B",
+"b  c #4B9E4B",
+"n  c #52A052",
+"m  c #59A259",
+"M  c #5AA45A",
+"N  c #5BA45B",
+"B  c #60A660",
+"V  c #61A661",
+"C  c #66A866",
+"Z  c #67A967",
+"A  c #68A968",
+"S  c #69A969",
+"D  c #6BAA6B",
+"F  c #6EAB6E",
+"G  c #7FB27F",
+"H  c #808080",
+"J  c gray51",
+"K  c #838383",
+"L  c #868686",
+"P  c gray53",
+"I  c gray54",
+"U  c #909090",
+"Y  c gray59",
+"T  c gray61",
+"R  c #9F9F9F",
+"E  c #86B586",
+"W  c #8EB88E",
+"Q  c #A0A0A0",
+"!  c #A4A4A4",
+"~  c #A7A7A7",
+"^  c gray68",
+"/  c #AEAEAE",
+"(  c #AEAFAE",
+")  c #AFAFAF",
+"_  c #B1B1B1",
+"`  c gray74",
+"'  c gray",
+"]  c #C1C1C1",
+"[  c gray76",
+"{  c #C6C6C6",
+"}  c gray78",
+"|  c #C7CFC7",
+" . c #C8C8C8",
+".. c gray79",
+"X. c #CACACA",
+"o. c #CBCBCB",
+"O. c gray80",
+"+. c #CDCDCD",
+"@. c #CECECE",
+"#. c gray81",
+"$. c #C9D0C9",
+"%. c #CAD0CA",
+"&. c #CBD1CB",
+"*. c #CCD2CC",
+"=. c #CED1CE",
+"-. c #CFD3CF",
+";. c #D0D0D0",
+":. c gray82",
+">. c #D0D2D0",
+",. c #D0D3D0",
+"<. c #D1D3D1",
+"1. c #D2D2D2",
+"2. c #D3D2D3",
+"3. c LightGray",
+"4. c #D1D4D1",
+"5. c #D2D4D2",
+"6. c #D3D4D3",
+"7. c gray83",
+"8. c #D4D5D4",
+"9. c #D5D4D5",
+"0. c #D5D5D5",
+"q. c #D6D4D6",
+"w. c #D6D5D6",
+"e. c #D7D5D7",
+"r. c gray84",
+"t. c #D7D6D7",
+"y. c #D7D7D7",
+"u. c #D9D7D9",
+"i. c #DBD6DB",
+"p. c #D8D8D8",
+"a. c gray85",
+"s. c #D9DAD9",
+"d. c #DBD8DB",
+"f. c #DADADA",
+"g. c #DADBDA",
+"h. c gray86",
+"j. c #DCD8DC",
+"k. c #DDD8DD",
+"l. c #DCDBDC",
+"z. c #DED9DE",
+"x. c #DFD9DF",
+"c. c gainsboro",
+"v. c #DDDDDD",
+"b. c #DEDCDE",
+"n. c gray87",
+"m. c #DFDFDF",
+"M. c #E0D9E0",
+"N. c #E1DAE1",
+"B. c #E2DAE2",
+"V. c #E4DBE4",
+"C. c #E5DBE5",
+"Z. c #E5DCE5",
+"A. c #EDDFED",
+"S. c gray88",
+"D. c #E1E1E1",
+"F. c #E2E2E2",
+"G. c gray89",
+"H. c #E4E4E4",
+"J. c gray90",
+"K. c gray91",
+"L. c #E9E9E9",
+"P. c #EAEAEA",
+"I. c gray92",
+"U. c #F1E1F1",
+"Y. c gray95",
+"T. c white",
+/* pixels */
+"0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.",
+"0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.r.r.0.0.0.0.r.r.0.0.0.0.0.0.0.0.",
+"0.0.0.0.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.0.0.0.0.0.0.0.0.0.p.p.p.p.r.p.p.r.r.r.p.r.p.p.r.r.0.0.0.0.",
+"0.0.0.0.@.............................@.0.0.0.0.0.0.0.0.@.........X.X.X.X.X.X.X...X...=.0.0.0.0.",
+"0.0.p.;.R _ ) ) _ _ ) ) ) ) ) _ _ _ _ R @.0.0.0.0.0.p.;.Q _ _ ) ) ) ) ) ) _ ) _ ) ) _ R @.r.0.0.",
+"0.0.p..._ D.p.p.p.v.p.v.p.v.p.v.p.p.D._ ..p.0.0.0.0.p..._ D.p.p.v.p.p.N.v.v.p.p.v.p.D._ ..p.0.0.",
+"0.0.p..._ p.0.0.;.0.0.0.0.0.0.;.0.;.p.) ..v.p.;.0.0.p..._ p.0.0.5.u.0.X.| =.0.0.0.;.p.) ..p.0.0.",
+"0.0.0..._ p.0.0.0.0.0.0.0.0.0.0.0.0.v._ @.....v.;.0.0...) v.0.;.p.E k j 3 D N.5.0.5.v._ ..p.0.0.",
+"0.0.p...) p.0.0.0.0.0.0.0.0.0.0.0.0.p.) 0.Q   J J.;.p..._ v.0.5.l.n z x , Z V.5.0.;.g.) ..p.0.0.",
+"0.0.p..._ v.0.0.0.0.0.0.0.0.0.0.0.;.v.) ..D.L   L J.0...) p.0.0.0.-.V.V : D Z.5.0.0.v.) ..p.0.0.",
+"0.0.p...) p.0.0.0.0.0.0.0.0.0.0.0.0.v.) ..0.J.L   J L..._ v.;.0.0.0.N.M : C V.5.0.0.v.) ..p.0.0.",
+"0.0.p..._ p.0.0.0.0.0.0.0.0.0.0.0.0.p._ ..p.;.J.L   f @.) p.0.0.0.5.N.M : D V.;.0.0.p._ ..p.0.0.",
+"0.0.p...) p.0.0.0.0.0.0.0.0.0.0.0.;.v._ ..r.5.p.;.+ ; @.) p.0.0.0.;.N.M , D N.;.0.5.p._ ..p.0.0.",
+"0.0.p..._ v.0.0.0.0.0.0.0.0.0.0.0.0.p.) X.r.g.=.* * @.@.) p.0.0.0.u.U.N : F U.0.0.0.l.) ..p.0.0.",
+"0.0.p...) v.0.0.0.0.0.0.0.0.0.0.0.0.v.) } N.;.* * @.v...) v.0.5.p.E b z 2 x b W N.5.p._ ..p.0.0.",
+"0.0.p...) p.;.0.0.0.0.0.0.0.0.0.0.0.p.) @.] @ * @.p.0...) p.0.5.N.m , h j h 2 Z Z.;.p._ ..p.0.0.",
+"0.0.p..._ v.0.0.0.0.0.0.0.0.0.0.0.0.p.) ;.~ q ..v.;.p..._ p.0.0.0.;.=.=.&.&.=.;.0.0.v.) ..p.0.0.",
+"0.0.p...) p.;.0.0.;.0.0.;.0.0.0.0.;.p._ ..D.L.p.0.0.p..._ p.;.0.0.0.0.0.0.0.u.0.5.;.p.) ..p.0.0.",
+"0.0.p..._ D.p.p.v.p.p.v.v.p.p.v.v.p.D._ ..0.;.0.0.0.p..._ D.p.v.p.v.p.p.p.p.p.p.v.p.D._ ..p.0.0.",
+"0.0.0.@.R _ _ _ ) _ ) ) _ _ ) ) ) ) _ R @.p.0.0.0.0.0.@.R _ ) _ ) _ _ _ _ _ _ _ ) ) _ Q @.p.0.0.",
+"0.0.0.0.@.............................@.0.0.0.0.0.0.0.0.@.............................@.0.0.0.0.",
+"0.0.0.0.0.p.p.p.p.p.p.p.p.p.p.p.p.p.p.0.0.0.0.0.0.0.0.0.0.p.p.p.p.p.p.p.p.p.p.p.p.p.p.r.0.0.0.0.",
+"0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.",
+"0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.",
+"0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.",
+"0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.",
+"0.0.0.0.0.p.p.p.p.p.p.p.p.p.p.p.p.p.p.0.0.0.0.0.0.0.0.0.0.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.0.0.0.0.",
+"0.0.0.0.@...@.........................@.0.0.0.0.0.0.0.0.@...@.........................@.0.0.0.0.",
+"0.0.p.@.Q _ ) ) ) ) ) _ ) _ ) _ _ ) _ R ;.p.0.0.0.0.0.@.Q _ ) ) _ ) ) _ ) ) ) ) _ _ _ Q @.0.0.0.",
+"0.0.p..._ D.p.p.v.p.p.v.v.v.p.p.v.p.D._ ..p.0.0.0.0.p..._ D.p.p.v.p.p.p.v.v.v.p.p.p.D._ ..p.0.0.",
+"0.0.p..._ p.0.0.5.u.0.X.| =.0.0.0.;.p._ ..p.0.0.0.0.p..._ p.0.0.0.0.0.0...} @.0.0.;.p._ ..p.0.0.",
+"0.0.p...) p.0.0.p.E k j 3 D Z.5.0.0.p.) ..p.0.0.0.0.p..._ p.0.0.0.;.D.Y o   y D.0.0.p.) ..p.0.0.",
+"0.0.p..._ p.0.5.l.n z x , C V.;.0.0.v.) ..p.0.0.0.0.p...) p.0.0.0.p.} $     q D.;.0.v._ ..p.0.0.",
+"0.0.p..._ p.0.0.0.;.Z.V : D Z.5.0.;.p._ ..p.0.0.0.0.p..._ v.0.0.;.D.4 $ 6   t D.;.0.p.) ..p.0.0.",
+"0.0.p...) l.0.0.0.0.N.M : Z Z.5.0.0.p.) ..p.0.0.0.0.p...) p.0.0.J.U   R y   q v.0.0.v.) ..p.0.0.",
+"0.0.p..._ p.5.0.0.5.N.M : D N.5.0.0.v.) ..p.0.0.0.0.p...) v.;.p.] o 8 T.t   p Y.;.0.p._ ..p.0.0.",
+"0.0.p...) p.0.0.u.;.l.M : Z N.5.0.0.p.) ..p.0.0.0.0.p...) l.;.J.d   0 d -   - I 0.0.p.) ..p.0.0.",
+"0.0.p..._ v.0.0.0.u.A.N : F U.0.0.0.v.) ..p.0.0.0.0.p..._ p.;.J.a   X     X   - 0.0.p.) ..p.0.0.",
+"0.0.p...) v.0.5.j.E b z 2 c b W l.5.p.) ..p.0.0.0.0.p..._ v.;.p.' R ! _ 6   6 ' ;.0.v.) ..p.0.0.",
+"0.0.p...) p.0.;.N.m 2 h j h , Z Z.;.v._ ..p.0.0.0.0.p...) p.0.0.p.D.p.I.y   p L.;.0.p.) ..p.0.0.",
+"0.0.p..._ v.0.0.0.;.=.&.&.=.&.;.0.0.p._ ..p.0.0.0.0.p..._ v.0.0.0.;.0.;.@...@.0.0.0.v.) ..p.0.0.",
+"0.0.p...) p.;.0.0.0.0.u.0.0.0.0.0.0.p._ ..p.0.0.0.0.p...) p.;.0.0.0.0.0.0.0.0.0.0.;.p.) ..p.0.0.",
+"0.0.p..._ D.p.p.p.p.l.p.p.p.p.v.p.p.D._ ..r.0.0.0.0.p..._ D.p.p.p.v.p.v.p.p.p.v.v.p.D._ ..p.0.0.",
+"0.0.0.@.R _ ) _ _ ) _ ) _ ) ) _ ) ) _ R @.u.0.0.0.0.0.@.R _ _ _ ) _ ) ) _ _ ) _ _ ) _ R @.0.0.0.",
+"0.0.0.0.@.........................@...@.0.0.0.0.0.0.0.0.@.............................@.0.0.0.0.",
+"0.0.0.0.p.p.p.p.p.p.p.p.p.p.p.p.p.p.r.p.0.0.0.0.0.0.0.0.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.p.0.0.0.0.",
+"0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.",
+"0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/unequal-web.png b/icons/unequal-web.png
new file mode 100644 (file)
index 0000000..3d7c814
Binary files /dev/null and b/icons/unequal-web.png differ
diff --git a/icons/unequal.ico b/icons/unequal.ico
new file mode 100644 (file)
index 0000000..8af7618
Binary files /dev/null and b/icons/unequal.ico differ
diff --git a/icons/unequal.rc b/icons/unequal.rc
new file mode 100644 (file)
index 0000000..eec3d45
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "unequal.ico"
diff --git a/icons/unruly-16d24.png b/icons/unruly-16d24.png
new file mode 100644 (file)
index 0000000..287ff81
Binary files /dev/null and b/icons/unruly-16d24.png differ
diff --git a/icons/unruly-16d4.png b/icons/unruly-16d4.png
new file mode 100644 (file)
index 0000000..2a527bc
Binary files /dev/null and b/icons/unruly-16d4.png differ
diff --git a/icons/unruly-16d8.png b/icons/unruly-16d8.png
new file mode 100644 (file)
index 0000000..287ff81
Binary files /dev/null and b/icons/unruly-16d8.png differ
diff --git a/icons/unruly-32d24.png b/icons/unruly-32d24.png
new file mode 100644 (file)
index 0000000..e18bda0
Binary files /dev/null and b/icons/unruly-32d24.png differ
diff --git a/icons/unruly-32d4.png b/icons/unruly-32d4.png
new file mode 100644 (file)
index 0000000..bce6536
Binary files /dev/null and b/icons/unruly-32d4.png differ
diff --git a/icons/unruly-32d8.png b/icons/unruly-32d8.png
new file mode 100644 (file)
index 0000000..e18bda0
Binary files /dev/null and b/icons/unruly-32d8.png differ
diff --git a/icons/unruly-48d24.png b/icons/unruly-48d24.png
new file mode 100644 (file)
index 0000000..3fc174a
Binary files /dev/null and b/icons/unruly-48d24.png differ
diff --git a/icons/unruly-48d4.png b/icons/unruly-48d4.png
new file mode 100644 (file)
index 0000000..61e8bf2
Binary files /dev/null and b/icons/unruly-48d4.png differ
diff --git a/icons/unruly-48d8.png b/icons/unruly-48d8.png
new file mode 100644 (file)
index 0000000..3fc174a
Binary files /dev/null and b/icons/unruly-48d8.png differ
diff --git a/icons/unruly-base.png b/icons/unruly-base.png
new file mode 100644 (file)
index 0000000..05bb433
Binary files /dev/null and b/icons/unruly-base.png differ
diff --git a/icons/unruly-ibase.png b/icons/unruly-ibase.png
new file mode 100644 (file)
index 0000000..05bb433
Binary files /dev/null and b/icons/unruly-ibase.png differ
diff --git a/icons/unruly-ibase4.png b/icons/unruly-ibase4.png
new file mode 100644 (file)
index 0000000..a20d796
Binary files /dev/null and b/icons/unruly-ibase4.png differ
diff --git a/icons/unruly-icon.c b/icons/unruly-icon.c
new file mode 100644 (file)
index 0000000..c4e6492
--- /dev/null
@@ -0,0 +1,891 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"kXiXuXyXrXtXtXtXwXwXyXiXtXwXrXkX",
+"iX[ G &.s.r.p.s.}.;X&.M w.,X'.rX",
+"uXC 5 { c.t.9.r.eXNXO.7 8.cX=XqX",
+"tXf.l.>.~ ;.!.K.8.q.E f 7.rX}.wX",
+"wX-XAXq.- { VX0Xc a z q 9.BX;XwX",
+"wX}.eXl.) 1.E.S.D m _ } 0.!.F.rX",
+"wX&XrX3XvXE.w l b d E.SXj.5 H uX",
+"wX|.1X@X9XH.v S D m G.pXd.h Q uX",
+"uXQ v +.h.e.w.t.@X1Xb.u.r.q.r.tX",
+"uXP a X.l.r.w.y.6XdXM.w.t.i.p.tX",
+"uXT v L L #.XX/.n.m.u.r.q.e.t.tX",
+"uXS u l e | VXtXu.w.r.p.t.i.p.tX",
+"tX0.8.$./ @.l.d.r.t.q.t.q.e.y.tX",
+"wX:XNXE.d.;.9 g q.i.e.i.e.u.u.rX",
+"rX`.,XC.y.2.P Q r.p.t.p.y.u.a.yX",
+"kXrXqXrXtXtXuXuXtXtXtXtXtXrXyXkX"
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"lXlXcXcXcXcXcXvXvXvXvXvXvXvXvXvXbXbXbXnXvXxXcXcXcXbXbXbXnXvXlXlX",
+"lXkXpXpXpXpXiXrXeXeXeXrXeXeXeXrX8X7X8X7XeXaXpXpXpX9X7X8X7XwXlXlX",
+"cXpX` K U P W 4.6.5.5.1.5.5.5.4.H.E.U.^.8.F Y I I B.E.P.E.x.wXvX",
+"cXpXK g x j V u.a.p.p.q.a.p.a.u.3XdXtXcXg.y v z l XXiX0XjX!.6XnX",
+"cXpXY c N b D t.i.u.u.0.i.i.i.y.=XqX5XaXs.f N n n ].wX6XsXR.7XbX",
+"cXpXL g x j V p.s.s.s.q.u.u.u.t.2XsXrXxXh.a m v v |.aXrXlXW.7XnX",
+"cXiX^ J I K T 4.6.6.5.7.s.a.a.u.(.oX}.&X0.j B M n /.6X>X6XH.8XbX",
+"bX8XP.6X;X7X[.v b M d p.tX<X7X@XB l c c N n b b b `.7X>X8XL.8XbX",
+"bX8XY.rX8XsX@Xc b M s f.hX9XuX:XB x b n N c v b b XXaX0XsXR.7XbX",
+"bX8XU.eX8XaX+Xn M V g d.pX5XwX&XB c n n B n M M M }.rX5XtXU.8XbX",
+"bX8XU.pXeXgXXXa s h 8 f.mXiXjX5XC v m M v s f f s $XzXpXxX~.7XnX",
+"bX9XD.>X$X;X_.u.f.d.f.6.5.5.7.1.C M B c ] l.s.f.p.3.6.6.6.>.rXvX",
+"bX7XT.pX0XrX>XeXhXaXmX5.7 f a j n c n s 0.mXpXhXyXA u g u G aXxX",
+"bX8XY.uX8XeX-X,X0X5XiX6.g B M V n b M g 5.iX5X9X1XI v B v Y pXcX",
+"bX7XE.dXeXiX<X5XuXqXjX6.p m v M v c n s 6.jXqXyX8XK l n l I pXcX",
+"bX9XF.1X*X:X X#X,X=X7X2.l Z B C Z C S c 4.6X=X>X%XI n V b T iXcX",
+"cXiXR M Z B H r.y.y.y.7.q.q.q.9. X:X*X<XS.0.u.u.e.7.w.q.w.1.rXvX",
+"cXpXP k b z Z y.p.i.i.w.a.a.a.u.<XiXeXdXU.q.a.p.t.r.s.p.s.6.eXvX",
+"cXpXU z m c S t.u.u.y.q.p.p.p.y.-XwX6XtXL.w.p.p.t.w.p.u.p.5.eXvX",
+"cXpXI z n c S s.g.f.g.0.w.e.e.q.2XsXtXhXT.q.a.p.t.e.p.i.a.5.eXvX",
+"cXpXY b B m A |  . .] 9.H.Z.D.M.D.U.L.T.g.7.q.q.8.6.w.0.q.1.rXvX",
+"cXpXI z n b m l h z t f.zXeXaX1X0.q.w.q.7.i.i.i.r.w.p.u.p.5.eXvX",
+"cXpXI z n b M m n N g d.sX6XeX-Xu.a.p.a.q.i.i.p.r.w.p.i.p.5.eXvX",
+"cXpXI z n v M b v M f f.hX9XyX>Xu.p.p.p.q.i.p.a.t.e.a.i.a.6.eXvX",
+"cXpXI l n v m m n N f p.yX2X8X%Xe.t.t.t.8.r.r.t.q.9.y.r.t.3.rXvX",
+"bX9XB.XX'..XE.2.6.5.9.] F L J I 7.r.w.e.6.w.w.e.9.8.r.w.e.2.rXvX",
+"bX7XE.iXqXdX>Xt.d.p.k.) s x k m w.s.p.p.w.p.p.a.y.r.a.p.a.6.eXvX",
+"bX8XP.0X6XyX%Xq.i.y.d._ l N m C q.p.u.i.0.u.i.i.r.w.p.u.p.5.rXvX",
+"nX7XE.jXsXxX>Xe.a.i.h./ f v z n w.s.p.a.q.p.p.a.t.e.a.p.s.5.eXvX",
+"vXwXx.!.R.!.A.2.6.5.8.{ K Y I T 1.6.5.5.1.5.5.6.3.2.6.5.5.1.yXcX",
+"lXlXwX6X7X7X9XrXeXeXeXyXpXpXpXiXrXeXeXeXrXeXeXeXrXrXeXrXeXyXkXlX",
+"lXlXvXnXbXnXbXvXvXvXvXcXcXcXcXcXvXvXvXvXvXvXvXvXvXvXvXvXvXcXlXlX"
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 256 2 ",
+"   c black",
+".  c #010101",
+"X  c #020202",
+"o  c gray1",
+"O  c #040404",
+"+  c gray2",
+"@  c #060606",
+"#  c #070707",
+"$  c gray3",
+"%  c #090909",
+"&  c gray4",
+"*  c #0B0B0B",
+"=  c #0C0C0C",
+"-  c gray5",
+";  c #0E0E0E",
+":  c gray6",
+">  c #101010",
+",  c #111111",
+"<  c gray7",
+"1  c #131313",
+"2  c gray8",
+"3  c #151515",
+"4  c #161616",
+"5  c gray9",
+"6  c #181818",
+"7  c #191919",
+"8  c gray10",
+"9  c #1B1B1B",
+"0  c gray11",
+"q  c #1D1D1D",
+"w  c #1E1E1E",
+"e  c gray12",
+"r  c #202020",
+"t  c gray13",
+"y  c #222222",
+"u  c #232323",
+"i  c gray14",
+"p  c #252525",
+"a  c gray15",
+"s  c #272727",
+"d  c #282828",
+"f  c gray16",
+"g  c #2A2A2A",
+"h  c gray17",
+"j  c #2C2C2C",
+"k  c #2D2D2D",
+"l  c gray18",
+"z  c #2F2F2F",
+"x  c gray19",
+"c  c #313131",
+"v  c #323232",
+"b  c gray20",
+"n  c #343434",
+"m  c #353535",
+"M  c gray21",
+"N  c #373737",
+"B  c gray22",
+"V  c #393939",
+"C  c #3A3A3A",
+"Z  c gray23",
+"A  c #3C3C3C",
+"S  c gray24",
+"D  c #3E3E3E",
+"F  c #3F3F3F",
+"G  c gray25",
+"H  c #414141",
+"J  c gray26",
+"K  c #434343",
+"L  c #444444",
+"P  c gray27",
+"I  c #464646",
+"U  c gray28",
+"Y  c #484848",
+"T  c #494949",
+"R  c gray29",
+"E  c #4B4B4B",
+"W  c #4C4C4C",
+"Q  c gray30",
+"!  c #4E4E4E",
+"~  c gray31",
+"^  c #505050",
+"/  c #515151",
+"(  c gray32",
+")  c #535353",
+"_  c gray33",
+"`  c #555555",
+"'  c #565656",
+"]  c gray34",
+"[  c #585858",
+"{  c gray35",
+"}  c #5A5A5A",
+"|  c #5B5B5B",
+" . c gray36",
+".. c #5D5D5D",
+"X. c gray37",
+"o. c #5F5F5F",
+"O. c #606060",
+"+. c gray38",
+"@. c #626262",
+"#. c gray39",
+"$. c #646464",
+"%. c #656565",
+"&. c gray40",
+"*. c #676767",
+"=. c #686868",
+"-. c DimGray",
+";. c #6A6A6A",
+":. c gray42",
+">. c #6C6C6C",
+",. c #6D6D6D",
+"<. c gray43",
+"1. c #6F6F6F",
+"2. c gray44",
+"3. c #717171",
+"4. c #727272",
+"5. c gray45",
+"6. c #747474",
+"7. c gray46",
+"8. c #767676",
+"9. c #777777",
+"0. c gray47",
+"q. c #797979",
+"w. c gray48",
+"e. c #7B7B7B",
+"r. c #7C7C7C",
+"t. c gray49",
+"y. c #7E7E7E",
+"u. c gray50",
+"i. c #808080",
+"p. c #818181",
+"a. c gray51",
+"s. c #838383",
+"d. c #848484",
+"f. c gray52",
+"g. c #868686",
+"h. c gray53",
+"j. c #888888",
+"k. c #898989",
+"l. c gray54",
+"z. c #8B8B8B",
+"x. c gray55",
+"c. c #8D8D8D",
+"v. c #8E8E8E",
+"b. c gray56",
+"n. c #909090",
+"m. c gray57",
+"M. c #929292",
+"N. c #939393",
+"B. c gray58",
+"V. c #959595",
+"C. c gray59",
+"Z. c #979797",
+"A. c #989898",
+"S. c gray60",
+"D. c #9A9A9A",
+"F. c #9B9B9B",
+"G. c gray61",
+"H. c #9D9D9D",
+"J. c gray62",
+"K. c #9F9F9F",
+"L. c #A0A0A0",
+"P. c gray63",
+"I. c #A2A2A2",
+"U. c gray64",
+"Y. c #A4A4A4",
+"T. c #A5A5A5",
+"R. c gray65",
+"E. c #A7A7A7",
+"W. c gray66",
+"Q. c #A9A9A9",
+"!. c #AAAAAA",
+"~. c gray67",
+"^. c #ACACAC",
+"/. c gray68",
+"(. c #AEAEAE",
+"). c #AFAFAF",
+"_. c gray69",
+"`. c #B1B1B1",
+"'. c #B2B2B2",
+"]. c gray70",
+"[. c #B4B4B4",
+"{. c gray71",
+"}. c #B6B6B6",
+"|. c #B7B7B7",
+" X c gray72",
+".X c #B9B9B9",
+"XX c gray73",
+"oX c #BBBBBB",
+"OX c #BCBCBC",
+"+X c gray74",
+"@X c gray",
+"#X c gray75",
+"$X c #C0C0C0",
+"%X c #C1C1C1",
+"&X c gray76",
+"*X c #C3C3C3",
+"=X c gray77",
+"-X c #C5C5C5",
+";X c #C6C6C6",
+":X c gray78",
+">X c #C8C8C8",
+",X c gray79",
+"<X c #CACACA",
+"1X c #CBCBCB",
+"2X c gray80",
+"3X c #CDCDCD",
+"4X c #CECECE",
+"5X c gray81",
+"6X c #D0D0D0",
+"7X c gray82",
+"8X c #D2D2D2",
+"9X c LightGray",
+"0X c gray83",
+"qX c #D5D5D5",
+"wX c gray84",
+"eX c #D7D7D7",
+"rX c #D8D8D8",
+"tX c gray85",
+"yX c #DADADA",
+"uX c gray86",
+"iX c gainsboro",
+"pX c #DDDDDD",
+"aX c gray87",
+"sX c #DFDFDF",
+"dX c gray88",
+"fX c #E1E1E1",
+"gX c #E2E2E2",
+"hX c gray89",
+"jX c #E4E4E4",
+"kX c gray90",
+"lX c #E6E6E6",
+"zX c #E7E7E7",
+"xX c gray91",
+"cX c #E9E9E9",
+"vX c #EAEAEA",
+"bX c gray92",
+"nX c #ECECEC",
+"mX c gray93",
+"MX c #EEEEEE",
+"NX c #EFEFEF",
+"BX c gray94",
+"VX c #F1F1F1",
+"CX c gray95",
+"ZX c #F3F3F3",
+"AX c #F4F4F4",
+"SX c gray96",
+"DX c #F6F6F6",
+"FX c gray97",
+"GX c #F8F8F8",
+"HX c #F9F9F9",
+"JX c gray98",
+"KX c #FBFBFB",
+"LX c gray99",
+"PX c #FDFDFD",
+"IX c #FEFEFE",
+"UX c white",
+/* pixels */
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX",
+"lXlXlXlXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXlXlXlXlX",
+"lXlXlXzXnXbXbXbXbXbXbXmXmXmXmXmXmXnXmXmXmXmXmXmXMXMXMXMXMXMXnXbXbXbXbXbXnXMXMXMXMXMXMXnXlXlXlXlX",
+"lXlXzXgX4X5X5X5X5X5X4X<X,X,X,X,X,X<X,X,X,X,X,X<X=X*X*X*X*X&X1X6X5X5X5X5X4X=X*X*X*X*X&X3XlXlXlXlX",
+"lXkXnX4XL S F D D S K &.*.*.*.*.&.+.*.*.*.*.*.&.v.V.N.N.M.A.| V F D F S P v.C.N.B.B.N.6.pXxXlXlX",
+"lXkXbX5XS z v c v z A a.d.d.d.d.s.q.f.d.d.d.d.p.0XgXaXsXpXcX>.a b c v l F 9XrXwXwXwXkXx.tXcXlXlX",
+"lXkXbX5XF v n n n c S t.i.u.u.i.y.7.i.u.u.u.u.t.,XwX8X9X7XiX;.g M n n x H -X4X9X7X0XaXj.yXcXlXlX",
+"lXkXbX5XD c n b n c S y.p.i.i.i.u.8.p.i.i.i.i.y.<XrX0XqX9XsX;.f m b n x H >X7XwX0XeXdXj.tXcXlXlX",
+"lXkXbX5XF v m n n v S t.i.u.u.i.y.7.p.i.i.i.i.y.,XwX9X9X7XpX-.f m b n x H ;X5X0X8XqXsXj.tXcXlXlX",
+"lXkXbX5XA k x z x k C p.d.s.s.s.a.8.p.i.i.i.i.y.7XsXiXiXyXlX>.d m v b z G 3XaXgXfXgXjXl.tXcXlXlX",
+"lXkXnX4XU K P L P K Y 2.5.4.4.4.2.3.i.y.y.y.u.w.~.}.].[.'.oX+.z V N B n J  X=X%X%X%X*Xs.yXcXlXlX",
+"lXkXMX=Xn.wX>X<X>X9X(.z b b b m d f.eX,X2X<X8X(.l z z z l z B m n n m v H #X<X>X>X>X2Xf.yXcXlXlX",
+"lXkXMX*XV.eX3X7X4XfX}.z n b b M s x.hXqXeXwXaX Xx c v v v m B x c c c x G 4XuXeXrXeXiXl.tXcXlXlX",
+"lXkXMX*XB.wX9XwX9XkX[.z n b b M d l.dX8X0X9XuX}.x v n b n m B c b n n v G 1XeX0XqX0XtXk.tXcXlXlX",
+"lXkXMX*XB.wX7X0X7XjX{.z n b b M s l.fX8XqX9XiX}.x c b b b m B x b b b v G 1XrX0XqX0XtXk.tXcXlXlX",
+"lXkXMX*XB.rXwXtXeXzX{.v M M M B g l.aX6X9X7XyX[.z v n b n m V n M M N m J ,XwX8X9X8XeXk.tXcXlXlX",
+"lXkXMX*Xm.pXeXtXrXdX_.p d d s g 9 x.bXuXaXiXkX+Xc m M m m M v a f f g p N 0XfXpXaXpXhXx.tXcXlXlX",
+"lXkXMX-Xf.&X|. X|.+XT.s.x.l.l.l.x.>.&.=.*.*.-.O.V B B B V v %.n.k.l.l.x.u.$.=.*.*.=.%.&.dXxXlXlX",
+"lXkXMX*XB.fXqXeXeXuX&X9XjXdXfXaXbX&.0 f s s s z m z c x n a c.mXaXfXsXxX%Xd f f f h u ( jXzXlXlX",
+"lXkXMX*XN.aX8X0X0XtX#X;XqX8X8X6XuX=.f N m m M V n c b b M f g.aX6X8X7XtX}.n m m m M x ' hXzXlXlX",
+"lXkXMX*XN.sX9XqX0XtX$X,XrXqXqX9XaX*.s m b b n N n c n b M f h.fX8XqX0XuX Xv b b b n k ` hXzXlXlX",
+"lXkXMX*XN.pX7X9X9XrX#X:XeX9X0X8XpX*.s m b b m B m c n b N g h.sX7X0X8XyX|.v n n b m l ` hXzXlXlX",
+"lXkXMX*XZ.lXyXiXuXdX;X4XaXyXuXrXjX=.a m b b b m c z v c m p k.zXrXuXtXfXOXx c c c v h _ hXzXlXlX",
+"lXkXMX-Xs.+X[.}.{..XR.`.+XXXoX.X&X$.n D A A Z F K J J J L V u.=X.XoXXX$XY.C A A A S N [ hXzXlXlX",
+"lXkXbX5XS l c c c l C 9.q.0.0.q.9.4.y.t.t.t.t.e.*X5X2X3X2X7Xk.6.q.0.0.w.4.0.y.t.t.y.r.,.sXxXlXlX",
+"lXkXbX5XD c n b n c S i.a.p.a.a.p.8.a.p.p.p.p.u.2XyXeXeXwXuXm.t.s.a.p.s.w.e.a.p.p.p.i.<.aXxXlXlX",
+"lXkXbX5XD c n b n c S y.i.i.i.i.u.7.p.i.i.i.i.y.<XeX0X0X0XrXb.e.p.i.i.p.0.e.p.i.i.i.u.<.aXxXlXlX",
+"lXkXbX5XD c n b n c S y.p.i.i.i.u.8.p.i.i.i.i.y.<XrX0XqX0XtXn.r.p.i.i.a.0.e.p.i.i.i.u.<.aXxXlXlX",
+"lXkXbX5XD c n b b c S t.i.u.u.u.y.8.s.p.a.a.a.u.<XeX0X0X9XrXn.r.p.i.i.a.q.e.p.i.i.p.u.<.aXxXlXlX",
+"lXkXbX5XD v n b n c S a.f.f.f.f.f.5.q.q.q.q.0.0.4XiXrXtXrXpXn.w.i.u.u.p.0.w.i.u.u.u.y.<.sXxXlXlX",
+"lXkXbX5XH M V B B N S ^ ^ ^ ^ / R 9.T.J.K.K.I.M.k.m.b.n.n.n.7.7.8.8.7.9.1.3.9.7.8.8.6.;.sXxXlXlX",
+"lXkXbX5XD c b b b v M x h j j z y x.cXtXiXuXgX$X6.t.e.r.r.w.7.a.i.p.i.a.q.e.a.p.p.p.i.<.aXxXlXlX",
+"lXkXbX5XD c n b b v N m v n n N g l.sX7X9X8XtXXXq.s.p.p.p.i.8.i.i.i.i.p.0.e.p.i.i.i.u.<.aXxXlXlX",
+"lXkXbX5XD c n b b v N n c n b M f l.fX8XqX0XuXoX0.a.i.i.i.u.8.p.i.i.i.a.0.e.p.i.i.i.u.<.aXxXlXlX",
+"lXkXbX5XF v n n n b B m c n b N g k.sX7X0X8XtXXX0.p.i.i.i.u.7.i.i.i.u.p.0.w.p.u.i.i.u.<.aXxXlXlX",
+"lXkXbX5XS l x x x z n b c b b M s c.xXtXuXyXfX$Xw.s.p.a.a.p.9.a.p.a.p.s.w.r.s.p.a.a.p.<.aXxXlXlX",
+"lXkXnX4XP F H H H G H A Z Z Z S v y.%X}. X|.OXY.4.w.0.0.q.0.1.q.0.0.0.w.4.6.q.0.0.q.9.:.sXxXlXlX",
+"lXkXMX=Xv.9X-X>X;X4X'.7.y.r.t.r.p.Q j v c c z C 0.e.e.e.e.w.3.e.e.e.w.r.6.8.r.e.e.e.q.>.sXxXlXlX",
+"lXkXMX*XC.rX4X7X4XdX+Xq.s.p.p.i.g.~ j v c v c A y.a.p.p.p.i.9.a.p.p.p.s.q.r.a.p.p.p.i.<.aXxXlXlX",
+"lXkXMX*XN.wX9XwX0XhXXX0.p.i.i.u.d.~ j n n n b A t.p.i.i.i.u.7.p.i.i.i.p.0.e.p.i.i.i.u.<.aXxXlXlX",
+"lXkXMX*XB.wX7X0X8XgXoX0.a.i.i.u.f.~ j n b b b A t.p.i.i.i.u.8.p.i.i.i.a.0.e.p.i.i.i.u.<.aXxXlXlX",
+"lXkXMX*XB.wX0XeXqXjXXX0.a.i.i.u.f.^ k M m m m S y.p.i.i.p.u.8.p.i.i.i.a.q.e.p.i.i.p.u.<.sXxXlXlX",
+"lXkXMX&XN.kXaXdXsXlXOX9.p.u.u.y.d.R d x z x k N r.i.u.u.u.y.6.i.u.u.u.p.9.q.i.u.u.u.y.:.aXxXlXlX",
+"lXkXnX3X6.x.j.j.j.l.i.:.<.<.<.<.1.X.) ` ` ` _ [ ,.<.<.<.<.<.;.<.<.<.<.<.:.>.<.<.<.<.:.4.fXzXlXlX",
+"lXlXlXlXpXtXyXtXtXtXuXsXaXaXaXsXaXgXjXhXhXhXjXhXsXaXaXaXaXsXsXaXaXaXaXaXsXsXaXaXaXsXaXfXlXlXlXlX",
+"lXlXlXlXxXcXcXcXcXcXcXxXxXxXxXxXxXzXzXzXzXzXzXzXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXzXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX",
+"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX"
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/unruly-web.png b/icons/unruly-web.png
new file mode 100644 (file)
index 0000000..f8fe159
Binary files /dev/null and b/icons/unruly-web.png differ
diff --git a/icons/unruly.ico b/icons/unruly.ico
new file mode 100644 (file)
index 0000000..0f645f1
Binary files /dev/null and b/icons/unruly.ico differ
diff --git a/icons/unruly.rc b/icons/unruly.rc
new file mode 100644 (file)
index 0000000..2aa7f40
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "unruly.ico"
diff --git a/icons/untangle-16d24.png b/icons/untangle-16d24.png
new file mode 100644 (file)
index 0000000..7df6f04
Binary files /dev/null and b/icons/untangle-16d24.png differ
diff --git a/icons/untangle-16d4.png b/icons/untangle-16d4.png
new file mode 100644 (file)
index 0000000..87c2bbf
Binary files /dev/null and b/icons/untangle-16d4.png differ
diff --git a/icons/untangle-16d8.png b/icons/untangle-16d8.png
new file mode 100644 (file)
index 0000000..c250437
Binary files /dev/null and b/icons/untangle-16d8.png differ
diff --git a/icons/untangle-32d24.png b/icons/untangle-32d24.png
new file mode 100644 (file)
index 0000000..9990f39
Binary files /dev/null and b/icons/untangle-32d24.png differ
diff --git a/icons/untangle-32d4.png b/icons/untangle-32d4.png
new file mode 100644 (file)
index 0000000..b14a140
Binary files /dev/null and b/icons/untangle-32d4.png differ
diff --git a/icons/untangle-32d8.png b/icons/untangle-32d8.png
new file mode 100644 (file)
index 0000000..c561489
Binary files /dev/null and b/icons/untangle-32d8.png differ
diff --git a/icons/untangle-48d24.png b/icons/untangle-48d24.png
new file mode 100644 (file)
index 0000000..9a53fb3
Binary files /dev/null and b/icons/untangle-48d24.png differ
diff --git a/icons/untangle-48d4.png b/icons/untangle-48d4.png
new file mode 100644 (file)
index 0000000..10d8fcc
Binary files /dev/null and b/icons/untangle-48d4.png differ
diff --git a/icons/untangle-48d8.png b/icons/untangle-48d8.png
new file mode 100644 (file)
index 0000000..fa9b739
Binary files /dev/null and b/icons/untangle-48d8.png differ
diff --git a/icons/untangle-base.png b/icons/untangle-base.png
new file mode 100644 (file)
index 0000000..0079d73
Binary files /dev/null and b/icons/untangle-base.png differ
diff --git a/icons/untangle-ibase.png b/icons/untangle-ibase.png
new file mode 100644 (file)
index 0000000..32dd6c7
Binary files /dev/null and b/icons/untangle-ibase.png differ
diff --git a/icons/untangle-ibase4.png b/icons/untangle-ibase4.png
new file mode 100644 (file)
index 0000000..b97cfc9
Binary files /dev/null and b/icons/untangle-ibase4.png differ
diff --git a/icons/untangle-icon.c b/icons/untangle-icon.c
new file mode 100644 (file)
index 0000000..b958ef5
--- /dev/null
@@ -0,0 +1,792 @@
+/* XPM */
+static const char *const xpm_icon_0[] = {
+/* columns rows colors chars-per-pixel */
+"16 16 235 2 ",
+"   c #D5D5D5",
+".  c #D5D5D5",
+"X  c #D4D4D5",
+"o  c #DBDBD4",
+"O  c #E0E0D2",
+"+  c #D5D5D6",
+"@  c gray83",
+"#  c #D5D5D5",
+"$  c #D5D5D5",
+"%  c #D5D5D5",
+"&  c gray84",
+"*  c #D2D2D2",
+"=  c #D5D5D5",
+"-  c #D5D5D5",
+";  c #D3D3D5",
+":  c #E0E0D6",
+">  c #9D9DCD",
+",  c #6363C6",
+"<  c #DFDFD3",
+"1  c #D6D6D8",
+"2  c #D5D5D5",
+"3  c #D3D3D4",
+"4  c #D6D6D8",
+"5  c #CDCDCC",
+"6  c #C3C3C3",
+"7  c #D7D7D7",
+"8  c #D5D5D5",
+"9  c #D4D4D5",
+"0  c #DCDCD6",
+"q  c #B1B1CD",
+"w  c #8484BF",
+"e  c #C8C8C1",
+"r  c #C6C6C8",
+"t  c #D2D2D4",
+"y  c #E0E0D9",
+"u  c #D9D9D1",
+"i  c #BDBDBF",
+"p  c #D6D6D5",
+"a  c #D5D5D5",
+"s  c #D5D5D5",
+"d  c #D5D5D5",
+"f  c #D5D5D7",
+"g  c #D5D5CF",
+"h  c #D1D1C5",
+"j  c #D6D6D8",
+"k  c #C8C8C9",
+"l  c #C9C9C3",
+"z  c #A3A3C8",
+"x  c #9999C1",
+"c  c #D8D8D1",
+"v  c #D5D5D6",
+"b  c #D5D5D5",
+"n  c #D5D5D5",
+"m  c #D5D5D5",
+"M  c #D5D5D5",
+"N  c gray84",
+"B  c #CECED0",
+"V  c #C3C3C5",
+"C  c #DBDBDA",
+"Z  c #D4D4D6",
+"A  c #D3D3C5",
+"S  c #7070BE",
+"D  c #6E6EC4",
+"F  c #E3E3D5",
+"G  c #D3D3D5",
+"H  c #D5D5D5",
+"J  c #D5D5D5",
+"K  c #D5D5D5",
+"L  c #D4D4D5",
+"P  c gray83",
+"I  c #D7D7D7",
+"U  c gray83",
+"Y  c gray76",
+"T  c #C8C8C8",
+"R  c #C0C0C0",
+"E  c #C9C9CB",
+"W  c #DFDFD6",
+"Q  c #D4D4CA",
+"!  c #BFBFC0",
+"~  c #D7D7D7",
+"^  c #D5D5D5",
+"/  c #D5D5D5",
+"(  c #D5D5D5",
+")  c #D7D7D5",
+"_  c #DBDBD6",
+"`  c #D7D7D7",
+"'  c LightGray",
+"]  c gray76",
+"[  c #B1B1B1",
+"{  c #CDCDCD",
+"}  c gray84",
+"|  c #D8D8D7",
+" . c #D3D3D5",
+".. c #D7D7D9",
+"X. c #CBCBCA",
+"o. c #C1C1C1",
+"O. c gray84",
+"+. c #D5D5D5",
+"@. c #D7D7D5",
+"#. c #CECED3",
+"$. c #BDBDCF",
+"%. c #C9C9C7",
+"&. c gray77",
+"*. c gray79",
+"=. c gray77",
+"-. c gray85",
+";. c gray83",
+":. c #D5D5D5",
+">. c #D5D5D5",
+",. c gray83",
+"<. c #D8D8D8",
+"1. c #CACACA",
+"2. c #D0D0D0",
+"3. c gray84",
+"4. c #E0E0D6",
+"5. c #A7A7D0",
+"6. c #3333BD",
+"7. c #C3C3B9",
+"8. c #CFCFD1",
+"9. c gray83",
+"0. c #C5C5C5",
+"q. c #D8D8D8",
+"w. c #D5D5D5",
+"e. c gray83",
+"r. c #D5D5D5",
+"t. c #D5D5D5",
+"y. c #D5D5D5",
+"u. c #D7D7D7",
+"i. c gray84",
+"p. c #D5D5D5",
+"a. c #D5D5D4",
+"s. c #D7D7D7",
+"d. c #B1B1B4",
+"f. c gray75",
+"g. c gray79",
+"h. c gray75",
+"j. c #B4B4B4",
+"k. c #CECECE",
+"l. c gray83",
+"z. c #D8D8D8",
+"x. c #D7D7D7",
+"c. c #D5D5D5",
+"v. c gray83",
+"b. c gray83",
+"n. c #D5D5D5",
+"m. c #D5D5D5",
+"M. c gray83",
+"N. c #D8D8D8",
+"B. c #CDCDCC",
+"V. c #B5B5B8",
+"C. c #D3D3D4",
+"Z. c gray84",
+"A. c #BCBCBC",
+"S. c gray78",
+"D. c #C1C1C1",
+"F. c gray77",
+"G. c gray80",
+"H. c gray83",
+"J. c #D8D8D8",
+"K. c #D7D7D7",
+"L. c #D5D5D5",
+"P. c #D5D5D5",
+"I. c #D5D5D5",
+"U. c gray84",
+"Y. c #D0D0D2",
+"T. c #CFCFC0",
+"R. c #C7C7C1",
+"E. c #D2D2D3",
+"W. c #C3C3C4",
+"Q. c #D8D8D8",
+"!. c #D5D5D5",
+"~. c gray81",
+"^. c #C6C6C6",
+"/. c gray76",
+"(. c gray77",
+"). c gray80",
+"_. c #D5D5D5",
+"`. c #D5D5D5",
+"'. c #D5D5D5",
+"]. c #D4D4D5",
+"[. c #DDDDD3",
+"{. c #6666C6",
+"}. c #9F9FC4",
+"|. c #CECEC5",
+" X c #CACAC6",
+".X c #D5D5D4",
+"XX c #D5D5D5",
+"oX c #D7D7D7",
+"OX c #D8D8D8",
+"+X c gray84",
+"@X c gray81",
+"#X c gray78",
+"$X c #D2D2D2",
+"%X c gray84",
+"&X c #D5D5D5",
+"*X c #D4D4D5",
+"=X c #DBDBD4",
+"-X c #8484CE",
+";X c #A7A7C4",
+":X c #BABAB4",
+">X c #9D9DB7",
+",X c #D4D4D6",
+"<X c #D5D5D5",
+"1X c #D5D5D5",
+"2X c gray83",
+"3X c #D5D5D5",
+"4X c gray84",
+"5X c #D8D8D8",
+"6X c #D5D5D5",
+"7X c #D5D5D5",
+"8X c #D5D5D5",
+"9X c #D4D4D5",
+"0X c #E2E2D5",
+"qX c #DFDFD8",
+"wX c #C1C1C9",
+"eX c #3838C7",
+"rX c #C3C3D0",
+"tX c #DADAD6",
+"yX c #D4D4D5",
+"uX c #D5D5D5",
+"iX c #D5D5D5",
+"pX c gray83",
+"aX c #D5D5D5",
+"sX c #D5D5D5",
+"dX c #D5D5D5",
+"fX c #D5D5D5",
+"gX c #D5D5D5",
+"hX c #D2D2D5",
+"jX c #D3D3D5",
+"kX c #D7D7D7",
+"lX c #D2D2D1",
+"zX c #D5D5D5",
+"xX c #D5D5D5",
+"cX c #D5D5D5",
+"vX c white",
+/* pixels */
+"      . X o O + @ # $ % & * = - ",
+"      ; : > , < 1 2 3 4 5 6 7 8 ",
+"      9 0 q w e r t y u i p a s ",
+"      d f g h j k l z x c v b n ",
+"    m M N B V C Z A S D F G H n ",
+"J K L P I U Y T R E W Q ! ~ ^ / ",
+"( ) _ ` ' ] [ { } |  ...X.o.O.+.",
+"@.#.$.%.&.*.=.-.;.:.>.,.<.1.2.3.",
+"4.5.6.7.8.9.0.q.w.e.r.t.y.u.i.p.",
+"a.s.d.f.g.h.j.k.l.z.x.c.v.b.n.m.",
+"M.N.B.V.C.Z.A.S.D.F.G.H.J.K.L.P.",
+"I.U.Y.T.R.E.W.Q.!.~.^./.(.)._.`.",
+"'.].[.{.}.|. X.XXXoXOX+X@X#X$X%X",
+"&X*X=X-X;X:X>X,X<X1X2X3X4X5X6Xs ",
+"7X8X9X0XqXwXeXrXtXyXm uXiXpXaXsX",
+"dXfXgXhXjXkXlXzXxXcX            "
+};
+
+/* XPM */
+static const char *const xpm_icon_1[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 181 2 ",
+"   c #73739F",
+".  c #4444AD",
+"X  c #5E5EA8",
+"o  c #4848B0",
+"O  c #6B6BA9",
+"+  c #7777AD",
+"@  c #6161BB",
+"#  c #6D6DBB",
+"$  c #7878B3",
+"%  c #7878B8",
+"&  c #0101D2",
+"*  c #0505D5",
+"=  c #0B0BD1",
+"-  c #0808D9",
+";  c #2121C4",
+":  c #2E2EC8",
+">  c #0101E4",
+",  c #0000E8",
+"<  c #0000F2",
+"1  c #0000F5",
+"2  c #0000F9",
+"3  c #4545C1",
+"4  c #4141C7",
+"5  c #6666C0",
+"6  c #868695",
+"7  c #959595",
+"8  c #999990",
+"9  c #9B9B9B",
+"0  c gray62",
+"q  c #8E8EA1",
+"w  c #9292AA",
+"e  c #8080BE",
+"r  c #8888BD",
+"t  c #9C9CB1",
+"y  c #9292BF",
+"u  c #9494BF",
+"i  c #A9A9A9",
+"p  c #AAAAAA",
+"a  c #AAAAAB",
+"s  c gray67",
+"d  c #AEAEA9",
+"f  c #A9A9AD",
+"g  c #ABABAC",
+"h  c #ACACAC",
+"j  c gray68",
+"k  c #AEAEAE",
+"l  c #AFAFAF",
+"z  c #B8B8A5",
+"x  c #B1B1AC",
+"c  c #B2B2AC",
+"v  c #B5B5AD",
+"b  c #A6A6B7",
+"n  c #AFAFB0",
+"m  c #AFAFB3",
+"M  c gray69",
+"N  c #B1B1B1",
+"B  c #B2B2B1",
+"V  c #B2B2B2",
+"C  c #B2B2B3",
+"Z  c gray70",
+"A  c #B6B6B1",
+"S  c #B1B1B4",
+"D  c #B3B3B4",
+"F  c #B4B4B4",
+"G  c gray71",
+"H  c #B6B6B6",
+"J  c #B7B7B7",
+"K  c #BDBDB7",
+"L  c #B7B7B8",
+"P  c #B7B7BC",
+"I  c gray72",
+"U  c #B9B9B9",
+"Y  c gray73",
+"T  c #BBBBBB",
+"R  c #BABABF",
+"E  c #BCBCBC",
+"W  c gray74",
+"Q  c #BEBEBF",
+"!  c gray75",
+"~  c #C0C0B4",
+"^  c #C1C1B4",
+"/  c #C1C1B6",
+"(  c #C7C7B7",
+")  c #C2C2BE",
+"_  c #C2C2BF",
+"`  c #BFBFC0",
+"'  c #BCBCC5",
+"]  c #C0C0C0",
+"[  c #C0C0C1",
+"{  c #C1C1C1",
+"}  c gray76",
+"|  c #C3C3C3",
+" . c #C5C5C1",
+".. c #C7C7C2",
+"X. c gray77",
+"o. c #C5C5C5",
+"O. c gray78",
+"+. c #C9C9C7",
+"@. c #C7C7C8",
+"#. c gray79",
+"$. c #CACAC9",
+"%. c #C9C9CA",
+"&. c #CACACA",
+"*. c #CBCBCB",
+"=. c gray80",
+"-. c #CDCDCD",
+";. c #CECECD",
+":. c #CCCCCE",
+">. c #CECECE",
+",. c #CECECF",
+"<. c gray81",
+"1. c #D0D0C2",
+"2. c #D7D7CF",
+"3. c #D8D8CA",
+"4. c #D9D9CC",
+"5. c #DEDECE",
+"6. c #D0D0D0",
+"7. c #D1D1D0",
+"8. c gray82",
+"9. c #D1D1D3",
+"0. c #D2D2D2",
+"q. c LightGray",
+"w. c #D4D4D0",
+"e. c #D7D7D1",
+"r. c #D1D1D4",
+"t. c #D2D2D4",
+"y. c #D3D3D4",
+"u. c #D2D2D5",
+"i. c #D3D3D5",
+"p. c #D3D3D6",
+"a. c gray83",
+"s. c #D4D4D5",
+"d. c #D5D5D5",
+"f. c #D6D6D5",
+"g. c #D5D5D6",
+"h. c #D4D4D7",
+"j. c gray84",
+"k. c #D6D6D7",
+"l. c #D7D7D7",
+"z. c #DADAD1",
+"x. c #DCDCD2",
+"c. c #DBDBD4",
+"v. c #D8D8D7",
+"b. c #DADAD7",
+"n. c #DCDCD4",
+"m. c #DFDFD5",
+"M. c #D5D5D8",
+"N. c #D7D7D8",
+"B. c #D6D6D9",
+"V. c #D7D7D9",
+"C. c #D8D8D8",
+"Z. c #D9D9D8",
+"A. c #D8D8D9",
+"S. c gray85",
+"D. c #DADAD8",
+"F. c #DBDBD9",
+"G. c #D9D9DA",
+"H. c #DADADA",
+"J. c #DADADB",
+"K. c gray86",
+"L. c #DDDDD8",
+"P. c #DFDFD8",
+"I. c #DCDCDA",
+"U. c #DFDFDA",
+"Y. c #DBDBDC",
+"T. c #DADADE",
+"R. c gainsboro",
+"E. c gray87",
+"W. c #E0E0CF",
+"Q. c #E2E2D4",
+"!. c #E3E3D5",
+"~. c #E0E0D6",
+"^. c #E0E0D7",
+"/. c #E4E4D6",
+"(. c #E6E6DB",
+"). c #E0E0DC",
+"_. c #E8E8DB",
+"`. c #EDEDDE",
+"'. c gray88",
+"]. c #E1E1E1",
+"[. c gray89",
+/* pixels */
+"d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.C.d.d.d.d.",
+"d.d.d.d.d.d.d.d.d.d.d.C.x.M.d.d.d.d.d.d.d.d.d.d.d.d.d.-.d.d.d.d.",
+"d.d.d.d.d.d.d.d.d.w.C.' + q.d.d.d.d.d.d.d.d.d.d.d.C.N o.C.d.d.d.",
+"d.d.d.d.d.d.d.d.d.r.Q.3 < + (.d.q.d.d.d.d.d.d.d.R.T H C.d.d.d.d.",
+"d.d.d.d.d.d.d.d.d.d.m.e ; w Z %.C.C.d.d.d.d.d.C.o.h C.d.d.d.d.d.",
+"d.d.d.d.d.d.d.d.d.d.M.z.z ).%.Z h %.C.C.d.r.M.-.s C.d.d.d.d.d.d.",
+"d.d.d.d.d.d.d.d.d.d.d.r.N d.v.C.-.N h o.C.!.5.s -.C.d.d.d.d.d.d.",
+"d.d.d.d.d.d.d.d.d.d.d.w.N d.d.d.C.R.-.H v 5 o _ C.d.d.d.d.d.d.d.",
+"d.d.d.d.d.d.d.d.d.d.d.d.N d.d.d.d.d.C.[.d * > R U.r.d.d.d.d.d.d.",
+"d.d.d.d.d.d.d.d.d.d.d.d.h d.d.d.C.C.{ s K y + Z Y.d.d.d.d.d.d.d.",
+"d.d.d.d.d.d.d.d.d.d.d.d.h d.R.d.{ h H q.Y.U.(.L H C.d.d.d.d.d.d.",
+"d.d.d.d.d.d.d.d.d.d.q.C.H q.{ h H q.R.d.r.q.r.U.D T R.r.d.d.d.d.",
+"d.d.d.d.d.d.d.d.d.d.C.C.0 s T q.Y.d.d.d.d.d.d.d.Y.N W R.d.d.d.d.",
+"d.d.d.d.d.d.d.d.C.q.W N 9 -.R.d.d.d.d.d.d.d.d.d.r.U.h { C.d.d.d.",
+"d.d.d.d.U.C.C.q.W h T C.H q.d.d.d.d.d.d.d.d.d.d.d.d.C.h *.C.d.d.",
+"d.d.d.w.b %.W s W d.C.C.N -.d.d.d.d.d.d.d.d.d.d.d.d.d.d.q.d.d.d.",
+"d.r.!.% 1 . ( Y.).d.r.C.N -.C.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.",
+"d.r.!.u & X / D o.d.C.R.H %.v.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.",
+"d.d.r.)./ 8 :.*.H h N %.Z 2.R.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.",
+"d.d.d.d.M.s h C.R.M.o.R 7 i o.r.C.C.M.w.d.d.d.d.d.d.d.d.d.d.d.d.",
+"d.d.d.d.C.T H N C.d.C.[.I T K h N | q.C.C.C.d.r.d.d.d.d.d.d.d.d.",
+"d.d.d.d.C.{ W T { C.q.v.T %.E.M.%.T N N { q.C.Y.d.d.d.d.d.d.d.d.",
+"d.d.d.d.d.q.h C.s q.d.C.T { C.d.C.C.C.%.T N N { q.v.C.M.d.d.d.d.",
+"d.d.d.d.d.C.H w.-.h C.C.W { C.d.d.d.d.C.C.C.*.K h N W q.d.d.d.d.",
+"d.d.d.d.d.C.{ q C.K T [.T { C.d.d.d.d.d.d.d.C.C.C.-.W n -.d.d.d.",
+"d.d.d.d.r.!.# < @ `.f -.` W C.d.d.d.d.d.d.d.d.d.d.C.Y.C.d.d.d.d.",
+"d.d.d.d.r.m.r - O / :.D  . .C.d.d.d.d.d.d.d.d.d.d.d.d.w.d.d.d.d.",
+"d.d.d.d.d.d.m.1.v.{ n c 6 t U.r.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.",
+"d.d.d.d.d.d.d.M.d.C.C.c = > P U.r.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.",
+"d.d.d.d.d.d.d.d.d.d.M.4.4 : +.M.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.",
+"d.d.d.d.d.d.d.d.d.d.d.M.4.3.v.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.",
+"d.d.d.d.d.d.d.d.d.d.d.d.r.M.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d."
+};
+
+/* XPM */
+static const char *const xpm_icon_2[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 253 2 ",
+"   c #7B7B7B",
+".  c gray50",
+"X  c #222297",
+"o  c #0C0CBF",
+"O  c #0E0EBF",
+"+  c #1919B7",
+"@  c #1111BF",
+"#  c #1E1EB8",
+"$  c #2525A5",
+"%  c #3939AD",
+"&  c #2B2BBA",
+"*  c #3030B0",
+"=  c #3D3DB2",
+"-  c #454597",
+";  c #414199",
+":  c #4D4D98",
+">  c #666687",
+",  c #727288",
+"<  c #6C6C90",
+"1  c #4545A8",
+"2  c #4949A9",
+"3  c #5D5DA8",
+"4  c #6464A2",
+"5  c #6A6AA6",
+"6  c #6B6BAA",
+"7  c #0000C3",
+"8  c #0C0CC4",
+"9  c #0000CB",
+"0  c #0000CC",
+"q  c #1111C0",
+"w  c #1010C6",
+"e  c #0000DD",
+"r  c #0000E1",
+"t  c #0000E9",
+"y  c #0000EB",
+"u  c #0000F1",
+"i  c #0000F5",
+"p  c #0000F6",
+"a  c #0000FC",
+"s  c #0000FD",
+"d  c blue",
+"f  c #82828F",
+"g  c #909083",
+"h  c #90908E",
+"j  c #8A8A90",
+"k  c #929292",
+"l  c #959595",
+"z  c gray59",
+"x  c #979797",
+"c  c #989898",
+"v  c #9A9A9A",
+"b  c #9B9B9B",
+"n  c #9E9E9B",
+"m  c gray61",
+"M  c #9C9C9D",
+"N  c #9D9D9D",
+"B  c #9E9E9D",
+"V  c gray62",
+"C  c #9F9F9F",
+"Z  c #8181AC",
+"A  c #8383AF",
+"S  c #8E8EAE",
+"D  c #8F8FAE",
+"F  c #9696A0",
+"G  c #9696A5",
+"H  c #9090AE",
+"J  c #9494AF",
+"K  c #9A9AB0",
+"L  c #9E9EB1",
+"P  c #9E9EB2",
+"I  c #A0A0A0",
+"U  c gray63",
+"Y  c #A2A2A2",
+"T  c gray64",
+"R  c #A4A4A0",
+"E  c #A4A4A3",
+"W  c #A6A6A2",
+"Q  c #A4A4A4",
+"!  c #A4A4A5",
+"~  c #A5A5A5",
+"^  c gray65",
+"/  c #A7A7A7",
+"(  c #A9A9A1",
+")  c #A9A9A3",
+"_  c #A9A9A6",
+"`  c #ACACA4",
+"'  c #AFAFA4",
+"]  c #ACACA7",
+"[  c #A7A7A8",
+"{  c #A5A5AF",
+"}  c gray66",
+"|  c #A9A9A9",
+" . c #AAAAAA",
+".. c #AAAAAB",
+"X. c gray67",
+"o. c #AEAEAA",
+"O. c #ACACAC",
+"+. c gray68",
+"@. c #AEAEAE",
+"#. c #AFAFAF",
+"$. c #B0B0A4",
+"%. c #B2B2A5",
+"&. c #B0B0A9",
+"*. c #B4B4AF",
+"=. c #A7A7B4",
+"-. c #A8A8B3",
+";. c #B1B1B1",
+":. c #B0B0B3",
+">. c #B2B2B2",
+",. c #B4B4B5",
+"<. c gray71",
+"1. c #B6B6B5",
+"2. c #B6B6B6",
+"3. c #B6B6B7",
+"4. c #B7B7B7",
+"5. c #B4B4BA",
+"6. c #B5B5BA",
+"7. c gray72",
+"8. c #B8B8B9",
+"9. c #B9B9B9",
+"0. c gray73",
+"q. c #BBBBBB",
+"w. c #BCBCBB",
+"e. c #BBBBBC",
+"r. c #BBBBBD",
+"t. c #BCBCBC",
+"y. c gray74",
+"u. c gray",
+"i. c #BFBFBE",
+"p. c #BEBEBF",
+"a. c gray75",
+"s. c #CACABE",
+"d. c #C0C0C0",
+"f. c #C0C0C1",
+"g. c #C1C1C1",
+"h. c #C0C0C2",
+"j. c #C1C1C2",
+"k. c gray76",
+"l. c #C3C3C3",
+"z. c #C3C3C4",
+"x. c gray77",
+"c. c #C5C5C5",
+"v. c #C5C5C6",
+"b. c #C6C6C6",
+"n. c gray78",
+"m. c #CFCFC3",
+"M. c #C8C8C8",
+"N. c gray79",
+"B. c #C9C9CB",
+"V. c #CACACA",
+"C. c #CBCBCB",
+"Z. c #CACACC",
+"A. c #CBCBCD",
+"S. c gray80",
+"D. c #CDCDCD",
+"F. c #CECECE",
+"G. c gray81",
+"H. c #D2D2C3",
+"J. c #D6D6C5",
+"K. c #D1D1C9",
+"L. c #D6D6CD",
+"P. c #DADAC8",
+"I. c #DBDBCA",
+"U. c #D8D8CF",
+"Y. c #DDDDCC",
+"T. c #DDDDCD",
+"R. c #D0D0D0",
+"E. c gray82",
+"W. c #D2D2D2",
+"Q. c #D2D2D3",
+"!. c LightGray",
+"~. c #D4D4D3",
+"^. c #D1D1D4",
+"/. c #D2D2D4",
+"(. c #D3D3D4",
+"). c #D2D2D5",
+"_. c #D3D3D5",
+"`. c #D2D2D6",
+"'. c #D3D3D6",
+"]. c #D3D3D7",
+"[. c gray83",
+"{. c #D5D5D4",
+"}. c #D4D4D5",
+"|. c #D5D5D5",
+" X c #D4D4D6",
+".X c #D5D5D7",
+"XX c gray84",
+"oX c #D6D6D7",
+"OX c #D7D7D7",
+"+X c #D8D8D0",
+"@X c #D9D9D0",
+"#X c #DBDBD7",
+"$X c #DFDFD5",
+"%X c #DDDDD7",
+"&X c #D4D4D8",
+"*X c #D5D5D8",
+"=X c #D6D6D8",
+"-X c #D7D7D9",
+";X c #D8D8D8",
+":X c #D9D9D8",
+">X c gray85",
+",X c #DADAD9",
+"<X c #D8D8DA",
+"1X c #D9D9DA",
+"2X c #DADADA",
+"3X c #DBDBDA",
+"4X c #DADADB",
+"5X c gray86",
+"6X c #DCDCD8",
+"7X c #DDDDD8",
+"8X c #DCDCD9",
+"9X c #DEDED8",
+"0X c #DEDED9",
+"qX c #DFDFD9",
+"wX c #DDDDDA",
+"eX c #DEDEDB",
+"rX c #DADADC",
+"tX c #DBDBDC",
+"yX c #DBDBDD",
+"uX c gainsboro",
+"iX c #DCDCDD",
+"pX c #DDDDDD",
+"aX c #DFDFDD",
+"sX c gray87",
+"dX c #E0E0D2",
+"fX c #E2E2D2",
+"gX c #E2E2D5",
+"hX c #E4E4D6",
+"jX c #E8E8D7",
+"kX c #E1E1D9",
+"lX c #E1E1DB",
+"zX c #E2E2DA",
+"xX c #E5E5D8",
+"cX c #E0E0DC",
+"vX c #E1E1DC",
+"bX c #E3E3DC",
+"nX c #E3E3DD",
+"mX c #E0E0DF",
+"MX c #E2E2DF",
+"NX c #E4E4DC",
+"BX c #EBEBDE",
+"VX c #DDDDE0",
+"CX c #DFDFE0",
+"ZX c #DFDFE3",
+"AX c gray88",
+"SX c #E1E1E1",
+"DX c #E1E1E2",
+"FX c #E5E5E0",
+"GX c #E7E7E1",
+"HX c #E5E5E3",
+"JX c #E1E1E4",
+"KX c gray90",
+"LX c #E6E6E6",
+/* pixels */
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.,X|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.&X(.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.S.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.(.MX' $.MX!.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.!.uXU p.,X(.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.(.0XP o + 5.,X!.|.|.|.|.|.|.|.|.|.|.|.|.|.!.uX>. .uX!.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.(.fX2 d p 4 BX&X!.|.|.|.|.|.|.|.|.|.|.|.!.uXp.V ,X|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.(.0XH 9 w f _ b.uX,X!.(.|.|.|.|.|.|.|.(.,XS.x |.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.(.NXn W FXa.U U l.tX,X(.|.|.|.|.(.|.|.,Xb M.,X|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.,X0.0.tX,XuXz.U U l.,X,X|.(.|.(.(.uXF w.uX~.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.(.tX5.>.tX(.!.,XuXM.~ U p.,X,X&XMXFX .O.uX~.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.,X0.>.,X|.|.|.|.|.uXM.~ V a.K.S v _ uX|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.tX0.>.uX|.|.|.|.|.~.&XuXZ.$.- y 7 -.uX|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.(.,Xp.O.,X!.|.|.|.|.|.(.|.JXJ.$ a e H xX!.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.!.,Xp.O.uX|.|.|.|.~.,XuXM.U W G & % ' CX!.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.!.,Xl. .uX!.|.!.,XuXM.~ U p.,XMXI.gX! >.uX!.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.,Xl. .tX!.,XtXb.U U a.tX,X|.(.(.(.uXF 9.MX(.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.!.,Xz.~ CX,Xl.U U b.uX,X|.!.|.|.|.|.|.tXn w.uX!.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.(.,XS.X.n.V U b.,X,X(.(.|.|.|.|.|.|.|.|.|.x l.,X!.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.,XuX<.   .b.,X,X(.|.|.|.|.|.|.|.|.|.|.(.,X|.x b.,X!.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.,X|.p.V m V AX|.!.|.|.|.|.|.|.|.|.|.|.|.|.|.(.,X!.x Z.uX|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.!.|.!.|.uX|.p.V  .S.|.~ &X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.(.,XS.x M.&X|.|.|.|.|.",
+"|.|.|.|.|.|.(.0X,X(.uX|.0.b  .S.uX,XS.U ,X~.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.!.,Xb.O.0X(.|.|.|.|.",
+"|.|.|.|.|.&X@X{ p.#X,.V  .!.uX|.(.|.!.U ,X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.,X&X|.|.|.|.|.|.",
+"|.|.|.|.(.$X6 e q j <.!.0X|.!.|.|.|.!.U &X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.&XI.* d y < @X&XtX,X|.|.(.|.!.U #X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.(.0XJ @ X _ [ m X.z.|.uX,X|.!.U |.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.(.$XH.g ~ AXR.e.~ V O.l.|.,X~ |.(.(.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.(.CX-.n &.uX,X,X!.p.~ V  .k !.uX,X|.(.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.(.,Xp.>.~ l.,X!.|.,XuX|.p.. b  .a.|.uX,X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.(.|.(.U !.x |.|.|.!.|.|.uX .S.l. .V [ p.|.,XuX|.!.(.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.(.tX~ n.a.U CX!.|.|.|.|.U !.,XuX~.l. .V ~ p.!.uX,X|.!.!.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.(.tXp. .LXU 0.,X(.|.!.,XU S.&X!.|.,XuX|.l.O.V ~ 0.!.tX,X|.!.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.!.V &X|.b !.|.|.(.,X~ S.,X|.|.(.!.|.,XuX|.z.O.V ~ 0.!.uXuX|.|.(.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.!.uX~ z.uXb.b tX|.|.tX~ M.,X|.|.|.|.|.|.!.|.,XuX|.b.O.V ~ 0.R.,XuX&X&X|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.(.,Xp.&.FXuXO.O.uX!.tX~ M.,X|.|.|.|.|.|.|.|.|.(.|.,XuX,XM.&.F W <.K.#X|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.L., K @XuXm b.|.,X~ b.,X|.|.|.|.|.|.|.|.|.|.|.|.(.(.,XuX,XM. .0.,X(.|.|.|.|.",
+"|.|.|.|.|.|.|.|.(.kXZ r e A MXZ.b |.uX .z.,X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.&XuX&X|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.(.gX3 a d : fXJX0.U LX_ l.&X(.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.(.,Xs.% = U V ,.AX[ a.5.z.,X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.,XT.T.CX!. .V e.( h O.kX(.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.(.].(.(.|.uXS.&.> 0 8 -.,X(.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.(.&XhX1 d p 5 xX(.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.!.0XP q # 5.0X(.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.(.0Xs.m.0X|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.(.&X&X(.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.",
+"|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|."
+};
+
+const char *const *const xpm_icons[] = {
+    xpm_icon_0,
+    xpm_icon_1,
+    xpm_icon_2,
+};
+const int n_xpm_icons = 3;
diff --git a/icons/untangle-web.png b/icons/untangle-web.png
new file mode 100644 (file)
index 0000000..39a8bbc
Binary files /dev/null and b/icons/untangle-web.png differ
diff --git a/icons/untangle.ico b/icons/untangle.ico
new file mode 100644 (file)
index 0000000..c45d3c2
Binary files /dev/null and b/icons/untangle.ico differ
diff --git a/icons/untangle.rc b/icons/untangle.rc
new file mode 100644 (file)
index 0000000..517c71d
--- /dev/null
@@ -0,0 +1,2 @@
+#include "puzzles.rc2"
+200 ICON "untangle.ico"
diff --git a/install-sh b/install-sh
new file mode 100755 (executable)
index 0000000..59990a1
--- /dev/null
@@ -0,0 +1,508 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2014-09-12.12; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# 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 CONNEC-
+# TION 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 deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# 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.
+
+tab='  '
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
+
+    -o) chowncmd="$chownprog $2"
+        shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
+
+    -T) is_target_a_directory=never;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --) shift
+        break;;
+
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for 'test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call 'install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+        u_plus_rw=
+      else
+        u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+        u_plus_rw=
+      else
+        u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for 'test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      dstdir=`dirname "$dst"`
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+        # Create intermediate dirs using mode 755 as modified by the umask.
+        # This is like FreeBSD 'install' as of 1997-10-28.
+        umask=`umask`
+        case $stripcmd.$umask in
+          # Optimize common cases.
+          *[2367][2367]) mkdir_umask=$umask;;
+          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+          *[0-7])
+            mkdir_umask=`expr $umask + 22 \
+              - $umask % 100 % 40 + $umask % 20 \
+              - $umask % 10 % 4 + $umask % 2
+            `;;
+          *) mkdir_umask=$umask,go-w;;
+        esac
+
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+        case $umask in
+          *[123567][0-7][0-7])
+            # POSIX mkdir -p sets u+wx bits regardless of umask, which
+            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+            ;;
+          *)
+            # $RANDOM is not portable (e.g. dash);  use it when possible to
+            # lower collision chance
+            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            # As "mkdir -p" follows symlinks and we work in /tmp possibly;  so
+            # create the $tmpdir first (and fail if unsuccessful) to make sure
+            # that nobody tries to guess the $tmpdir name.
+            if (umask $mkdir_umask &&
+                $mkdirprog $mkdir_mode "$tmpdir" &&
+                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+            then
+              if test -z "$dir_arg" || {
+                   # Check for POSIX incompatibilities with -m.
+                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                   # other-writable bit of parent directory when it shouldn't.
+                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                   test_tmpdir="$tmpdir/a"
+                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+                   case $ls_ld_tmpdir in
+                     d????-?r-*) different_mode=700;;
+                     d????-?--*) different_mode=755;;
+                     *) false;;
+                   esac &&
+                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                   }
+                 }
+              then posix_mkdir=:
+              fi
+              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+            else
+              # Remove any dirs left behind by ancient mkdir implementations.
+              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+            fi
+            trap '' 0;;
+        esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
+      esac
+
+      oIFS=$IFS
+      IFS=/
+      set -f
+      set fnord $dstdir
+      shift
+      set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask=$mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # 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 $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
+       set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       set +f &&
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/list.c b/list.c
new file mode 100644 (file)
index 0000000..ec019c3
--- /dev/null
+++ b/list.c
@@ -0,0 +1,55 @@
+/*
+ * list.c: List of pointers to puzzle structures, for monolithic
+ * platforms.
+ *
+ * This file is automatically generated by mkfiles.pl. Do not edit
+ * it directly, or the changes will be lost next time mkfiles.pl runs.
+ * Instead, edit Recipe and/or its *.R subfiles.
+ */
+#include "puzzles.h"
+#define GAMELIST(A) \
+    A(blackbox) \
+    A(bridges) \
+    A(cube) \
+    A(dominosa) \
+    A(fifteen) \
+    A(filling) \
+    A(flip) \
+    A(flood) \
+    A(galaxies) \
+    A(guess) \
+    A(inertia) \
+    A(keen) \
+    A(lightup) \
+    A(loopy) \
+    A(magnets) \
+    A(map) \
+    A(mines) \
+    A(net) \
+    A(netslide) \
+    A(palisade) \
+    A(pattern) \
+    A(pearl) \
+    A(pegs) \
+    A(range) \
+    A(rect) \
+    A(samegame) \
+    A(signpost) \
+    A(singles) \
+    A(sixteen) \
+    A(slant) \
+    A(solo) \
+    A(tents) \
+    A(towers) \
+    A(tracks) \
+    A(twiddle) \
+    A(undead) \
+    A(unequal) \
+    A(unruly) \
+    A(untangle) \
+
+#define DECL(x) extern const game x;
+#define REF(x) &x,
+GAMELIST(DECL)
+const game *gamelist[] = { GAMELIST(REF) };
+const int gamecount = lenof(gamelist);
diff --git a/makedist.sh b/makedist.sh
deleted file mode 100755 (executable)
index 22b4f5d..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/sh 
-
-# Build a Unix source distribution from the Puzzles SVN area.
-#
-# Pass a version number argument to have the archive tagged with that
-# version number. Otherwise, the script will not version-tag the
-# archive at all.
-
-version="$1"
-
-if test "x$version" != "x"; then
-  arcsuffix="-$version"
-  ver="-DVER=$version"
-else
-  arcsuffix=
-  ver=
-fi
-
-perl mkfiles.pl
-./mkauto.sh
-
-mkdir tmp.$$
-mkdir tmp.$$/puzzles$arcsuffix
-mkdir tmp.$$/puzzles$arcsuffix/icons
-
-# Build Windows Help and text versions of the manual for convenience.
-halibut --winhelp=puzzles.hlp --text=puzzles.txt puzzles.but
-
-# Build a text version of the HACKING document.
-halibut --text=HACKING devel.but
-
-for i in *.c *.m *.h *.R *.rc *.but *.plist *.icns LICENCE README Recipe \
-  *.rc2 mkfiles.pl Makefile Makefile.* \
-  HACKING puzzles.txt puzzles.hlp puzzles.cnt puzzles.chm \
-  icons/Makefile icons/*.sav icons/*.pl icons/*.sh icons/win16pal.xpm \
-  icons/*.png icons/*.ico icons/*.rc icons/*.c \
-  configure.ac mkauto.sh aclocal.m4 \
-  configure depcomp install-sh missing compile; do
-  case $i in
-    */*) ln -s ../../../$i tmp.$$/puzzles$arcsuffix/$i;;
-    *)   ln -s ../../$i tmp.$$/puzzles$arcsuffix/$i;;
-  esac
-done
-
-tar -C tmp.$$ -chzf - puzzles$arcsuffix > ../puzzles$arcsuffix.tar.gz
-
-rm -rf tmp.$$
diff --git a/missing b/missing
new file mode 100755 (executable)
index 0000000..f62bbae
--- /dev/null
+++ b/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2013-10-28.13; # UTC
+
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# 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.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try '$0 --help' for more information"
+  exit 1
+fi
+
+case $1 in
+
+  --is-lightweight)
+    # Used by our autoconf macros to check whether the available missing
+    # script is modern enough.
+    exit 0
+    ;;
+
+  --run)
+    # Back-compat with the calling convention used by older automake.
+    shift
+    ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
+  bison     yacc      flex         lex       help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: unknown '$1' option"
+    echo 1>&2 "Try '$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch.  This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+  msg="probably too old"
+elif test $st -eq 127; then
+  # Program was missing.
+  msg="missing on your system"
+else
+  # Program was found and executed, but failed.  Give up.
+  exit $st
+fi
+
+perl_URL=http://www.perl.org/
+flex_URL=http://flex.sourceforge.net/
+gnu_software_URL=http://www.gnu.org/software
+
+program_details ()
+{
+  case $1 in
+    aclocal|automake)
+      echo "The '$1' program is part of the GNU Automake package:"
+      echo "<$gnu_software_URL/automake>"
+      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/autoconf>"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+    autoconf|autom4te|autoheader)
+      echo "The '$1' program is part of the GNU Autoconf package:"
+      echo "<$gnu_software_URL/autoconf/>"
+      echo "It also requires GNU m4 and Perl in order to run:"
+      echo "<$gnu_software_URL/m4/>"
+      echo "<$perl_URL>"
+      ;;
+  esac
+}
+
+give_advice ()
+{
+  # Normalize program name to check for.
+  normalized_program=`echo "$1" | sed '
+    s/^gnu-//; t
+    s/^gnu//; t
+    s/^g//; t'`
+
+  printf '%s\n' "'$1' is $msg."
+
+  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+  case $normalized_program in
+    autoconf*)
+      echo "You should only need it if you modified 'configure.ac',"
+      echo "or m4 files included by it."
+      program_details 'autoconf'
+      ;;
+    autoheader*)
+      echo "You should only need it if you modified 'acconfig.h' or"
+      echo "$configure_deps."
+      program_details 'autoheader'
+      ;;
+    automake*)
+      echo "You should only need it if you modified 'Makefile.am' or"
+      echo "$configure_deps."
+      program_details 'automake'
+      ;;
+    aclocal*)
+      echo "You should only need it if you modified 'acinclude.m4' or"
+      echo "$configure_deps."
+      program_details 'aclocal'
+      ;;
+   autom4te*)
+      echo "You might have modified some maintainer files that require"
+      echo "the 'autom4te' program to be rebuilt."
+      program_details 'autom4te'
+      ;;
+    bison*|yacc*)
+      echo "You should only need it if you modified a '.y' file."
+      echo "You may want to install the GNU Bison package:"
+      echo "<$gnu_software_URL/bison/>"
+      ;;
+    lex*|flex*)
+      echo "You should only need it if you modified a '.l' file."
+      echo "You may want to install the Fast Lexical Analyzer package:"
+      echo "<$flex_URL>"
+      ;;
+    help2man*)
+      echo "You should only need it if you modified a dependency" \
+           "of a man page."
+      echo "You may want to install the GNU Help2man package:"
+      echo "<$gnu_software_URL/help2man/>"
+    ;;
+    makeinfo*)
+      echo "You should only need it if you modified a '.texi' file, or"
+      echo "any other file indirectly affecting the aspect of the manual."
+      echo "You might want to install the Texinfo package:"
+      echo "<$gnu_software_URL/texinfo/>"
+      echo "The spurious makeinfo call might also be the consequence of"
+      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+      echo "want to install GNU make:"
+      echo "<$gnu_software_URL/make/>"
+      ;;
+    *)
+      echo "You might have modified some files without having the proper"
+      echo "tools for further handling them.  Check the 'README' file, it"
+      echo "often tells you about the needed prerequisites for installing"
+      echo "this package.  You may also peek at any GNU archive site, in"
+      echo "case some other package contains this missing '$1' program."
+      ;;
+  esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+                       -e '2,$s/^/         /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
index c0874ae07e6bfa11ff94286a6d7c81dd1aed3fa1..8772dd762104425e93a62a55edea36a9a8092536 100755 (executable)
@@ -1292,7 +1292,7 @@ if (defined $makefiles{'gtk'}) {
     "# to 1.2 if it isn't found.\n".
     "GTK_CONFIG = sh -c 'pkg-config gtk+-2.0 \$\$0 2>/dev/null || gtk-config \$\$0'\n".
     "\n".
-    &splitline("CFLAGS := -O2 -Wall -Werror -ansi -pedantic -g " .
+    &splitline("CFLAGS := -O2 -Wall -Werror -ansi  -g " .
               (join " ", map {"-I$dirpfx$_"} @srcdirs) .
               " `\$(GTK_CONFIG) --cflags` \$(CFLAGS)")."\n".
     "XLIBS = `\$(GTK_CONFIG) --libs` -lm\n".
diff --git a/mkmanpages.pl b/mkmanpages.pl
new file mode 100644 (file)
index 0000000..0b56d4c
--- /dev/null
@@ -0,0 +1,157 @@
+#!/usr/bin/perl -w
+
+# Generate manual pages for sgt-puzzles by running extracts of puzzles.but
+# through halibut.
+
+use strict;
+use File::Temp;
+use IO::File;
+use Locale::PO;
+use POSIX ();
+
+my $package = 'sgt-puzzles';
+my $language = $ARGV[0] or die 'mkmanpages.pl: no language specified';
+
+# Fake up gettext without compilation or locales
+my $po_map = Locale::PO->load_file_ashash("po/$language.po");
+sub gettext {
+    my $msgid = shift;
+    my $po = $po_map->{Locale::PO->quote($msgid)};
+    return $po ? Locale::PO->dequote($po->msgstr()) : $msgid;
+}
+
+# Header information
+my $package_roff = $package;
+$package_roff =~ s/-/\\-/g;
+my $date;
+# Translator: conventional name for manual section 6
+my $section = gettext('Games');
+my $section_no = "6";
+my $man_dir = "doc/man-$language";
+
+my %commands;
+my %short_descs;
+my $gamedesc = new IO::File('gamedesc.txt', 'r');
+while (<$gamedesc>) {
+    (my $name, undef, undef, my $desc) = split /:/;
+    $commands{$name} = $ENV{BINPREFIX} . $name;
+    $short_descs{$name} = $desc;
+}
+close $gamedesc;
+
+# We should be able to look these up with strftime('%A') but that
+# requires the relevant locale to be installed on the build host
+my @MONTHS = (gettext('January'), gettext('February'), gettext('March'),
+             gettext('April'),   gettext('May'),      gettext('June'),
+             gettext('July'),    gettext('August'),   gettext('September'),
+             gettext('October'), gettext('November'), gettext('December'));
+
+# Chapter name, initialised to dummy value to capture header
+my $name = '__HEADER__';
+
+# Contents of each chapter/appendix
+my %contents;
+
+# Gather chapters from the original documentation
+my $source_name =
+    $language eq 'en' ? 'preprocessed.but' : "doc/preprocessed.but.$language";
+my $source = new IO::File($source_name, 'r') or die "$source_name: $!";
+while (<$source>) {
+    # Look for chapter/appendix heading
+    if (/^\\[AC]{([^}]+)}\s*/) {
+       $name = $1;
+       # The odd one out - chapter name doesn't match command name
+       if ($name eq 'rectangles') {
+           $name = 'rect';
+       }
+    }
+    # Look for version ID with date
+    if (/^\\versionid .* (\d{4})(\d{2})\d{2}\./) {
+       $date = "${MONTHS[$2-1]} $1";
+    }
+    $contents{$name} .= $_;
+}
+close $source;
+
+# Remove all normal text from the header
+$contents{__HEADER__} =~ s/^(?!\\(?:cfg|define|title){).*$//gm;
+
+# Remove introduction from "common features" chapter
+$contents{common} =~ s/^.*?(?=\\H\{)//s;
+
+for my $short_name (keys %commands) {
+    my $command = $commands{$short_name};
+    print "Generating $command.6\n";
+
+    my $text_name = $language eq 'en' ? 'puzzles.txt' : "puzzles.txt.$language";
+    my $contents =
+      "\\cfg{man-mindepth}{1}\n" # don't show original chapter headings
+      . "\\cfg{man-identity}{".uc($command)."}{$section_no}{$date}{$command ($package_roff)}{$section}\n\n"
+      . "\\cfg{man-charset}{UTF-8}\n" # output encoding
+      . $contents{__HEADER__}
+      . "\\C{man-$command} $command\n\n" # dummy chapter
+      . "\\H{man-$command-name} " . gettext('NAME') . "\n\n"
+      . "\\c{$command} \\- $short_descs{$short_name}\n\n"
+      . "\\H{man-$command-synopsis} " . gettext('SYNOPSIS') . "\n\n"
+      # Translator: abbreviation for 'number'
+      . "\\cw{$command} [\\cw{--generate }\\e{" . gettext('n') . "}]\n"
+      # Translator: abbreviation for 'width'
+      . "[\\cw{--print }\\e{" . gettext('w') . "}\\cw{x}\\e{"
+      # Translator: abbreviation for 'height'
+      . gettext('h') . "} [\\cw{--with-solutions}]\n"
+      . "[\\cw{--scale }\\e{" . gettext('n') . "}] [\\cw{--colour}]]\n"
+      . "[\\e{" . gettext('game-parameters') . "}|\\e{" . gettext('game-ID')
+      . "}|\\e{" . gettext('random-seed') . "}]\n\n"
+      . "\\cw{$command --version}\n\n"
+      . "\\H{man-$command-desc} " . gettext('DESCRIPTION') . "\n\n"
+      . $contents{$short_name}
+      . $contents{common}
+      . "\\H{man-$command-see-also} " . gettext('SEE ALSO') . "\n\n"
+      # Translator: "Full documentation in <filename>."
+      . sprintf(gettext("Full documentation in %s."),
+               "/usr/share/doc/$package/$text_name.gz")
+      . "\n";
+
+    # Kluge cross-references
+    sub replace_ref {
+       my ($above, $target, $below) = @_;
+       # If the target is an earlier or later section in the current page, say
+       # it's above or below.
+       if ($above =~ m/\\(?:[CHA]|S\d*){$target}/) {
+           # Translator: earlier in the manual page
+           gettext('above');
+       } elsif ($below =~ m/\\(?:[CHA]|S\d*){$target}/) {
+           # Translator: later in the manual page
+           gettext('below');
+       }
+       # Else if the target is a bibliographic entry, include the entry directly.
+       elsif ($below =~ m/\\B\{$target\}\s*(.*?)\s*(?:\\(?:[BCHA]|S\d*|$))/s) {
+           "($1)";
+       }
+       # Else if it appears to refer to another game, convert to a customary
+       # cross-manual-page reference.
+       elsif ($target =~ /(\w+)/ && exists $commands{$1}) {
+           "\\e{$commands{$1}}($section_no)";
+       }
+       # Otherwise (and this shouldn't happen), show the reference target.
+       else {
+           print STDERR "Failed to resolve reference to $target\n";
+           $target;
+       }
+    }
+    $contents =~ s/(?:\bin\s+)?\\[kK]{([^}]+)}/replace_ref($`, $1, $')/eg;
+
+    # Run through halibut.  It does not default to using stdin or stdout,
+    # and /dev/std{in,out} apparently don't exist on some systems, so we
+    # can't reliably do this with a pipeline.
+    my ($temp_but, $temp_but_name) = mkstemp "/tmp/sgt-puzzles-but-XXXXXX"
+      or die "$!";
+    my $man_name = "$command.$section_no";
+    print $temp_but $contents or die "$!";
+    close $temp_but;
+    system "halibut --man=$man_dir/$man_name --input-charset=UTF-8 $temp_but_name";
+    unlink $temp_but_name;
+    -s "$man_dir/$man_name" or die "halibut produced an empty $man_name";
+}
+
+exit;
index 9f4aef8e537ca8dad207dc02f4fdb53724664cf7..a6592c128ca38ee168875e233b1eb41852ef8a32 100644 (file)
@@ -15,9 +15,9 @@
        <key>CFBundleExecutable</key>
        <string>Puzzles</string>
        <key>CFBundleVersion</key>
-       <string>Unidentified build</string>
+       <string>20161228.7cae89f</string>
        <key>CFBundleShortVersionString</key>
-       <string>Unidentified build</string>
+       <string>20161228.7cae89f</string>
        <key>CFBundleDevelopmentRegion</key>
        <string>en</string>
        <key>CFBundleIdentifier</key>
diff --git a/padtoolbar.bmp b/padtoolbar.bmp
deleted file mode 100644 (file)
index 46c3e0d..0000000
Binary files a/padtoolbar.bmp and /dev/null differ
diff --git a/pearl.c b/pearl.c
index 4f3be50275b1cc32e0dd2d785e56c1d6ca0f3d6f..164ff482aa4192c9fbb94683af913d3286e2ae06 100644 (file)
--- a/pearl.c
+++ b/pearl.c
@@ -274,6 +274,8 @@ static const char *validate_params(const game_params *params, int full)
     if (params->h < 5) return "Height must be at least five";
     if (params->difficulty < 0 || params->difficulty >= DIFFCOUNT)
         return "Unknown difficulty level";
+    if (params->difficulty >= DIFF_TRICKY && params->w + params->h < 11)
+       return "Width or height must be at least six for Tricky";
 
     return NULL;
 }
diff --git a/preprocessed.but b/preprocessed.but
new file mode 100644 (file)
index 0000000..0bc62ea
--- /dev/null
@@ -0,0 +1,3403 @@
+\title Simon Tatham's Portable Puzzle Collection
+
+\cfg{winhelp-filename}{puzzles.hlp}
+\cfg{winhelp-contents-titlepage}{Contents}
+
+\cfg{text-filename}{puzzles.txt}
+
+\cfg{html-contents-filename}{index.html}
+\cfg{html-template-filename}{%k.html}
+\cfg{html-index-filename}{docindex.html}
+\cfg{html-leaf-level}{1}
+\cfg{html-contents-depth-0}{1}
+\cfg{html-contents-depth-1}{2}
+\cfg{html-leaf-contains-contents}{true}
+
+\cfg{info-filename}{puzzles.info}
+
+\cfg{ps-filename}{puzzles.ps}
+\cfg{pdf-filename}{puzzles.pdf}
+
+\define{by} \u00D7{x}
+
+\define{dash} \u2013{-}
+
+\define{times} \u00D7{*}
+
+\define{divide} \u00F7{/}
+
+\define{minus} \u2212{-}
+
+This is a collection of small one-player puzzle games.
+
+\copyright This manual is copyright 2004-2014 Simon Tatham. All rights
+reserved. You may distribute this documentation under the MIT licence.
+See \k{licence} for the licence text in full.
+
+\cfg{html-local-head}{<meta name="AppleTitle" content="Puzzles Help">}
+
+\C{intro} Introduction
+
+I wrote this collection because I thought there should be more small
+desktop toys available: little games you can pop up in a window and
+play for two or three minutes while you take a break from whatever
+else you were doing. And I was also annoyed that every time I found
+a good game on (say) \i{Unix}, it wasn't available the next time I
+was sitting at a \i{Windows} machine, or vice versa; so I arranged
+that everything in my personal puzzle collection will happily run on
+both, and have more recently done a port to \i{Mac OS X} as well. When I
+find (or perhaps invent) further puzzle games that I like, they'll
+be added to this collection and will immediately be available on
+both platforms. And if anyone feels like writing any other front
+ends \dash PocketPC, Mac OS pre-10, or whatever it might be \dash
+then all the games in this framework will immediately become
+available on another platform as well.
+
+The actual games in this collection were mostly not my invention; they
+are re-implementations of existing game concepts within my portable
+puzzle framework. I do not claim credit, in general, for inventing the
+rules of any of these puzzles. (I don't even claim authorship of all
+the code; some of the puzzles have been submitted by other authors.)
+
+This collection is distributed under the \i{MIT licence} (see
+\k{licence}). This means that you can do pretty much anything you like
+with the game binaries or the code, except pretending you wrote them
+yourself, or suing me if anything goes wrong. 
+
+The most recent versions, and \i{source code}, can be found at
+\I{website}\W{http://www.chiark.greenend.org.uk/~sgtatham/puzzles/}\cw{http://www.chiark.greenend.org.uk/~sgtatham/puzzles/}.
+
+Please report \I{feedback}\i{bugs} to
+\W{mailto:anakin@pobox.com}\cw{anakin@pobox.com}.
+You might find it helpful to read this article before reporting a bug:
+
+\W{http://www.chiark.greenend.org.uk/~sgtatham/bugs.html}\cw{http://www.chiark.greenend.org.uk/~sgtatham/bugs.html}
+
+\ii{Patches} are welcome. Especially if they provide a new front end
+(to make all these games run on another platform), or a new game.
+
+
+\C{common} \ii{Common features}
+
+This chapter describes features that are common to all the games.
+
+\H{common-actions} \I{controls}Common actions
+
+These actions are all available from the \I{Game menu}\q{Game} menu
+and via \I{keys}keyboard shortcuts, in addition to any game-specific
+actions.
+
+(On \i{Mac OS X}, to conform with local user interface standards, these
+actions are situated on the \I{File menu}\q{File} and \I{Edit
+menu}\q{Edit} menus instead.)
+
+\dt \ii\e{New game} (\q{N}, Ctrl+\q{N})
+
+\dd Starts a new game, with a random initial state.
+
+\dt \ii\e{Restart game}
+
+\dd Resets the current game to its initial state. (This can be undone.)
+
+\dt \ii\e{Load}
+
+\dd Loads a saved game from a file on disk.
+
+\dt \ii\e{Save}
+
+\dd Saves the current state of your game to a file on disk.
+
+\lcont{
+
+The Load and Save operations preserve your entire game
+history (so you can save, reload, and still Undo and Redo things you
+had done before saving).
+
+}
+
+\dt \I{printing, on Windows}\e{Print}
+
+\dd Where supported (currently only on Windows), brings up a dialog
+allowing you to print an arbitrary number of puzzles randomly
+generated from the current parameters, optionally including the
+current puzzle. (Only for puzzles which make sense to print, of
+course \dash it's hard to think of a sensible printable representation
+of Fifteen!)
+
+\dt \ii\e{Undo} (\q{U}, Ctrl+\q{Z}, Ctrl+\q{_})
+
+\dd Undoes a single move. (You can undo moves back to the start of the
+session.)
+
+\dt \ii\e{Redo} (\q{R}, Ctrl+\q{R})
+
+\dd Redoes a previously undone move.
+
+\dt \ii\e{Copy}
+
+\dd Copies the current state of your game to the clipboard in text
+format, so that you can paste it into (say) an e-mail client or a
+web message board if you're discussing the game with someone else.
+(Not all games support this feature.)
+
+\dt \ii\e{Solve}
+
+\dd Transforms the puzzle instantly into its solved state. For some
+games (Cube) this feature is not supported at all because it is of
+no particular use. For other games (such as Pattern), the solved
+state can be used to give you information, if you can't see how a
+solution can exist at all or you want to know where you made a
+mistake. For still other games (such as Sixteen), automatic solution
+tells you nothing about how to \e{get} to the solution, but it does
+provide a useful way to get there quickly so that you can experiment
+with set-piece moves and transformations.
+
+\lcont{
+
+Some games (such as Solo) are capable of solving a game ID you have
+typed in from elsewhere. Other games (such as Rectangles) cannot
+solve a game ID they didn't invent themself, but when they did
+invent the game ID they know what the solution is already. Still
+other games (Pattern) can solve \e{some} external game IDs, but only
+if they aren't too difficult.
+
+The \q{Solve} command adds the solved state to the end of the undo
+chain for the puzzle. In other words, if you want to go back to
+solving it yourself after seeing the answer, you can just press Undo.
+
+}
+
+\dt \I{exit}\ii\e{Quit} (\q{Q}, Ctrl+\q{Q})
+
+\dd Closes the application entirely.
+
+\H{common-id} Specifying games with the \ii{game ID}
+
+There are two ways to save a game specification out of a puzzle and
+recreate it later, or recreate it in somebody else's copy of the
+same puzzle.
+
+The \q{\i{Specific}} and \q{\i{Random Seed}} options from the
+\I{Game menu}\q{Game} menu (or the \q{File} menu, on \i{Mac OS X}) each
+show a piece of text (a \q{game ID}) which is sufficient to
+reconstruct precisely the same game at a later date.
+
+You can enter either of these pieces of text back into the program
+(via the same \q{Specific} or \q{Random Seed} menu options) at a
+later point, and it will recreate the same game. You can also use
+either one as a \i{command line} argument (on Windows or Unix); see
+\k{common-cmdline} for more detail.
+
+The difference between the two forms is that a descriptive game ID
+is a literal \e{description} of the \i{initial state} of the game,
+whereas a random seed is just a piece of arbitrary text which was
+provided as input to the random number generator used to create the
+puzzle. This means that:
+
+\b Descriptive game IDs tend to be longer in many puzzles (although
+some, such as Cube (\k{cube}), only need very short descriptions).
+So a random seed is often a \e{quicker} way to note down the puzzle
+you're currently playing, or to tell it to somebody else so they can
+play the same one as you.
+
+\b Any text at all is a valid random seed. The automatically
+generated ones are fifteen-digit numbers, but anything will do; you
+can type in your full name, or a word you just made up, and a valid
+puzzle will be generated from it. This provides a way for two or
+more people to race to complete the same puzzle: you think of a
+random seed, then everybody types it in at the same time, and nobody
+has an advantage due to having seen the generated puzzle before
+anybody else.
+
+\b It is often possible to convert puzzles from other sources (such
+as \q{nonograms} or \q{sudoku} from newspapers) into descriptive
+game IDs suitable for use with these programs.
+
+\b Random seeds are not guaranteed to produce the same result if you
+use them with a different \i\e{version} of the puzzle program. This
+is because the generation algorithm might have been improved or
+modified in later versions of the code, and will therefore produce a
+different result when given the same sequence of random numbers. Use
+a descriptive game ID if you aren't sure that it will be used on the
+same version of the program as yours.
+
+\lcont{(Use the \q{About} menu option to find out the version number
+of the program. Programs with the same version number running on
+different platforms should still be random-seed compatible.)}
+
+\I{ID format}A descriptive game ID starts with a piece of text which
+encodes the \i\e{parameters} of the current game (such as grid
+size). Then there is a colon, and after that is the description of
+the game's initial state. A random seed starts with a similar string
+of parameters, but then it contains a hash sign followed by
+arbitrary data.
+
+If you enter a descriptive game ID, the program will not be able to
+show you the random seed which generated it, since it wasn't
+generated \e{from} a random seed. If you \e{enter} a random seed,
+however, the program will be able to show you the descriptive game
+ID derived from that random seed.
+
+Note that the game parameter strings are not always identical
+between the two forms. For some games, there will be parameter data
+provided with the random seed which is not included in the
+descriptive game ID. This is because that parameter information is
+only relevant when \e{generating} puzzle grids, and is not important
+when playing them. Thus, for example, the difficulty level in Solo
+(\k{solo}) is not mentioned in the descriptive game ID.
+
+These additional parameters are also not set permanently if you type
+in a game ID. For example, suppose you have Solo set to \q{Advanced}
+difficulty level, and then a friend wants your help with a
+\q{Trivial} puzzle; so the friend reads out a random seed specifying
+\q{Trivial} difficulty, and you type it in. The program will
+generate you the same \q{Trivial} grid which your friend was having
+trouble with, but once you have finished playing it, when you ask
+for a new game it will automatically go back to the \q{Advanced}
+difficulty which it was previously set on.
+
+\H{common-type} The \q{Type} menu
+
+The \I{Type menu}\q{Type} menu, if present, may contain a list of
+\i{preset} game settings. Selecting one of these will start a new
+random game with the parameters specified.
+
+The \q{Type} menu may also contain a \q{\i{Custom}} option which
+allows you to fine-tune game \i{parameters}. The parameters
+available are specific to each game and are described in the
+following sections.
+
+\H{common-cmdline} Specifying game parameters on the \i{command line}
+
+(This section does not apply to the \i{Mac OS X} version.)
+
+The games in this collection deliberately do not ever save
+information on to the computer they run on: they have no high score
+tables and no saved preferences. (This is because I expect at least
+some people to play them at work, and those people will probably
+appreciate leaving as little evidence as possible!)
+
+However, if you do want to arrange for one of these games to
+\I{default parameters, specifying}default to a particular set of
+parameters, you can specify them on the command line.
+
+The easiest way to do this is to set up the parameters you want
+using the \q{Type} menu (see \k{common-type}), and then to select
+\q{Random Seed} from the \q{Game} or \q{File} menu (see
+\k{common-id}). The text in the \q{Game ID} box will be composed of
+two parts, separated by a hash. The first of these parts represents
+the game parameters (the size of the playing area, for example, and
+anything else you set using the \q{Type} menu).
+
+If you run the game with just that parameter text on the command
+line, it will start up with the settings you specified.
+
+For example: if you run Cube (see \k{cube}), select \q{Octahedron}
+from the \q{Type} menu, and then go to the game ID selection, you
+will see a string of the form \cq{o2x2#338686542711620}. Take only
+the part before the hash (\cq{o2x2}), and start Cube with that text
+on the command line: \cq{cube o2x2}.
+
+If you copy the \e{entire} game ID on to the command line, the game
+will start up in the specific game that was described. This is
+occasionally a more convenient way to start a particular game ID
+than by pasting it into the game ID selection box.
+
+(You could also retrieve the encoded game parameters using the
+\q{Specific} menu option instead of \q{Random Seed}, but if you do
+then some options, such as the difficulty level in Solo, will be
+missing. See \k{common-id} for more details on this.)
+
+\H{common-unix-cmdline} \i{Unix} \i{command-line} options
+
+(This section only applies to the Unix port.)
+
+In addition to being able to specify game parameters on the command
+line (see \k{common-cmdline}), there are various other options:
+
+\dt \cw{--game}
+
+\dt \cw{--load}
+
+\dd These options respectively determine whether the command-line
+argument is treated as specifying game parameters or a \i{save} file
+to \i{load}. Only one should be specified. If neither of these options
+is specified, a guess is made based on the format of the argument.
+
+\dt \cw{--generate }\e{n}
+
+\dd If this option is specified, instead of a puzzle being displayed,
+a number of descriptive game IDs will be \I{generating game IDs}invented
+and printed on standard output. This is useful for gaining access to
+the game generation algorithms without necessarily using the frontend.
+
+\lcont{
+
+If game parameters are specified on the command-line, they will be
+used to generate the game IDs; otherwise a default set of parameters
+will be used.
+
+The most common use of this option is in conjunction with \c{--print},
+in which case its behaviour is slightly different; see below.
+
+}
+
+\dt \I{printing, on Unix}\cw{--print }\e{w}\cw{x}\e{h}
+
+\dd If this option is specified, instead of a puzzle being displayed,
+a printed representation of one or more unsolved puzzles is sent to
+standard output, in \i{PostScript} format.
+
+\lcont{
+
+On each page of puzzles, there will be \e{w} across and \e{h} down. If
+there are more puzzles than \e{w}\by\e{h}, more than one page will be
+printed.
+
+If \c{--generate} has also been specified, the invented game IDs will
+be used to generate the printed output. Otherwise, a list of game IDs
+is expected on standard input (which can be descriptive or random
+seeds; see \k{common-id}), in the same format produced by
+\c{--generate}.
+
+For example:
+
+\c net --generate 12 --print 2x3 7x7w | lpr
+
+will generate two pages of printed Net puzzles (each of which will
+have a 7\by\.7 wrapping grid), and pipe the output to the \c{lpr}
+command, which on many systems will send them to an actual printer.
+
+There are various other options which affect printing; see below.
+
+}
+
+\dt \cw{--save }\e{file-prefix} [ \cw{--save-suffix }\e{file-suffix} ]
+
+\dd If this option is specified, instead of a puzzle being
+displayed, saved-game files for one or more unsolved puzzles are
+written to files constructed from the supplied prefix and/or suffix.
+
+\lcont{
+
+If \c{--generate} has also been specified, the invented game IDs will
+be used to generate the printed output. Otherwise, a list of game IDs
+is expected on standard input (which can be descriptive or random
+seeds; see \k{common-id}), in the same format produced by
+\c{--generate}.
+
+For example:
+
+\c net --generate 12 --save game --save-suffix .sav
+
+will generate twelve Net saved-game files with the names
+\cw{game0.sav} to \cw{game11.sav}.
+
+}
+
+\dt \cw{--version}
+
+\dd Prints version information about the game, and then quits.
+
+The following options are only meaningful if \c{--print} is also
+specified:
+
+\dt \cw{--with-solutions}
+
+\dd The set of pages filled with unsolved puzzles will be followed by
+the solutions to those puzzles.
+
+\dt \cw{--scale }\e{n}
+
+\dd Adjusts how big each puzzle is when printed. Larger numbers make
+puzzles bigger; the default is 1.0.
+
+\dt \cw{--colour}
+
+\dd Puzzles will be printed in colour, rather than in black and white
+(if supported by the puzzle).
+
+
+\C{net} \i{Net}
+
+\cfg{winhelp-topic}{games.net}
+
+(\e{Note:} the \i{Windows} version of this game is called
+\i\cw{NETGAME.EXE} to avoid clashing with Windows's own \cw{NET.EXE}.)
+
+I originally saw this in the form of a Flash game called \i{FreeNet}
+\k{FreeNet}, written by Pavils Jurjans; there are several other
+implementations under the name \i{NetWalk}. The computer prepares a
+network by connecting up the centres of squares in a grid, and then
+shuffles the network by rotating every tile randomly. Your job is to
+rotate it all back into place. The successful solution will be an
+entirely connected network, with no closed loops. \#{The latter
+clause means that there are no closed paths within the network.
+Could this be clearer? "No closed paths"?} As a visual aid,
+all tiles which are connected to the one in the middle are
+highlighted. 
+
+\B{FreeNet} \W{http://www.jurjans.lv/stuff/net/FreeNet.htm}\cw{http://www.jurjans.lv/stuff/net/FreeNet.htm}
+
+\H{net-controls} \i{Net controls}
+
+\IM{Net controls} controls, for Net
+\IM{Net controls} keys, for Net
+\IM{Net controls} shortcuts (keyboard), for Net
+
+This game can be played with either the keyboard or the mouse. The
+controls are:
+
+\dt \e{Select tile}: mouse pointer, arrow keys
+
+\dt \e{Rotate tile anticlockwise}: left mouse button, \q{A} key
+
+\dt \e{Rotate tile clockwise}: right mouse button, \q{D} key
+
+\dt \e{Rotate tile by 180 degrees}: \q{F} key
+
+\dt \e{Lock (or unlock) tile}: middle mouse button, shift-click, \q{S} key
+
+\dd You can lock a tile once you're sure of its orientation. You can
+also unlock it again, but while it's locked you can't accidentally
+turn it.
+
+The following controls are not necessary to complete the game, but may
+be useful:
+
+\dt \e{Shift grid}: Shift + arrow keys
+
+\dd On grids that wrap, you can move the origin of the grid, so that
+tiles that were on opposite sides of the grid can be seen together.
+
+\dt \e{Move centre}: Ctrl + arrow keys
+
+\dd You can change which tile is used as the source of highlighting.
+(It doesn't ultimately matter which tile this is, as every tile will
+be connected to every other tile in a correct solution, but it may be
+helpful in the intermediate stages of solving the puzzle.)
+
+\dt \e{Jumble tiles}: \q{J} key
+
+\dd This key turns all tiles that are not locked to random
+orientations.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{net-params} \I{parameters, for Net}Net parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in tiles.
+
+\dt \e{Walls wrap around}
+
+\dd If checked, flow can pass from the left edge to the right edge,
+and from top to bottom, and vice versa.
+
+\dt \e{Barrier probability}
+
+\dd A number between 0.0 and 1.0 controlling whether an immovable
+barrier is placed between two tiles to prevent flow between them (a
+higher number gives more barriers). Since barriers are immovable, they
+act as constraints on the solution (i.e., hints).
+
+\lcont{
+
+The grid generation in Net has been carefully arranged so that the
+barriers are independent of the rest of the grid. This means that if
+you note down the random seed used to generate the current puzzle
+(see \k{common-id}), change the \e{Barrier probability} parameter,
+and then re-enter the same random seed, you should see exactly the
+same starting grid, with the only change being the number of
+barriers. So if you're stuck on a particular grid and need a hint,
+you could start up another instance of Net, set up the same
+parameters but a higher barrier probability, and enter the game seed
+from the original Net window.
+
+}
+
+\dt \e{Ensure unique solution}
+
+\dd Normally, Net will make sure that the puzzles it presents have
+only one solution. Puzzles with ambiguous sections can be more
+difficult and more subtle, so if you like you can turn off this
+feature and risk having ambiguous puzzles. (Also, finding \e{all}
+the possible solutions can be an additional challenge for an
+advanced player.)
+
+
+\C{cube} \i{Cube}
+
+\cfg{winhelp-topic}{games.cube}
+
+This is another one I originally saw as a web game. This one was a
+Java game \k{cube-java-game}, by Paul Scott. You have a grid of 16
+squares, six of which are blue; on one square rests a cube. Your move
+is to use the arrow keys to roll the cube through 90 degrees so that
+it moves to an adjacent square. If you roll the cube on to a blue
+square, the blue square is picked up on one face of the cube; if you
+roll a blue face of the cube on to a non-blue square, the blueness is
+put down again. (In general, whenever you roll the cube, the two faces
+that come into contact swap colours.) Your job is to get all six blue
+squares on to the six faces of the cube at the same time. Count your
+moves and try to do it in as few as possible. 
+
+Unlike the original Java game, my version has an additional feature:
+once you've mastered the game with a cube rolling on a square grid,
+you can change to a triangular grid and roll any of a tetrahedron, an
+octahedron or an icosahedron. 
+
+\B{cube-java-game} \W{http://www3.sympatico.ca/paulscott/cube/cube.htm}\cw{http://www3.sympatico.ca/paulscott/cube/cube.htm}
+
+\H{cube-controls} \i{Cube controls}
+
+\IM{Cube controls} controls, for Cube
+\IM{Cube controls} keys, for Cube
+\IM{Cube controls} shortcuts (keyboard), for Cube
+
+This game can be played with either the keyboard or the mouse.
+
+Left-clicking anywhere on the window will move the cube (or other
+solid) towards the mouse pointer.
+
+The arrow keys can also used to roll the cube on its square grid in
+the four cardinal directions.
+On the triangular grids, the mapping of arrow keys to directions is
+more approximate. Vertical movement is disallowed where it doesn't
+make sense. The four keys surrounding the arrow keys on the numeric
+keypad (\q{7}, \q{9}, \q{1}, \q{3}) can be used for diagonal movement.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{cube-params} \I{parameters, for Cube}Cube parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Type of solid}
+
+\dd Selects the solid to roll (and hence the shape of the grid):
+tetrahedron, cube, octahedron, or icosahedron.
+
+\dt \e{Width / top}, \e{Height / bottom}
+
+\dd On a square grid, horizontal and vertical dimensions. On a
+triangular grid, the number of triangles on the top and bottom rows
+respectively.
+
+
+\C{fifteen} \i{Fifteen}
+
+\cfg{winhelp-topic}{games.fifteen}
+
+The old ones are the best: this is the good old \q{\i{15-puzzle}}
+with sliding tiles. You have a 4\by\.4 square grid; 15 squares
+contain numbered tiles, and the sixteenth is empty. Your move is to
+choose a tile next to the empty space, and slide it into the space.
+The aim is to end up with the tiles in numerical order, with the
+space in the bottom right (so that the top row reads 1,2,3,4 and the
+bottom row reads 13,14,15,\e{space}).
+
+\H{fifteen-controls} \i{Fifteen controls}
+
+\IM{Fifteen controls} controls, for Fifteen
+\IM{Fifteen controls} keys, for Fifteen
+\IM{Fifteen controls} shortcuts (keyboard), for Fifteen
+
+This game can be controlled with the mouse or the keyboard.
+
+A left-click with the mouse in the row or column containing the empty
+space will move as many tiles as necessary to move the space to the
+mouse pointer.
+
+The arrow keys will move a tile adjacent to the space in the direction
+indicated (moving the space in the \e{opposite} direction).
+
+Pressing \q{h} will make a suggested move.  Pressing \q{h} enough
+times will solve the game, but it may scramble your progress while
+doing so.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{fifteen-params} \I{parameters, for Fifteen}Fifteen parameters
+
+The only options available from the \q{Custom...} option on the \q{Type}
+menu are \e{Width} and \e{Height}, which are self-explanatory. (Once
+you've changed these, it's not a \q{15-puzzle} any more, of course!)
+
+
+\C{sixteen} \i{Sixteen}
+
+\cfg{winhelp-topic}{games.sixteen}
+
+Another sliding tile puzzle, visually similar to Fifteen (see
+\k{fifteen}) but with a different type of move. This time, there is no
+hole: all 16 squares on the grid contain numbered squares. Your move
+is to shift an entire row left or right, or shift an entire column up
+or down; every time you do that, the tile you shift off the grid
+re-appears at the other end of the same row, in the space you just
+vacated. To win, arrange the tiles into numerical order (1,2,3,4 on
+the top row, 13,14,15,16 on the bottom). When you've done that, try
+playing on different sizes of grid. 
+
+I \e{might} have invented this game myself, though only by accident if
+so (and I'm sure other people have independently invented it). I
+thought I was imitating a screensaver I'd seen, but I have a feeling
+that the screensaver might actually have been a Fifteen-type puzzle
+rather than this slightly different kind. So this might be the one
+thing in my puzzle collection which represents creativity on my part
+rather than just engineering.
+
+\H{sixteen-controls} \I{controls, for Sixteen}Sixteen controls
+
+Left-clicking on an arrow will move the appropriate row or column in
+the direction indicated.  Right-clicking will move it in the opposite
+direction.
+
+Alternatively, use the cursor keys to move the position indicator
+around the edge of the grid, and use the return key to move the
+row/column in the direction indicated. 
+
+You can also move the tiles directly.  Move the cursor onto a tile,
+hold Control and press an arrow key to move the tile under the
+cursor and move the cursor along with the tile.  Or, hold Shift to
+move only the tile.  Pressing Enter simulates holding down Control
+(press Enter again to release), while pressing Space simulates
+holding down shift.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{sixteen-params} \I{parameters, for Sixteen}Sixteen parameters
+
+The parameters available from the \q{Custom...} option on the
+\q{Type} menu are:
+
+\b \e{Width} and \e{Height}, which are self-explanatory.
+
+\b You can ask for a limited shuffling operation to be performed on
+the grid. By default, Sixteen will shuffle the grid in such a way
+that any arrangement is about as probable as any other. You can
+override this by requesting a precise number of shuffling moves to
+be performed. Typically your aim is then to determine the precise
+set of shuffling moves and invert them exactly, so that you answer
+(say) a four-move shuffle with a four-move solution. Note that the
+more moves you ask for, the more likely it is that solutions shorter
+than the target length will turn out to be possible.
+
+
+\C{twiddle} \i{Twiddle}
+
+\cfg{winhelp-topic}{games.twiddle}
+
+Twiddle is a tile-rearrangement puzzle, visually similar to Sixteen
+(see \k{sixteen}): you are given a grid of square tiles, each
+containing a number, and your aim is to arrange the numbers into
+ascending order.
+
+In basic Twiddle, your move is to rotate a square group of four
+tiles about their common centre. (Orientation is not significant in
+the basic puzzle, although you can select it.) On more advanced
+settings, you can rotate a larger square group of tiles.
+
+I first saw this type of puzzle in the GameCube game \q{Metroid
+Prime 2}. In the Main Gyro Chamber in that game, there is a puzzle
+you solve to unlock a door, which is a special case of Twiddle. I
+developed this game as a generalisation of that puzzle.
+
+\H{twiddle-controls} \I{controls, for Twiddle}Twiddle controls
+
+To play Twiddle, click the mouse in the centre of the square group
+you wish to rotate. In the basic mode, you rotate a 2\by\.2 square,
+which means you have to click at a corner point where four tiles
+meet.
+
+In more advanced modes you might be rotating 3\by\.3 or even more at
+a time; if the size of the square is odd then you simply click in
+the centre tile of the square you want to rotate.
+
+Clicking with the left mouse button rotates the group anticlockwise.
+Clicking with the right button rotates it clockwise.
+
+You can also move an outline square around the grid with the cursor
+keys; the square is the size above (2\by\.2 by default, or larger).
+Pressing the return key or space bar will rotate the current square
+anticlockwise or clockwise respectively.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{twiddle-parameters} \I{parameters, for Twiddle}Twiddle parameters
+
+Twiddle provides several configuration options via the \q{Custom}
+option on the \q{Type} menu:
+
+\b You can configure the width and height of the puzzle grid.
+
+\b You can configure the size of square block that rotates at a time.
+
+\b You can ask for every square in the grid to be distinguishable
+(the default), or you can ask for a simplified puzzle in which there
+are groups of identical numbers. In the simplified puzzle your aim
+is just to arrange all the 1s into the first row, all the 2s into
+the second row, and so on.
+
+\b You can configure whether the orientation of tiles matters. If
+you ask for an orientable puzzle, each tile will have a triangle
+drawn in it. All the triangles must be pointing upwards to complete
+the puzzle.
+
+\b You can ask for a limited shuffling operation to be performed on
+the grid. By default, Twiddle will shuffle the grid so much that any
+arrangement is about as probable as any other. You can override this
+by requesting a precise number of shuffling moves to be performed.
+Typically your aim is then to determine the precise set of shuffling
+moves and invert them exactly, so that you answer (say) a four-move
+shuffle with a four-move solution. Note that the more moves you ask
+for, the more likely it is that solutions shorter than the target
+length will turn out to be possible.
+
+
+\C{rect} \i{Rectangles}
+
+\cfg{winhelp-topic}{games.rectangles}
+
+You have a grid of squares, with numbers written in some (but not all)
+of the squares. Your task is to subdivide the grid into rectangles of
+various sizes, such that (a) every rectangle contains exactly one
+numbered square, and (b) the area of each rectangle is equal to the
+number written in its numbered square.
+
+Credit for this game goes to the Japanese puzzle magazine \i{Nikoli}
+\k{nikoli-rect}; I've also seen a Palm implementation at \i{Puzzle
+Palace} \k{puzzle-palace-rect}. Unlike Puzzle Palace's
+implementation, my version automatically generates random grids of
+any size you like. The quality of puzzle design is therefore not
+quite as good as hand-crafted puzzles would be, but on the plus side
+you get an inexhaustible supply of puzzles tailored to your own
+specification.
+
+\B{nikoli-rect} \W{http://www.nikoli.co.jp/en/puzzles/shikaku.html}\cw{http://www.nikoli.co.jp/en/puzzles/shikaku.html}
+(beware of Flash)
+
+\B{puzzle-palace-rect} \W{https://web.archive.org/web/20041024001459/http://www.puzzle.gr.jp/puzzle/sikaku/palm/index.html.en}\cw{https://web.archive.org/web/20041024001459/http://www.puzzle.gr.jp/puzzle/sikaku/palm/index.html.en}
+
+\H{rectangles-controls} \I{controls, for Rectangles}Rectangles controls
+
+This game is played with the mouse or cursor keys.
+
+Left-click any edge to toggle it on or off, or left-click and drag to draw
+an entire rectangle (or line) on the grid in one go (removing any existing
+edges within that rectangle). Right-clicking and dragging will allow you
+to erase the contents of a rectangle without affecting its edges. 
+
+Alternatively, use the cursor keys to move the position indicator
+around the board. Pressing the return key then allows you to use the
+cursor keys to drag a rectangle out from that position, and pressing
+the return key again completes the rectangle. Using the space bar
+instead of the return key allows you to erase the contents of a
+rectangle without affecting its edges, as above. Pressing escape
+cancels a drag.
+
+When a rectangle of the correct size is completed, it will be shaded.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{rectangles-params} \I{parameters, for Rectangles}Rectangles parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid, in squares.
+
+\dt \e{Expansion factor}
+
+\dd This is a mechanism for changing the type of grids generated by
+the program. Some people prefer a grid containing a few large
+rectangles to one containing many small ones. So you can ask
+Rectangles to essentially generate a \e{smaller} grid than the size
+you specified, and then to expand it by adding rows and columns.
+
+\lcont{
+
+The default expansion factor of zero means that Rectangles will
+simply generate a grid of the size you ask for, and do nothing
+further. If you set an expansion factor of (say) 0.5, it means that
+each dimension of the grid will be expanded to half again as big
+after generation. In other words, the initial grid will be 2/3 the
+size in each dimension, and will be expanded to its full size
+without adding any more rectangles.
+
+Setting an expansion factor of around 0.5 tends to make the game
+more difficult, and also (in my experience) rewards a less deductive
+and more intuitive playing style. If you set it \e{too} high,
+though, the game simply cannot generate more than a few rectangles
+to cover the entire grid, and the game becomes trivial.
+
+}
+
+\dt \e{Ensure unique solution}
+
+\dd Normally, Rectangles will make sure that the puzzles it presents
+have only one solution. Puzzles with ambiguous sections can be more
+difficult and more subtle, so if you like you can turn off this
+feature and risk having ambiguous puzzles. Also, finding \e{all} the
+possible solutions can be an additional challenge for an advanced
+player. Turning off this option can also speed up puzzle generation.
+
+
+\C{netslide} \i{Netslide}
+
+\cfg{winhelp-topic}{games.netslide}
+
+This game combines the grid generation of Net (see \k{net}) with the
+movement of Sixteen (see \k{sixteen}): you have a Net grid, but
+instead of rotating tiles back into place you have to slide them
+into place by moving a whole row at a time. 
+
+As in Sixteen, \I{controls, for Netslide}control is with the mouse or
+cursor keys. See \k{sixteen-controls}.
+
+\I{parameters, for Netslide}The available game parameters have similar
+meanings to those in Net (see \k{net-params}) and Sixteen (see
+\k{sixteen-params}).
+
+Netslide was contributed to this collection by Richard Boulton.
+
+
+\C{pattern} \i{Pattern}
+
+\cfg{winhelp-topic}{games.pattern}
+
+You have a grid of squares, which must all be filled in either black
+or white. Beside each row of the grid are listed the lengths of the
+runs of black squares on that row; above each column are listed the
+lengths of the runs of black squares in that column. Your aim is to
+fill in the entire grid black or white.
+
+I first saw this puzzle form around 1995, under the name
+\q{\i{nonograms}}. I've seen it in various places since then, under
+different names.
+
+Normally, puzzles of this type turn out to be a meaningful picture
+of something once you've solved them. However, since this version
+generates the puzzles automatically, they will just look like random
+groupings of squares. (One user has suggested that this is actually
+a \e{good} thing, since it prevents you from guessing the colour of
+squares based on the picture, and forces you to use logic instead.)
+The advantage, though, is that you never run out of them.
+
+\H{pattern-controls} \I{controls, for Pattern}Pattern controls
+
+This game is played with the mouse.
+
+Left-click in a square to colour it black. Right-click to colour it
+white. If you make a mistake, you can middle-click, or hold down
+Shift while clicking with any button, to colour the square in the
+default grey (meaning \q{undecided}) again.
+
+You can click and drag with the left or right mouse button to colour
+a vertical or horizontal line of squares black or white at a time
+(respectively). If you click and drag with the middle button, or
+with Shift held down, you can colour a whole rectangle of squares
+grey.
+
+You can also move around the grid with the cursor keys. Pressing the
+return key will cycle the current cell through empty, then black, then
+white, then empty, and the space bar does the same cycle in reverse.
+
+Moving the cursor while holding Control will colour the moved-over
+squares black.  Holding Shift will colour the moved-over squares
+white, and holding both will colour them grey.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{pattern-parameters} \I{parameters, for Pattern}Pattern parameters
+
+The only options available from the \q{Custom...} option on the \q{Type}
+menu are \e{Width} and \e{Height}, which are self-explanatory.
+
+
+\C{solo} \i{Solo}
+
+\cfg{winhelp-topic}{games.solo}
+
+You have a square grid, which is divided into as many equally sized
+sub-blocks as the grid has rows. Each square must be filled in with
+a digit from 1 to the size of the grid, in such a way that
+
+\b every row contains only one occurrence of each digit
+
+\b every column contains only one occurrence of each digit
+
+\b every block contains only one occurrence of each digit.
+
+\b (optionally, by default off) each of the square's two main
+diagonals contains only one occurrence of each digit.
+
+You are given some of the numbers as clues; your aim is to place the
+rest of the numbers correctly.
+
+Under the default settings, the sub-blocks are square or
+rectangular. The default puzzle size is 3\by\.3 (a 9\by\.9 actual
+grid, divided into nine 3\by\.3 blocks). You can also select sizes
+with rectangular blocks instead of square ones, such as 2\by\.3 (a
+6\by\.6 grid divided into six 3\by\.2 blocks). Alternatively, you
+can select \q{jigsaw} mode, in which the sub-blocks are arbitrary
+shapes which differ between individual puzzles.
+
+Another available mode is \q{killer}. In this mode, clues are not
+given in the form of filled-in squares; instead, the grid is divided
+into \q{cages} by coloured lines, and for each cage the game tells
+you what the sum of all the digits in that cage should be. Also, no
+digit may appear more than once within a cage, even if the cage
+crosses the boundaries of existing regions.
+
+If you select a puzzle size which requires more than 9 digits, the
+additional digits will be letters of the alphabet. For example, if
+you select 3\by\.4 then the digits which go in your grid will be 1
+to 9, plus \cq{a}, \cq{b} and \cq{c}. This cannot be selected for
+killer puzzles.
+
+I first saw this puzzle in \i{Nikoli} \k{nikoli-solo}, although it's
+also been popularised by various newspapers under the name
+\q{Sudoku} or \q{Su Doku}.  Howard Garns is considered the inventor
+of the modern form of the puzzle, and it was first published in
+\e{Dell Pencil Puzzles and Word Games}.  A more elaborate treatment
+of the history of the puzzle can be found on Wikipedia
+\k{wikipedia-solo}.
+
+\B{nikoli-solo} \W{http://www.nikoli.co.jp/en/puzzles/sudoku.html}\cw{http://www.nikoli.co.jp/en/puzzles/sudoku.html}
+(beware of Flash)
+
+\B{wikipedia-solo} \W{http://en.wikipedia.org/wiki/Sudoku}\cw{http://en.wikipedia.org/wiki/Sudoku}
+
+\H{solo-controls} \I{controls, for Solo}Solo controls
+
+To play Solo, simply click the mouse in any empty square and then
+type a digit or letter on the keyboard to fill that square. If you
+make a mistake, click the mouse in the incorrect square and press
+Space to clear it again (or use the Undo feature).
+
+If you \e{right}-click in a square and then type a number, that
+number will be entered in the square as a \q{pencil mark}. You can
+have pencil marks for multiple numbers in the same square. Squares
+containing filled-in numbers cannot also contain pencil marks.
+
+The game pays no attention to pencil marks, so exactly what you use
+them for is up to you: you can use them as reminders that a
+particular square needs to be re-examined once you know more about a
+particular number, or you can use them as lists of the possible
+numbers in a given square, or anything else you feel like.
+
+To erase a single pencil mark, right-click in the square and type
+the same number again.
+
+All pencil marks in a square are erased when you left-click and type
+a number, or when you left-click and press space. Right-clicking and
+pressing space will also erase pencil marks.
+
+Alternatively, use the cursor keys to move the mark around the grid.
+Pressing the return key toggles the mark (from a normal mark to a
+pencil mark), and typing a number in is entered in the square in the
+appropriate way; typing in a 0 or using the space bar will clear a
+filled square. 
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{solo-parameters} \I{parameters, for Solo}Solo parameters
+
+Solo allows you to configure two separate dimensions of the puzzle
+grid on the \q{Type} menu: the number of columns, and the number of
+rows, into which the main grid is divided. (The size of a block is
+the inverse of this: for example, if you select 2 columns and 3 rows,
+each actual block will have 3 columns and 2 rows.)
+
+If you tick the \q{X} checkbox, Solo will apply the optional extra
+constraint that the two main diagonals of the grid also contain one
+of every digit. (This is sometimes known as \q{Sudoku-X} in
+newspapers.) In this mode, the squares on the two main diagonals
+will be shaded slightly so that you know it's enabled.
+
+If you tick the \q{Jigsaw} checkbox, Solo will generate randomly
+shaped sub-blocks. In this mode, the actual grid size will be taken
+to be the product of the numbers entered in the \q{Columns} and
+\q{Rows} boxes. There is no reason why you have to enter a number
+greater than 1 in both boxes; Jigsaw mode has no constraint on the
+grid size, and it can even be a prime number if you feel like it.
+
+If you tick the \q{Killer} checkbox, Solo will generate a set of
+of cages, which are randomly shaped and drawn in an outline of a
+different colour.  Each of these regions contains a smaller clue
+which shows the digit sum of all the squares in this region.
+
+You can also configure the type of symmetry shown in the generated
+puzzles. More symmetry makes the puzzles look prettier but may also
+make them easier, since the symmetry constraints can force more
+clues than necessary to be present. Completely asymmetric puzzles
+have the freedom to contain as few clues as possible.
+
+Finally, you can configure the difficulty of the generated puzzles.
+Difficulty levels are judged by the complexity of the techniques of
+deduction required to solve the puzzle: each level requires a mode
+of reasoning which was not necessary in the previous one. In
+particular, on difficulty levels \q{Trivial} and \q{Basic} there
+will be a square you can fill in with a single number at all times,
+whereas at \q{Intermediate} level and beyond you will have to make
+partial deductions about the \e{set} of squares a number could be in
+(or the set of numbers that could be in a square).
+\#{Advanced, Extreme?}
+At \q{Unreasonable} level, even this is not enough, and you will
+eventually have to make a guess, and then backtrack if it turns out
+to be wrong.
+
+Generating difficult puzzles is itself difficult: if you select one
+of the higher difficulty levels, Solo may have to make many attempts
+at generating a puzzle before it finds one hard enough for you. Be
+prepared to wait, especially if you have also configured a large
+puzzle size.
+
+
+\C{mines} \i{Mines}
+
+\cfg{winhelp-topic}{games.mines}
+
+You have a grid of covered squares, some of which contain mines, but
+you don't know which. Your job is to uncover every square which does
+\e{not} contain a mine. If you uncover a square containing a mine,
+you lose. If you uncover a square which does not contain a mine, you
+are told how many mines are contained within the eight surrounding
+squares.
+
+This game needs no introduction; popularised by Windows, it is
+perhaps the single best known desktop puzzle game in existence.
+
+This version of it has an unusual property. By default, it will
+generate its mine positions in such a way as to ensure that you
+never need to \e{guess} where a mine is: you will always be able to
+deduce it somehow. So you will never, as can happen in other
+versions, get to the last four squares and discover that there are
+two mines left but you have no way of knowing for sure where they
+are.
+
+\H{mines-controls} \I{controls, for Mines}Mines controls
+
+This game is played with the mouse.
+
+If you left-click in a covered square, it will be uncovered.
+
+If you right-click in a covered square, it will place a flag which
+indicates that the square is believed to be a mine. Left-clicking in
+a marked square will not uncover it, for safety. You can right-click
+again to remove a mark placed in error.
+
+If you left-click in an \e{uncovered} square, it will \q{clear
+around} the square. This means: if the square has exactly as many
+flags surrounding it as it should have mines, then all the covered
+squares next to it which are \e{not} flagged will be uncovered. So
+once you think you know the location of all the mines around a
+square, you can use this function as a shortcut to avoid having to
+click on each of the remaining squares one by one.
+
+If you uncover a square which has \e{no} mines in the surrounding
+eight squares, then it is obviously safe to uncover those squares in
+turn, and so on if any of them also has no surrounding mines. This
+will be done for you automatically; so sometimes when you uncover a
+square, a whole new area will open up to be explored.
+
+You can also use the cursor keys to move around the minefield.
+Pressing the return key in a covered square uncovers it, and in an
+uncovered square will clear around it (so it acts as the left button),
+pressing the space bar in a covered square will place a flag
+(similarly, it acts as the right button).
+
+All the actions described in \k{common-actions} are also available.
+
+Even Undo is available, although you might consider it cheating to
+use it. If you step on a mine, the program will only reveal the mine
+in question (unlike most other implementations, which reveal all of
+them). You can then Undo your fatal move and continue playing if you
+like. The program will track the number of times you died (and Undo
+will not reduce that counter), so when you get to the end of the
+game you know whether or not you did it without making any errors.
+
+(If you really want to know the full layout of the grid, which other
+implementations will show you after you die, you can always use the
+Solve menu option.)
+
+\H{mines-parameters} \I{parameters, for Mines}Mines parameters
+
+The options available from the \q{Custom...} option on the \q{Type}
+menu are:
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+\dt \e{Mines}
+
+\dd Number of mines in the grid. You can enter this as an absolute
+mine count, or alternatively you can put a \cw{%} sign on the end in
+which case the game will arrange for that proportion of the squares
+in the grid to be mines.
+
+\lcont{
+
+Beware of setting the mine count too high. At very high densities,
+the program may spend forever searching for a solvable grid.
+
+}
+
+\dt \e{Ensure solubility}
+
+\dd When this option is enabled (as it is by default), Mines will
+ensure that the entire grid can be fully deduced starting from the
+initial open space. If you prefer the riskier grids generated by
+other implementations, you can switch off this option.
+
+
+\C{samegame} \i{Same Game}
+
+\cfg{winhelp-topic}{games.samegame}
+
+You have a grid of coloured squares, which you have to clear by 
+highlighting contiguous regions of more than one coloured square;
+the larger the region you highlight, the more points you get (and
+the faster you clear the arena).
+
+If you clear the grid you win. If you end up with nothing but 
+single squares (i.e., there are no more clickable regions left) you
+lose.
+
+Removing a region causes the rest of the grid to shuffle up:
+blocks that are suspended will fall down (first), and then empty
+columns are filled from the right. 
+
+Same Game was contributed to this collection by James Harvey.
+
+\H{samegame-controls} \i{Same Game controls}
+
+\IM{Same Game controls} controls, for Same Game
+\IM{Same Game controls} keys, for Same Game
+\IM{Same Game controls} shortcuts (keyboard), for Same Game
+
+This game can be played with either the keyboard or the mouse.
+
+If you left-click an unselected region, it becomes selected (possibly
+clearing the current selection). 
+
+If you left-click the selected region, it will be removed (and the
+rest of the grid shuffled immediately).
+
+If you right-click the selected region, it will be unselected. 
+
+The cursor keys move a cursor around the grid. Pressing the Space or
+Enter keys while the cursor is in an unselected region selects it;
+pressing Space or Enter again removes it as above.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{samegame-parameters} \I{parameters, for Same Game}Same Game parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+\dt \e{No. of colours}
+
+\dd Number of different colours used to fill the grid; the more colours,
+the fewer large regions of colour and thus the more difficult it is to
+successfully clear the grid.
+
+\dt \e{Scoring system}
+
+\dd Controls the precise mechanism used for scoring. With the default
+system, \q{(n-2)^2}, only regions of three squares or more will score
+any points at all. With the alternative \q{(n-1)^2} system, regions of
+two squares score a point each, and larger regions score relatively
+more points.
+
+\dt \e{Ensure solubility}
+
+\dd If this option is ticked (the default state), generated grids
+will be guaranteed to have at least one solution.
+
+\lcont{
+
+If you turn it off, the game generator will not try to guarantee
+soluble grids; it will, however, still ensure that there are at
+least 2 squares of each colour on the grid at the start (since a
+grid with exactly one square of a given colour is \e{definitely}
+insoluble). Grids generated with this option disabled may contain
+more large areas of contiguous colour, leading to opportunities for
+higher scores; they can also take less time to generate.
+
+}
+
+
+\C{flip} \i{Flip}
+
+\cfg{winhelp-topic}{games.flip}
+
+You have a grid of squares, some light and some dark. Your aim is to
+light all the squares up at the same time. You can choose any square
+and flip its state from light to dark or dark to light, but when you
+do so, other squares around it change state as well.
+
+Each square contains a small diagram showing which other squares
+change when you flip it.
+
+\H{flip-controls} \i{Flip controls}
+
+\IM{Flip controls} controls, for Flip
+\IM{Flip controls} keys, for Flip
+\IM{Flip controls} shortcuts (keyboard), for Flip
+
+This game can be played with either the keyboard or the mouse.
+
+Left-click in a square to flip it and its associated squares, or
+use the cursor keys to choose a square and the space bar or Enter
+key to flip.
+
+If you use the \q{Solve} function on this game, it will mark some of
+the squares in red. If you click once in every square with a red
+mark, the game should be solved. (If you click in a square
+\e{without} a red mark, a red mark will appear in it to indicate
+that you will need to reverse that operation to reach the solution.)
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{flip-parameters} \I{parameters, for flip}Flip parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+\dt \e{Shape type}
+
+\dd This control determines the shape of the region which is flipped
+by clicking in any given square. The default setting, \q{Crosses},
+causes every square to flip itself and its four immediate neighbours
+(or three or two if it's at an edge or corner). The other setting,
+\q{Random}, causes a random shape to be chosen for every square, so
+the game is different every time.
+
+
+\C{guess} \i{Guess}
+
+\cfg{winhelp-topic}{games.guess}
+
+You have a set of coloured pegs, and have to reproduce a
+predetermined sequence of them (chosen by the computer) within a
+certain number of guesses. 
+
+Each guess gets marked with the number of correctly-coloured pegs
+in the correct places (in black), and also the number of
+correctly-coloured pegs in the wrong places (in white). 
+
+This game is also known (and marketed, by Hasbro, mainly) as
+a board game \q{\i{Mastermind}}, with 6 colours, 4 pegs per row,
+and 10 guesses. However, this version allows custom settings of number
+of colours (up to 10), number of pegs per row, and number of guesses. 
+
+Guess was contributed to this collection by James Harvey.
+
+\H{guess-controls} \i{Guess controls}
+
+\IM{Guess controls} controls, for Guess
+\IM{Guess controls} keys, for Guess
+\IM{Guess controls} shortcuts (keyboard), for Guess
+
+This game can be played with either the keyboard or the mouse.
+
+With the mouse, drag a coloured peg from the tray on the left-hand
+side to its required position in the current guess; pegs may also be
+dragged from current and past guesses to copy them elsewhere. To
+remove a peg, drag it off its current position to somewhere invalid.
+
+Right-clicking in the current guess adds a \q{hold} marker; pegs
+that have hold markers will be automatically added to the next guess
+after marking.
+
+Alternatively, with the keyboard, the up and down cursor keys can be
+used to select a peg colour, the left and right keys to select a
+peg position, and the space bar or Enter key to place a peg of the
+selected colour in the chosen position. \q{D} or Backspace removes a
+peg, and Space adds a hold marker.
+
+Pressing \q{h} or \q{?} will fill the current guess with a suggested
+guess.  Using this is not recommended for 10 or more pegs as it is
+slow.
+
+When the guess is complete, the smaller feedback pegs will be highlighted;
+clicking on these (or moving the peg cursor to them with the arrow keys
+and pressing the space bar or Enter key) will mark the current guess,
+copy any held pegs to the next guess, and move the \q{current guess}
+marker.
+
+If you correctly position all the pegs the solution will be displayed
+below; if you run out of guesses (or select \q{Solve...}) the solution
+will also be revealed.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{guess-parameters} \I{parameters, for Guess}Guess parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu. The default game matches the parameters for the 
+board game \q{Mastermind}. 
+
+\dt \e{Colours}
+
+\dd Number of colours the solution is chosen from; from 2 to 10
+(more is harder).
+
+\dt \e{Pegs per guess}
+
+\dd Number of pegs per guess (more is harder).
+
+\dt \e{Guesses}
+
+\dd Number of guesses you have to find the solution in (fewer is harder).
+
+\dt \e{Allow blanks}
+
+\dd Allows blank pegs to be given as part of a guess (makes it easier, because
+you know that those will never be counted as part of the solution). This
+is turned off by default. 
+
+\lcont{
+
+Note that this doesn't allow blank pegs in the solution; if you really wanted
+that, use one extra colour.
+
+}
+
+\dt \e{Allow duplicates}
+
+\dd Allows the solution (and the guesses) to contain colours more than once;
+this increases the search space (making things harder), and is turned on by
+default.
+
+
+\C{pegs} \i{Pegs}
+
+\cfg{winhelp-topic}{games.pegs}
+
+A number of pegs are placed in holes on a board. You can remove a
+peg by jumping an adjacent peg over it (horizontally or vertically)
+to a vacant hole on the other side. Your aim is to remove all but one
+of the pegs initially present.
+
+This game, best known as \I{Solitaire, Peg}\q{Peg Solitaire}, is
+possibly one of the oldest puzzle games still commonly known.
+
+\H{pegs-controls} \i{Pegs controls}
+
+\IM{Pegs controls} controls, for Pegs
+
+To move a peg, drag it with the mouse from its current position to
+its final position. If the final position is exactly two holes away
+from the initial position, is currently unoccupied by a peg, and
+there is a peg in the intervening square, the move will be permitted
+and the intervening peg will be removed.
+
+Vacant spaces which you can move a peg into are marked with holes. A
+space with no peg and no hole is not available for moving at all: it
+is an obstacle which you must work around.
+
+You can also use the cursor keys to move a position indicator around
+the board. Pressing the return key while over a peg, followed by a
+cursor key, will jump the peg in that direction (if that is a legal
+move).
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{pegs-parameters} \I{parameters, for Pegs}Pegs parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in holes.
+
+\dt \e{Board type}
+
+\dd Controls whether you are given a board of a standard shape or a
+randomly generated shape. The two standard shapes currently
+supported are \q{Cross} and \q{Octagon} (also commonly known as the
+English and European traditional board layouts respectively).
+Selecting \q{Random} will give you a different board shape every
+time (but always one that is known to have a solution).
+
+
+\C{dominosa} \i{Dominosa}
+
+\cfg{winhelp-topic}{games.dominosa}
+
+A normal set of dominoes \dash that is, one instance of every
+(unordered) pair of numbers from 0 to 6 \dash has been arranged
+irregularly into a rectangle; then the number in each square has
+been written down and the dominoes themselves removed. Your task is
+to reconstruct the pattern by arranging the set of dominoes to match
+the provided array of numbers.
+
+This puzzle is widely credited to O. S. Adler, and takes part of its
+name from those initials.
+
+\H{dominosa-controls} \i{Dominosa controls}
+
+\IM{Dominosa controls} controls, for Dominosa
+
+Left-clicking between any two adjacent numbers places a domino
+covering them, or removes one if it is already present. Trying to
+place a domino which overlaps existing dominoes will remove the ones
+it overlaps.
+
+Right-clicking between two adjacent numbers draws a line between
+them, which you can use to remind yourself that you know those two
+numbers are \e{not} covered by a single domino. Right-clicking again
+removes the line.
+
+You can also use the cursor keys to move a cursor around the grid.
+When the cursor is half way between two adjacent numbers, pressing
+the return key will place a domino covering those numbers, or
+pressing the space bar will lay a line between the two squares.
+Repeating either action removes the domino or line.
+
+Pressing a number key will highlight all occurrences of that
+number. Pressing that number again will clear the highlighting. Up to two
+different numbers can be highlighted at any given time.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{dominosa-parameters} \I{parameters, for Dominosa}Dominosa parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Maximum number on dominoes}
+
+\dd Controls the size of the puzzle, by controlling the size of the
+set of dominoes used to make it. Dominoes with numbers going up to N
+will give rise to an (N+2) \by (N+1) rectangle; so, in particular,
+the default value of 6 gives an 8\by\.7 grid.
+
+\dt \e{Ensure unique solution}
+
+\dd Normally, Dominosa will make sure that the puzzles it presents
+have only one solution. Puzzles with ambiguous sections can be more
+difficult and sometimes more subtle, so if you like you can turn off
+this feature. Also, finding \e{all} the possible solutions can be an
+additional challenge for an advanced player. Turning off this option
+can also speed up puzzle generation.
+
+
+\C{untangle} \i{Untangle}
+
+\cfg{winhelp-topic}{games.untangle}
+
+You are given a number of points, some of which have lines drawn
+between them. You can move the points about arbitrarily; your aim is
+to position the points so that no line crosses another.
+
+I originally saw this in the form of a Flash game called \i{Planarity}
+\k{Planarity}, written by John Tantalo.
+
+\B{Planarity} \W{http://planarity.net}\cw{http://planarity.net}
+
+\H{untangle-controls} \i{Untangle controls}
+
+\IM{Untangle controls} controls, for Untangle
+
+To move a point, click on it with the left mouse button and drag it
+into a new position.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{untangle-parameters} \I{parameters, for Untangle}Untangle parameters
+
+There is only one parameter available from the \q{Custom...} option
+on the \q{Type} menu:
+
+\dt \e{Number of points}
+
+\dd Controls the size of the puzzle, by specifying the number of
+points in the generated graph.
+
+
+\C{blackbox} \i{Black Box}
+
+\cfg{winhelp-topic}{games.blackbox}
+
+A number of balls are hidden in a rectangular arena. You have to
+deduce the positions of the balls by firing lasers positioned at
+the edges of the arena and observing how their beams are deflected. 
+
+Beams will travel straight from their origin until they hit the
+opposite side of the arena (at which point they emerge), unless
+affected by balls in one of the following ways:
+
+\b A beam that hits a ball head-on is absorbed and will never
+   re-emerge. This includes beams that meet a ball on the first rank
+   of the arena.
+
+\b A beam with a ball in its front-left square and no ball ahead of it
+   gets deflected 90 degrees to the right.
+
+\b A beam with a ball in its front-right square and no ball ahead of
+   it gets similarly deflected to the left.
+
+\b A beam that would re-emerge from its entry location is considered to be
+   \q{reflected}. 
+
+\b A beam which would get deflected before entering the arena by a
+   ball to the front-left or front-right of its entry point is also
+   considered to be \q{reflected}.
+
+Beams that are reflected appear as a \q{R}; beams that hit balls
+head-on appear as \q{H}. Otherwise, a number appears at the firing
+point and the location where the beam emerges (this number is unique
+to that shot).
+
+You can place guesses as to the location of the balls, based on the
+entry and exit patterns of the beams; once you have placed enough
+balls a button appears enabling you to have your guesses checked. 
+
+Here is a diagram showing how the positions of balls can create each
+of the beam behaviours shown above:
+
+\c  1RHR---- 
+\c |..O.O...|
+\c 2........3
+\c |........|
+\c |........|
+\c 3........|
+\c |......O.|
+\c H........|
+\c |.....O..|
+\c  12-RR---
+
+As shown, it is possible for a beam to receive multiple reflections
+before re-emerging (see turn 3). Similarly, a beam may be reflected
+(possibly more than once) before receiving a hit (the \q{H} on the
+left side of the example).
+
+Note that any layout with more than 4 balls may have a non-unique
+solution.  The following diagram illustrates this; if you know the
+board contains 5 balls, it is impossible to determine where the fifth
+ball is (possible positions marked with an \cw{x}):
+
+\c  -------- 
+\c |........|
+\c |........|
+\c |..O..O..|
+\c |...xx...|
+\c |...xx...|
+\c |..O..O..|
+\c |........|
+\c |........|
+\c  --------
+
+For this reason, when you have your guesses checked, the game will
+check that your solution \e{produces the same results} as the
+computer's, rather than that your solution is identical to the
+computer's. So in the above example, you could put the fifth ball at
+\e{any} of the locations marked with an \cw{x}, and you would still
+win.
+
+Black Box was contributed to this collection by James Harvey.
+
+\H{blackbox-controls} \i{Black Box controls}
+
+\IM{Black Box controls} controls, for Black Box
+\IM{Black Box controls} keys, for Black Box
+\IM{Black Box controls} shortcuts (keyboard), for Black Box
+
+To fire a laser beam, left-click in a square around the edge of the
+arena. The results will be displayed immediately. Clicking or holding
+the left button on one of these squares will highlight the current go
+(or a previous go) to confirm the exit point for that laser, if
+applicable.
+
+To guess the location of a ball, left-click within the arena and a
+black circle will appear marking the guess; click again to remove the
+guessed ball.
+
+Locations in the arena may be locked against modification by
+right-clicking; whole rows and columns may be similarly locked by
+right-clicking in the laser square above/below that column, or to the
+left/right of that row.
+
+The cursor keys may also be used to move around the grid. Pressing the
+Enter key will fire a laser or add a new ball-location guess, and
+pressing Space will lock a cell, row, or column.
+
+When an appropriate number of balls have been guessed, a button will
+appear at the top-left corner of the grid; clicking that (with mouse
+or cursor) will check your guesses. 
+
+If you click the \q{check} button and your guesses are not correct,
+the game will show you the minimum information necessary to
+demonstrate this to you, so you can try again. If your ball
+positions are not consistent with the beam paths you already know
+about, one beam path will be circled to indicate that it proves you
+wrong. If your positions match all the existing beam paths but are
+still wrong, one new beam path will be revealed (written in red)
+which is not consistent with your current guesses.
+
+If you decide to give up completely, you can select Solve to reveal
+the actual ball positions. At this point, correctly-placed balls
+will be displayed as filled black circles, incorrectly-placed balls
+as filled black circles with red crosses, and missing balls as filled
+red circles. In addition, a red circle marks any laser you had already
+fired which is not consistent with your ball layout (just as when you
+press the \q{check} button), and red text marks any laser you
+\e{could} have fired in order to distinguish your ball layout from the
+correct one.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{blackbox-parameters} \I{parameters, for Black Box}Black Box parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares. There are 2 \by \e{Width} \by \e{Height} lasers 
+per grid, two per row and two per column. 
+
+\dt \e{No. of balls}
+
+\dd Number of balls to place in the grid. This can be a single number,
+or a range (separated with a hyphen, like \q{2-6}), and determines the
+number of balls to place on the grid. The \q{reveal} button is only
+enabled if you have guessed an appropriate number of balls; a guess
+using a different number to the original solution is still acceptable,
+if all the beam inputs and outputs match.
+
+
+\C{slant} \i{Slant}
+
+\cfg{winhelp-topic}{games.slant}
+
+You have a grid of squares. Your aim is to draw a diagonal line
+through each square, and choose which way each line slants so that
+the following conditions are met:
+
+\b The diagonal lines never form a loop.
+
+\b Any point with a circled number has precisely that many lines
+meeting at it. (Thus, a 4 is the centre of a cross shape, whereas a
+zero is the centre of a diamond shape \dash or rather, a partial
+diamond shape, because a zero can never appear in the middle of the
+grid because that would immediately cause a loop.)
+
+Credit for this puzzle goes to \i{Nikoli} \k{nikoli-slant}.
+
+\B{nikoli-slant}
+\W{http://www.nikoli.co.jp/ja/puzzles/gokigen_naname}\cw{http://www.nikoli.co.jp/ja/puzzles/gokigen_naname}
+(in Japanese)
+
+\H{slant-controls} \i{Slant controls}
+
+\IM{Slant controls} controls, for Slant
+
+Left-clicking in a blank square will place a \cw{\\} in it (a line
+leaning to the left, i.e. running from the top left of the square to
+the bottom right). Right-clicking in a blank square will place a
+\cw{/} in it (leaning to the right, running from top right to bottom
+left).
+
+Continuing to click either button will cycle between the three
+possible square contents. Thus, if you left-click repeatedly in a
+blank square it will change from blank to \cw{\\} to \cw{/} back to
+blank, and if you right-click repeatedly the square will change from
+blank to \cw{/} to \cw{\\} back to blank. (Therefore, you can play
+the game entirely with one button if you need to.)
+
+You can also use the cursor keys to move around the grid. Pressing the
+return or space keys will place a \cw{\\} or a \cw{/}, respectively,
+and will then cycle them as above.  You can also press \cw{/} or
+\cw{\\} to place a \cw{/} or \cw{\\}, respectively, independent of
+what is already in the cursor square.  Backspace removes any line from
+the cursor square.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{slant-parameters} \I{parameters, for Slant}Slant parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+\dt \e{Difficulty}
+
+\dd Controls the difficulty of the generated puzzle. At Hard level,
+you are required to do deductions based on knowledge of
+\e{relationships} between squares rather than always being able to
+deduce the exact contents of one square at a time. (For example, you
+might know that two squares slant in the same direction, even if you
+don't yet know what that direction is, and this might enable you to
+deduce something about still other squares.) Even at Hard level,
+guesswork and backtracking should never be necessary.
+
+
+\C{lightup} \i{Light Up}
+
+\cfg{winhelp-topic}{games.lightup}
+
+You have a grid of squares. Some are filled in black; some of the
+black squares are numbered. Your aim is to \q{light up} all the
+empty squares by placing light bulbs in some of them.
+
+Each light bulb illuminates the square it is on, plus all squares in
+line with it horizontally or vertically unless a black square is
+blocking the way.
+
+To win the game, you must satisfy the following conditions:
+
+\b All non-black squares are lit.
+
+\b No light is lit by another light.
+
+\b All numbered black squares have exactly that number of lights adjacent to
+   them (in the four squares above, below, and to the side).
+
+Non-numbered black squares may have any number of lights adjacent to them. 
+
+Credit for this puzzle goes to \i{Nikoli} \k{nikoli-lightup}.
+
+Light Up was contributed to this collection by James Harvey.
+
+\B{nikoli-lightup}
+\W{http://www.nikoli.co.jp/en/puzzles/akari.html}\cw{http://www.nikoli.co.jp/en/puzzles/akari.html}
+(beware of Flash)
+
+\H{lightup-controls} \i{Light Up controls}
+
+\IM{Light Up controls} controls, for Light Up
+
+Left-clicking in a non-black square will toggle the presence of a light
+in that square. Right-clicking in a non-black square toggles a mark there to aid
+solving; it can be used to highlight squares that cannot be lit, for example. 
+
+You may not place a light in a marked square, nor place a mark in a lit square.
+
+The game will highlight obvious errors in red. Lights lit by other
+lights are highlighted in this way, as are numbered squares which
+do not (or cannot) have the right number of lights next to them.
+  
+Thus, the grid is solved when all non-black squares have yellow
+highlights and there are no red lights.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{lightup-parameters} \I{parameters, for Light Up}Light Up parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+\dt \e{%age of black squares}
+
+\dd Rough percentage of black squares in the grid.
+
+\lcont{
+
+This is a hint rather than an instruction. If the grid generator is
+unable to generate a puzzle to this precise specification, it will
+increase the proportion of black squares until it can.
+
+}
+
+\dt \e{Symmetry}
+
+\dd Allows you to specify the required symmetry of the black squares
+in the grid. (This does not affect the difficulty of the puzzles
+noticeably.)
+
+\dt \e{Difficulty}
+
+\dd \q{Easy} means that the puzzles should be soluble without
+backtracking or guessing, \q{Hard} means that some guesses will
+probably be necessary.
+
+
+\C{map} \i{Map}
+
+\cfg{winhelp-topic}{games.map}
+
+You are given a map consisting of a number of regions. Your task is
+to colour each region with one of four colours, in such a way that
+no two regions sharing a boundary have the same colour. You are
+provided with some regions already coloured, sufficient to make the
+remainder of the solution unique.
+
+Only regions which share a length of border are required to be
+different colours. Two regions which meet at only one \e{point}
+(i.e. are diagonally separated) may be the same colour.
+
+I believe this puzzle is original; I've never seen an implementation
+of it anywhere else. The concept of a \i{four-colouring} puzzle was
+suggested by Owen Dunn; credit must also go to Nikoli and to Verity
+Allan for inspiring the train of thought that led to me realising
+Owen's suggestion was a viable puzzle. Thanks also to Gareth Taylor
+for many detailed suggestions.
+
+\H{map-controls} \i{Map controls}
+
+\IM{Map controls} controls, for Map
+
+To colour a region, click the left mouse button on an existing
+region of the desired colour and drag that colour into the new
+region.
+
+(The program will always ensure the starting puzzle has at least one
+region of each colour, so that this is always possible!)
+
+If you need to clear a region, you can drag from an empty region, or
+from the puzzle boundary if there are no empty regions left.
+
+Dragging a colour using the \e{right} mouse button will stipple the
+region in that colour, which you can use as a note to yourself that
+you think the region \e{might} be that colour. A region can contain
+stipples in multiple colours at once. (This is often useful at the
+harder difficulty levels.)
+
+You can also use the cursor keys to move around the map: the colour of
+the cursor indicates the position of the colour you would drag (which
+is not obvious if you're on a region's boundary, since it depends on the
+direction from which you approached the boundary). Pressing the return
+key starts a drag of that colour, as above, which you control with the
+cursor keys; pressing the return key again finishes the drag. The
+space bar can be used similarly to create a stippled region. 
+Double-pressing the return key (without moving the cursor) will clear
+the region, as a drag from an empty region does: this is useful with
+the cursor mode if you have filled the entire map in but need to 
+correct the layout.
+
+If you press L during play, the game will toggle display of a number
+in each region of the map. This is useful if you want to discuss a
+particular puzzle instance with a friend \dash having an unambiguous
+name for each region is much easier than trying to refer to them all
+by names such as \q{the one down and right of the brown one on the
+top border}.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{map-parameters} \I{parameters, for Map}Map parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+\dt \e{Regions}
+
+\dd Number of regions in the generated map.
+
+\dt \e{Difficulty}
+
+\dd In \q{Easy} mode, there should always be at least one region
+whose colour can be determined trivially. In \q{Normal} and \q{Hard}
+modes, you will have to use increasingly complex logic to deduce the
+colour of some regions. However, it will always be possible without
+having to guess or backtrack.
+
+\lcont{
+
+In \q{Unreasonable} mode, the program will feel free to generate
+puzzles which are as hard as it can possibly make them: the only
+constraint is that they should still have a unique solution. Solving
+Unreasonable puzzles may require guessing and backtracking.
+
+}
+
+
+\C{loopy} \i{Loopy}
+
+\cfg{winhelp-topic}{games.loopy}
+
+You are given a grid of dots, marked with yellow lines to indicate
+which dots you are allowed to connect directly together. Your aim is
+to use some subset of those yellow lines to draw a single unbroken
+loop from dot to dot within the grid.
+
+Some of the spaces between the lines contain numbers. These numbers
+indicate how many of the lines around that space form part of the
+loop. The loop you draw must correctly satisfy all of these clues to
+be considered a correct solution.
+
+In the default mode, the dots are arranged in a grid of squares;
+however, you can also play on triangular or hexagonal grids, or even
+more exotic ones.
+
+Credit for the basic puzzle idea goes to \i{Nikoli}
+\k{nikoli-loopy}.
+
+Loopy was originally contributed to this collection by Mike Pinna,
+and subsequently enhanced to handle various types of non-square grid
+by Lambros Lambrou.
+
+\B{nikoli-loopy}
+\W{http://www.nikoli.co.jp/en/puzzles/slitherlink.html}\cw{http://www.nikoli.co.jp/en/puzzles/slitherlink.html}
+(beware of Flash)
+
+\H{loopy-controls} \i{Loopy controls}
+
+\IM{Loopy controls} controls, for Loopy
+
+Click the left mouse button on a yellow line to turn it black,
+indicating that you think it is part of the loop. Click again to
+turn the line yellow again (meaning you aren't sure yet).
+
+If you are sure that a particular line segment is \e{not} part of
+the loop, you can click the right mouse button to remove it
+completely. Again, clicking a second time will turn the line back to
+yellow.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{loopy-parameters} \I{parameters, for Loopy}Loopy parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid, measured in number of regions across and down. For
+square grids, it's clear how this is counted; for other types of
+grid you may have to think a bit to see how the dimensions are
+measured.
+
+\dt \e{Grid type}
+
+\dd Allows you to choose between a selection of types of tiling.
+Some have all the faces the same but may have multiple different
+types of vertex (e.g. the \e{Cairo} or \e{Kites} mode); others have
+all the vertices the same but may have different types of face (e.g.
+the \e{Great Hexagonal}). The square, triangular and honeycomb grids
+are fully regular, and have all their vertices \e{and} faces the
+same; this makes them the least confusing to play.
+
+\dt \e{Difficulty}
+
+\dd Controls the difficulty of the generated puzzle.
+\#{FIXME: what distinguishes Easy, Medium, and Hard? In particular,
+when are backtracking/guesswork required, if ever?}
+
+
+\C{inertia} \i{Inertia}
+
+\cfg{winhelp-topic}{games.inertia}
+
+You are a small green ball sitting in a grid full of obstacles. Your
+aim is to collect all the gems without running into any mines.
+
+You can move the ball in any orthogonal \e{or diagonal} direction.
+Once the ball starts moving, it will continue until something stops
+it. A wall directly in its path will stop it (but if it is moving
+diagonally, it will move through a diagonal gap between two other
+walls without stopping). Also, some of the squares are \q{stops};
+when the ball moves on to a stop, it will stop moving no matter what
+direction it was going in. Gems do \e{not} stop the ball; it picks
+them up and keeps on going.
+
+Running into a mine is fatal. Even if you picked up the last gem in
+the same move which then hit a mine, the game will count you as dead
+rather than victorious.
+
+This game was originally implemented for Windows by Ben Olmstead
+\k{bem}, who was kind enough to release his source code on request
+so that it could be re-implemented for this collection.
+
+\B{bem} \W{http://xn13.com/}\cw{http://xn13.com/}
+
+\H{inertia-controls} \i{Inertia controls}
+
+\IM{Inertia controls} controls, for Inertia
+\IM{Inertia controls} keys, for Inertia
+\IM{Inertia controls} shortcuts (keyboard), for Inertia
+
+You can move the ball in any of the eight directions using the
+numeric keypad. Alternatively, if you click the left mouse button on
+the grid, the ball will begin a move in the general direction of
+where you clicked.
+
+If you use the \q{Solve} function on this game, the program will
+compute a path through the grid which collects all the remaining
+gems and returns to the current position. A hint arrow will appear
+on the ball indicating the direction in which you should move to
+begin on this path. If you then move in that direction, the arrow
+will update to indicate the next direction on the path. You can also
+press Space to automatically move in the direction of the hint
+arrow. If you move in a different direction from the one shown by
+the arrow, arrows will be shown only if the puzzle is still solvable.
+
+All the actions described in \k{common-actions} are also available.
+In particular, if you do run into a mine and die, you can use the
+Undo function and resume playing from before the fatal move. The
+game will keep track of the number of times you have done this.
+
+\H{inertia-parameters} \I{parameters, for Inertia}Inertia parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+
+\C{tents} \i{Tents}
+
+\cfg{winhelp-topic}{games.tents}
+
+You have a grid of squares, some of which contain trees. Your aim is
+to place tents in some of the remaining squares, in such a way that
+the following conditions are met:
+
+\b There are exactly as many tents as trees.
+
+\b The tents and trees can be matched up in such a way that each
+tent is directly adjacent (horizontally or vertically, but not
+diagonally) to its own tree. However, a tent may be adjacent to
+other trees as well as its own.
+
+\b No two tents are adjacent horizontally, vertically \e{or
+diagonally}.
+
+\b The number of tents in each row, and in each column, matches the
+numbers given round the sides of the grid.
+
+This puzzle can be found in several places on the Internet, and was
+brought to my attention by e-mail. I don't know who I should credit
+for inventing it.
+
+\H{tents-controls} \i{Tents controls}
+
+\IM{Tents controls} controls, for Tents
+
+Left-clicking in a blank square will place a tent in it.
+Right-clicking in a blank square will colour it green, indicating
+that you are sure it \e{isn't} a tent. Clicking either button in an
+occupied square will clear it.
+
+If you \e{drag} with the right button along a row or column, every
+blank square in the region you cover will be turned green, and no
+other squares will be affected. (This is useful for clearing the
+remainder of a row once you have placed all its tents.)
+
+You can also use the cursor keys to move around the grid. Pressing the
+return key over an empty square will place a tent, and pressing the
+space bar over an empty square will colour it green; either key will
+clear an occupied square.  Holding Shift and pressing the cursor keys
+will colour empty squares green.  Holding Control and pressing the
+cursor keys will colour green both empty squares and squares with tents.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{tents-parameters} \I{parameters, for Tents}Tents parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+\dt \e{Difficulty}
+
+\dd Controls the difficulty of the generated puzzle. More difficult
+puzzles require more complex deductions, but at present none of the
+available difficulty levels requires guesswork or backtracking.
+
+
+\C{bridges} \i{Bridges}
+
+\cfg{winhelp-topic}{games.bridges}
+
+You have a set of islands distributed across the playing area. Each
+island contains a number. Your aim is to connect the islands
+together with bridges, in such a way that:
+
+\b Bridges run horizontally or vertically.
+
+\b The number of bridges terminating at any island is equal to the
+number written in that island.
+
+\b Two bridges may run in parallel between the same two islands, but
+no more than two may do so.
+
+\b No bridge crosses another bridge.
+
+\b All the islands are connected together.
+
+There are some configurable alternative modes, which involve
+changing the parallel-bridge limit to something other than 2, and
+introducing the additional constraint that no sequence of bridges
+may form a loop from one island back to the same island. The rules
+stated above are the default ones.
+
+Credit for this puzzle goes to \i{Nikoli} \k{nikoli-bridges}.
+
+Bridges was contributed to this collection by James Harvey.
+
+\B{nikoli-bridges}
+\W{http://www.nikoli.co.jp/en/puzzles/hashiwokakero.html}\cw{http://www.nikoli.co.jp/en/puzzles/hashiwokakero.html}
+(beware of Flash)
+
+\H{bridges-controls} \i{Bridges controls}
+
+\IM{Bridges controls} controls, for Bridges
+
+To place a bridge between two islands, click the mouse down on one
+island and drag it towards the other. You do not need to drag all
+the way to the other island; you only need to move the mouse far
+enough for the intended bridge direction to be unambiguous. (So you
+can keep the mouse near the starting island and conveniently throw
+bridges out from it in many directions.)
+
+Doing this again when a bridge is already present will add another
+parallel bridge. If there are already as many bridges between the
+two islands as permitted by the current game rules (i.e. two by
+default), the same dragging action will remove all of them.
+
+If you want to remind yourself that two islands definitely \e{do
+not} have a bridge between them, you can right-drag between them in
+the same way to draw a \q{non-bridge} marker.
+
+If you think you have finished with an island (i.e. you have placed
+all its bridges and are confident that they are in the right
+places), you can mark the island as finished by left-clicking on it.
+This will highlight it and all the bridges connected to it, and you
+will be prevented from accidentally modifying any of those bridges
+in future. Left-clicking again on a highlighted island will unmark
+it and restore your ability to modify it.
+
+You can also use the cursor keys to move around the grid: if possible
+the cursor will always move orthogonally, otherwise it will move
+towards the nearest island to the indicated direction. Holding Control
+and pressing a cursor key will lay a bridge in that direction (if
+available); Shift and a cursor key will lay a \q{non-bridge} marker.
+Pressing the return key followed by a cursor key will also lay a
+bridge in that direction.
+
+You can mark an island as finished by pressing the space bar or by
+pressing the return key twice.
+
+By pressing a number key, you can jump to the nearest island with that
+number.  Letters \q{a}, ..., \q{f} count as 10, ..., 15 and \q{0} as
+16.
+
+Violations of the puzzle rules will be marked in red:
+
+\b An island with too many bridges will be highlighted in red.
+
+\b An island with too few bridges will be highlighted in red if it
+is definitely an error (as opposed to merely not being finished
+yet): if adding enough bridges would involve having to cross another
+bridge or remove a non-bridge marker, or if the island has been
+highlighted as complete.
+
+\b A group of islands and bridges may be highlighted in red if it is
+a closed subset of the puzzle with no way to connect it to the rest
+of the islands. For example, if you directly connect two 1s together
+with a bridge and they are not the only two islands on the grid,
+they will light up red to indicate that such a group cannot be
+contained in any valid solution.
+
+\b If you have selected the (non-default) option to disallow loops
+in the solution, a group of bridges which forms a loop will be
+highlighted.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{bridges-parameters} \I{parameters, for Bridges}Bridges parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+\dt \e{Difficulty}
+
+\dd Difficulty level of puzzle.
+
+\dt \e{Allow loops}
+
+\dd This is set by default. If cleared, puzzles will be generated in
+such a way that they are always soluble without creating a loop, and
+solutions which do involve a loop will be disallowed.
+
+\dt \e{Max. bridges per direction}
+
+\dd Maximum number of bridges in any particular direction. The
+default is 2, but you can change it to 1, 3 or 4. In general, fewer
+is easier.
+
+\dt \e{%age of island squares}
+
+\dd Gives a rough percentage of islands the generator will try and
+lay before finishing the puzzle. Certain layouts will not manage to
+lay enough islands; this is an upper bound.
+
+\dt \e{Expansion factor (%age)}
+
+\dd The grid generator works by picking an existing island at random
+(after first creating an initial island somewhere). It then decides
+on a direction (at random), and then works out how far it could
+extend before creating another island. This parameter determines how
+likely it is to extend as far as it can, rather than choosing
+somewhere closer.
+
+\lcont{
+
+High expansion factors usually mean easier puzzles with fewer
+possible islands; low expansion factors can create lots of
+tightly-packed islands.
+
+}
+
+
+\C{unequal} \i{Unequal}
+
+\cfg{winhelp-topic}{games.unequal}
+
+You have a square grid; each square may contain a digit from 1 to
+the size of the grid, and some squares have clue signs between
+them. Your aim is to fully populate the grid with numbers such that:
+
+\b Each row contains only one occurrence of each digit
+
+\b Each column contains only one occurrence of each digit
+
+\b All the clue signs are satisfied. 
+
+There are two modes for this game, \q{Unequal} and \q{Adjacent}.
+
+In \q{Unequal} mode, the clue signs are greater-than symbols indicating one
+square's value is greater than its neighbour's. In this mode not all clues
+may be visible, particularly at higher difficulty levels. 
+
+In \q{Adjacent} mode, the clue signs are bars indicating
+one square's value is numerically adjacent (i.e. one higher or one lower)
+than its neighbour. In this mode all clues are always visible: absence of
+a bar thus means that a square's value is definitely not numerically adjacent
+to that neighbour's.  
+
+In \q{Trivial} difficulty level (available via the \q{Custom} game type
+selector), there are no greater-than signs in \q{Unequal} mode; the puzzle is
+to solve the \i{Latin square} only.
+
+At the time of writing, the \q{Unequal} mode of this puzzle is appearing in the
+Guardian weekly under the name \q{\i{Futoshiki}}.
+
+Unequal was contributed to this collection by James Harvey.
+
+\H{unequal-controls} \i{Unequal controls}
+
+\IM{Unequal controls} controls, for Unequal
+
+Unequal shares much of its control system with Solo.
+
+To play Unequal, simply click the mouse in any empty square and then
+type a digit or letter on the keyboard to fill that square. If you
+make a mistake, click the mouse in the incorrect square and press
+Space to clear it again (or use the Undo feature).
+
+If you \e{right}-click in a square and then type a number, that
+number will be entered in the square as a \q{pencil mark}. You can
+have pencil marks for multiple numbers in the same square. Squares
+containing filled-in numbers cannot also contain pencil marks.
+
+The game pays no attention to pencil marks, so exactly what you use
+them for is up to you: you can use them as reminders that a
+particular square needs to be re-examined once you know more about a
+particular number, or you can use them as lists of the possible
+numbers in a given square, or anything else you feel like.
+
+To erase a single pencil mark, right-click in the square and type
+the same number again.
+
+All pencil marks in a square are erased when you left-click and type
+a number, or when you left-click and press space. Right-clicking and
+pressing space will also erase pencil marks.
+
+As for Solo, the cursor keys can be used in conjunction with the digit
+keys to set numbers or pencil marks. You can also use the \q{M} key to
+auto-fill every numeric hint, ready for removal as required, or the \q{H}
+key to do the same but also to remove all obvious hints. 
+
+Alternatively, use the cursor keys to move the mark around the grid.
+Pressing the return key toggles the mark (from a normal mark to a
+pencil mark), and typing a number in is entered in the square in the
+appropriate way; typing in a 0 or using the space bar will clear a
+filled square. 
+
+Left-clicking a clue will mark it as done (grey it out), or unmark it
+if it is already marked.  Holding Control or Shift and pressing an
+arrow key likewise marks any clue adjacent to the cursor in the given
+direction.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{unequal-parameters} \I{parameters, for Unequal}Unequal parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Mode}
+
+\dd Mode of the puzzle (\q{Unequal} or \q{Adjacent})
+
+\dt \e{Size (s*s)}
+
+\dd Size of grid.
+
+\dt \e{Difficulty}
+
+\dd Controls the difficulty of the generated puzzle. At Trivial
+level, there are no greater-than signs; the puzzle is to solve the
+Latin square only. At Recursive level (only available via the
+\q{Custom} game type selector) backtracking will be required, but
+the solution should still be unique. The levels in between require
+increasingly complex reasoning to avoid having to backtrack.
+
+
+
+\C{galaxies} \i{Galaxies}
+
+\cfg{winhelp-topic}{games.galaxies}
+
+You have a rectangular grid containing a number of dots. Your aim is
+to draw edges along the grid lines which divide the rectangle into
+regions in such a way that every region is 180\u00b0{-degree}
+rotationally symmetric, and contains exactly one dot which is
+located at its centre of symmetry.
+
+This puzzle was invented by \i{Nikoli} \k{nikoli-galaxies}, under
+the name \q{Tentai Show}; its name is commonly translated into
+English as \q{Spiral Galaxies}.
+
+Galaxies was contributed to this collection by James Harvey.
+
+\B{nikoli-galaxies} \W{http://www.nikoli.co.jp/en/puzzles/astronomical_show.html}\cw{http://www.nikoli.co.jp/en/puzzles/astronomical_show.html}
+
+\H{galaxies-controls} \i{Galaxies controls}
+
+\IM{Galaxies controls} controls, for Galaxies
+
+Left-click on any grid line to draw an edge if there isn't one
+already, or to remove one if there is. When you create a valid
+region (one which is closed, contains exactly one dot, is
+180\u00b0{-degree} symmetric about that dot, and contains no
+extraneous edges inside it) it will be highlighted automatically; so
+your aim is to have the whole grid highlighted in that way.
+
+During solving, you might know that a particular grid square belongs
+to a specific dot, but not be sure of where the edges go and which
+other squares are connected to the dot. In order to mark this so you
+don't forget, you can right-click on the dot and drag, which will
+create an arrow marker pointing at the dot. Drop that in a square of
+your choice and it will remind you which dot it's associated with.
+You can also right-click on existing arrows to pick them up and move
+them, or destroy them by dropping them off the edge of the grid.
+(Also, if you're not sure which dot an arrow is pointing at, you can
+pick it up and move it around to make it clearer. It will swivel
+constantly as you drag it, to stay pointed at its parent dot.)
+
+You can also use the cursor keys to move around the grid squares and
+lines.  Pressing the return key when over a grid line will draw or
+clear its edge, as above. Pressing the return key when over a dot will
+pick up an arrow, to be dropped the next time the return key is
+pressed; this can also be used to move existing arrows around, removing
+them by dropping them on a dot or another arrow.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{galaxies-parameters} \I{parameters, for Galaxies}Galaxies parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+\dt \e{Difficulty}
+
+\dd Controls the difficulty of the generated puzzle. More difficult
+puzzles require more complex deductions, and the \q{Unreasonable}
+difficulty level may require backtracking.
+
+
+
+\C{filling} \i{Filling}
+
+\cfg{winhelp-topic}{games.filling}
+
+You have a grid of squares, some of which contain digits, and the
+rest of which are empty. Your job is to fill in digits in the empty
+squares, in such a way that each connected region of squares all
+containing the same digit has an area equal to that digit.
+
+(\q{Connected region}, for the purposes of this game, does not count
+diagonally separated squares as adjacent.)
+
+For example, it follows that no square can contain a zero, and that
+two adjacent squares can not both contain a one.  No region has an
+area greater than 9 (because then its area would not be a single
+digit).
+
+Credit for this puzzle goes to \i{Nikoli} \k{nikoli-fillomino}.
+
+Filling was contributed to this collection by Jonas K\u00F6{oe}lker.
+
+\B{nikoli-fillomino}
+\W{http://www.nikoli.co.jp/en/puzzles/fillomino.html}\cw{http://www.nikoli.co.jp/en/puzzles/fillomino.html}
+
+\H{filling-controls} \I{controls, for Filling}Filling controls
+
+To play Filling, simply click the mouse in any empty square and then
+type a digit on the keyboard to fill that square. By dragging the
+mouse, you can select multiple squares to fill with a single keypress.
+If you make a mistake, click the mouse in the incorrect square and
+press 0, Space, Backspace or Enter to clear it again (or use the Undo
+feature).
+
+You can also move around the grid with the cursor keys; typing a digit will
+fill the square containing the cursor with that number; typing 0 will clear
+it.  You can also select multiple squares for numbering or clearing with the
+return and arrow keys, before typing a digit to fill or clear the highlighted
+squares (as above).  The space bar adds and removes single squares to and from
+the selection.  Backspace and escape remove all squares from the selection.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{filling-parameters} \I{parameters, for Filling}Filling parameters
+
+Filling allows you to configure the number of rows and columns of the
+grid, through the \q{Type} menu.
+
+
+\C{keen} \i{Keen}
+
+\cfg{winhelp-topic}{games.keen}
+
+You have a square grid; each square may contain a digit from 1 to
+the size of the grid. The grid is divided into blocks of varying
+shape and size, with arithmetic clues written in them. Your aim is
+to fully populate the grid with digits such that:
+
+\b Each row contains only one occurrence of each digit
+
+\b Each column contains only one occurrence of each digit
+
+\b The digits in each block can be combined to form the number
+stated in the clue, using the arithmetic operation given in the
+clue. That is:
+
+\lcont{
+
+\b An addition clue means that the sum of the digits in the block
+must be the given number. For example, \q{15+} means the contents of
+the block adds up to fifteen.
+
+\b A multiplication clue (e.g. \q{60\times}), similarly, means that
+the product of the digits in the block must be the given number.
+
+\b A subtraction clue will always be written in a block of size two,
+and it means that one of the digits in the block is greater than the
+other by the given amount. For example, \q{2\minus} means that one
+of the digits in the block is 2 more than the other, or equivalently
+that one digit minus the other one is 2. The two digits could be
+either way round, though.
+
+\b A division clue (e.g. \q{3\divide}), similarly, is always in a
+block of size two and means that one digit divided by the other is
+equal to the given amount.
+
+Note that a block may contain the same digit more than once
+(provided the identical ones are not in the same row and column).
+This rule is precisely the opposite of the rule in Solo's \q{Killer}
+mode (see \k{solo}).
+
+}
+
+This puzzle appears in the Times under the name \q{\i{KenKen}}.
+
+
+\H{keen-controls} \i{Keen controls}
+
+\IM{Keen controls} controls, for Keen
+
+Keen shares much of its control system with Solo (and Unequal).
+
+To play Keen, simply click the mouse in any empty square and then
+type a digit on the keyboard to fill that square. If you make a
+mistake, click the mouse in the incorrect square and press Space to
+clear it again (or use the Undo feature).
+
+If you \e{right}-click in a square and then type a number, that
+number will be entered in the square as a \q{pencil mark}. You can
+have pencil marks for multiple numbers in the same square. Squares
+containing filled-in numbers cannot also contain pencil marks.
+
+The game pays no attention to pencil marks, so exactly what you use
+them for is up to you: you can use them as reminders that a
+particular square needs to be re-examined once you know more about a
+particular number, or you can use them as lists of the possible
+numbers in a given square, or anything else you feel like.
+
+To erase a single pencil mark, right-click in the square and type
+the same number again.
+
+All pencil marks in a square are erased when you left-click and type
+a number, or when you left-click and press space. Right-clicking and
+pressing space will also erase pencil marks.
+
+As for Solo, the cursor keys can be used in conjunction with the
+digit keys to set numbers or pencil marks. Use the cursor keys to
+move a highlight around the grid, and type a digit to enter it in
+the highlighted square. Pressing return toggles the highlight into a
+mode in which you can enter or remove pencil marks.
+
+Pressing M will fill in a full set of pencil marks in every square
+that does not have a main digit in it.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{keen-parameters} \I{parameters, for Keen}Keen parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Grid size}
+
+\dd Specifies the size of the grid. Lower limit is 3; upper limit is
+9 (because the user interface would become more difficult with
+\q{digits} bigger than 9!).
+
+\dt \e{Difficulty}
+
+\dd Controls the difficulty of the generated puzzle. At Unreasonable
+level, some backtracking will be required, but the solution should
+still be unique. The remaining levels require increasingly complex
+reasoning to avoid having to backtrack.
+
+\dt \e{Multiplication only}
+
+\dd If this is enabled, all boxes will be multiplication boxes.
+With this rule, the puzzle is known as \q{Inshi No Heya}.
+
+\C{towers} \i{Towers}
+
+\cfg{winhelp-topic}{games.towers}
+
+You have a square grid. On each square of the grid you can build a
+tower, with its height ranging from 1 to the size of the grid.
+Around the edge of the grid are some numeric clues.
+
+Your task is to build a tower on every square, in such a way that:
+
+\b Each row contains every possible height of tower once
+
+\b Each column contains every possible height of tower once
+
+\b Each numeric clue describes the number of towers that can be seen
+if you look into the square from that direction, assuming that
+shorter towers are hidden behind taller ones. For example, in a
+5\by\.5 grid, a clue marked \q{5} indicates that the five tower
+heights must appear in increasing order (otherwise you would not be
+able to see all five towers), whereas a clue marked \q{1} indicates
+that the tallest tower (the one marked 5) must come first.
+
+In harder or larger puzzles, some towers will be specified for you
+as well as the clues round the edge, and some edge clues may be
+missing.
+
+This puzzle appears on the web under various names, particularly
+\q{\i{Skyscrapers}}, but I don't know who first invented it.
+
+
+\H{towers-controls} \i{Towers controls}
+
+\IM{Towers controls} controls, for Towers
+
+Towers shares much of its control system with Solo, Unequal and Keen.
+
+To play Towers, simply click the mouse in any empty square and then
+type a digit on the keyboard to fill that square with a tower of the
+given height. If you make a mistake, click the mouse in the
+incorrect square and press Space to clear it again (or use the Undo
+feature).
+
+If you \e{right}-click in a square and then type a number, that
+number will be entered in the square as a \q{pencil mark}. You can
+have pencil marks for multiple numbers in the same square. A square
+containing a tower cannot also contain pencil marks.
+
+The game pays no attention to pencil marks, so exactly what you use
+them for is up to you: you can use them as reminders that a
+particular square needs to be re-examined once you know more about a
+particular number, or you can use them as lists of the possible
+numbers in a given square, or anything else you feel like.
+
+To erase a single pencil mark, right-click in the square and type
+the same number again.
+
+All pencil marks in a square are erased when you left-click and type
+a number, or when you left-click and press space. Right-clicking and
+pressing space will also erase pencil marks.
+
+As for Solo, the cursor keys can be used in conjunction with the
+digit keys to set numbers or pencil marks. Use the cursor keys to
+move a highlight around the grid, and type a digit to enter it in
+the highlighted square. Pressing return toggles the highlight into a
+mode in which you can enter or remove pencil marks.
+
+Pressing M will fill in a full set of pencil marks in every square
+that does not have a main digit in it.
+
+Left-clicking a clue will mark it as done (grey it out), or unmark it
+if it is already marked.  Holding Control or Shift and pressing an
+arrow key likewise marks any clue in the given direction.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{towers-parameters} \I{parameters, for Towers}Towers parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Grid size}
+
+\dd Specifies the size of the grid. Lower limit is 3; upper limit is
+9 (because the user interface would become more difficult with
+\q{digits} bigger than 9!).
+
+\dt \e{Difficulty}
+
+\dd Controls the difficulty of the generated puzzle. At Unreasonable
+level, some backtracking will be required, but the solution should
+still be unique. The remaining levels require increasingly complex
+reasoning to avoid having to backtrack.
+
+
+\C{singles} \i{Singles}
+
+\cfg{winhelp-topic}{games.singles}
+
+You have a grid of white squares, all of which contain numbers. Your task
+is to colour some of the squares black (removing the number) so as to satisfy
+all of the following conditions:
+
+\b No number occurs more than once in any row or column.
+
+\b No black square is horizontally or vertically adjacent to any other black
+square.
+
+\b The remaining white squares must all form one contiguous region
+(connected by edges, not just touching at corners).
+
+Credit for this puzzle goes to \i{Nikoli} \k{nikoli-hitori} who call it
+\i{Hitori}. 
+
+Singles was contributed to this collection by James Harvey.
+
+\B{nikoli-hitori}
+\W{http://www.nikoli.com/en/puzzles/hitori.html}\cw{http://www.nikoli.com/en/puzzles/hitori.html}
+(beware of Flash)
+
+\H{singles-controls} \i{Singles controls}
+
+\IM{Singles controls} controls, for Singles
+
+Left-clicking on an empty square will colour it black; left-clicking again 
+will restore the number. Right-clicking will add a circle (useful for 
+indicating that a cell is definitely not black). 
+
+You can also use the cursor keys to move around the grid. Pressing the
+return or space keys will turn a square black or add a circle respectively,
+and pressing the key again will restore the number or remove the circle.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{singles-parameters} \I{parameters, for Singles}Singles parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+\dt \e{Difficulty}
+
+\dd Controls the difficulty of the generated puzzle.
+
+
+\C{magnets} \i{Magnets}
+
+\cfg{winhelp-topic}{games.magnets}
+
+A rectangular grid has been filled with a mixture of magnets (that is,
+dominoes with one positive end and one negative end) and blank dominoes
+(that is, dominoes with two neutral poles).
+These dominoes are initially only seen in silhouette. Around the grid
+are placed a number of clues indicating the number of positive and
+negative poles contained in certain columns and rows.
+
+Your aim is to correctly place the magnets and blank dominoes such that
+all the clues are satisfied, with the additional constraint that no two
+similar magnetic poles may be orthogonally adjacent (since they repel).
+Neutral poles do not repel, and can be adjacent to any other pole. 
+
+Credit for this puzzle goes to \i{Janko} \k{janko-magnets}.
+
+Magnets was contributed to this collection by James Harvey.
+
+\B{janko-magnets}
+\W{http://www.janko.at/Raetsel/Magnete/index.htm}\cw{http://www.janko.at/Raetsel/Magnete/index.htm}
+
+\H{magnets-controls} \i{Magnets controls}
+
+\IM{Magnets controls} controls, for Magnets
+
+Left-clicking on an empty square places a magnet at that position with
+the positive pole on the square and the negative pole on the other half
+of the magnet; left-clicking again reverses the polarity, and a third
+click removes the magnet.
+
+Right-clicking on an empty square places a blank domino there.
+Right-clicking again places two question marks on the domino, signifying
+\q{this cannot be blank} (which can be useful to note deductions while
+solving), and right-clicking again empties the domino. 
+
+Left-clicking a clue will mark it as done (grey it out), or unmark it if
+it is already marked.
+
+You can also use the cursor keys to move a cursor around the grid. 
+Pressing the return key will lay a domino with a positive pole at that
+position; pressing again reverses the polarity and then removes the
+domino, as with left-clicking. Using the space bar allows placement
+of blank dominoes and cannot-be-blank hints, as for right-clicking. 
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{magnets-parameters} \I{parameters, for Magnets}Magnets parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares. There will be half \e{Width} \by \e{Height}
+dominoes in the grid: if this number is odd then one square will be blank.
+
+\lcont{
+
+(Grids with at least one odd dimension tend to be easier to solve.)
+
+}
+
+\dt \e{Difficulty}
+
+\dd Controls the difficulty of the generated puzzle. At Tricky level,
+you are required to make more deductions about empty dominoes and
+row/column counts. 
+
+\dt \e{Strip clues}
+
+\dd If true, some of the clues around the grid are removed at generation
+time, making the puzzle more difficult.
+
+
+\C{signpost} \i{Signpost}
+
+\cfg{winhelp-topic}{games.signpost}
+
+You have a grid of squares; each square (except the last one)
+contains an arrow, and some squares also contain numbers. Your job
+is to connect the squares to form a continuous list of numbers
+starting at 1 and linked in the direction of the arrows \dash so the
+arrow inside the square with the number 1 will point to the square
+containing the number 2, which will point to the square containing
+the number 3, etc. Each square can be any distance away from the
+previous one, as long as it is somewhere in the direction of the
+arrow.
+
+By convention the first and last numbers are shown; one or more
+interim numbers may also appear at the beginning. 
+
+Credit for this puzzle goes to \i{Janko} \k{janko-arrowpath}, who call it
+\q{Pfeilpfad} (\q{arrow path}).
+
+Signpost was contributed to this collection by James Harvey.
+
+\B{janko-arrowpath}
+\W{http://janko.at/Raetsel/Pfeilpfad/index.htm}\cw{http://janko.at/Raetsel/Pfeilpfad/index.htm}
+
+\H{signpost-controls} \I{controls, for Signpost}Signpost controls
+
+To play Signpost, you connect squares together by dragging from one
+square to another, indicating that they are adjacent in the
+sequence. Drag with the left button from a square to its successor,
+or with the right button from a square to its predecessor.
+
+If you connect together two squares in this way and one of them has
+a number in it, the appropriate number will appear in the other
+square. If you connect two non-numbered squares, they will be
+assigned temporary algebraic labels: on the first occasion, they
+will be labelled \cq{a} and \cq{a+1}, and then \cq{b} and \cq{b+1},
+and so on. Connecting more squares on to the ends of such a chain
+will cause them all to be labelled with the same letter.
+
+When you left-click or right-click in a square, the legal squares to
+connect it to will be shown.
+
+The arrow in each square starts off black, and goes grey once you
+connect the square to its successor. Also, each square which needs a
+predecessor has a small dot in the bottom left corner, which
+vanishes once you link a square to it. So your aim is always to
+connect a square with a black arrow to a square with a dot.
+
+To remove any links for a particular square (both incoming and
+outgoing), left-drag it off the grid. To remove a whole chain,
+right-drag any square in the chain off the grid.
+
+You can also use the cursor keys to move around the grid squares and
+lines. Pressing the return key when over a square starts a link
+operation, and pressing the return key again over a square will
+finish the link, if allowable. Pressing the space bar over a square
+will show the other squares pointing to it, and allow you to form a
+backward link, and pressing the space bar again cancels this.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{signpost-parameters} \I{parameters, for Signpost}Signpost parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+\dt \e{Force start/end to corners}
+
+\dd If true, the start and end squares are always placed in opposite corners
+(the start at the top left, and the end at the bottom right). If false the start
+and end squares are placed randomly (although always both shown). 
+
+\C{range} \i{Range}
+
+\cfg{winhelp-topic}{games.range}
+
+You have a grid of squares; some squares contain numbers.  Your job is
+to colour some of the squares black, such that several criteria are
+satisfied:
+
+\b no square with a number is coloured black.
+
+\b no two black squares are adjacent (horizontally or vertically).
+
+\b for any two white squares, there is a path between them using only
+white squares.
+
+\b for each square with a number, that number denotes the total number
+of white squares reachable from that square going in a straight line
+in any horizontal or vertical direction until hitting a wall or a
+black square; the square with the number is included in the total
+(once).
+
+For instance, a square containing the number one must have four black
+squares as its neighbours by the last criterion; but then it's
+impossible for it to be connected to any outside white square, which
+violates the second to last criterion.  So no square will contain the
+number one.
+
+Credit for this puzzle goes to \i{Nikoli}, who have variously called
+it \q{Kurodoko}, \q{Kuromasu} or \q{Where is Black Cells}.
+\k{nikoli-range}.
+
+Range was contributed to this collection by Jonas K\u00F6{oe}lker.
+
+\B{nikoli-range}
+\W{http://www.nikoli.co.jp/en/puzzles/where_is_black_cells.html}\cw{http://www.nikoli.co.jp/en/puzzles/where_is_black_cells.html}
+
+\H{range-controls} \I{controls, for Range}Range controls
+
+Click with the left button to paint a square black, or with the right
+button to mark a square with a dot to indicate that you are sure it
+should \e{not} be painted black. Repeated clicking with either button
+will cycle the square through the three possible states (filled,
+dotted or empty) in opposite directions.
+
+You can also use the cursor keys to move around the grid squares.
+Pressing Return does the same as clicking with the left button, while
+pressing Space does the same as a right button click.  Moving with the
+cursor keys while holding Shift will place dots in all squares that
+are moved through.
+
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{range-parameters} \I{parameters, for Range}Range parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+\C{pearl} \i{Pearl}
+
+\cfg{winhelp-topic}{games.pearl}
+
+You have a grid of squares. Your job is to draw lines between the
+centres of horizontally or vertically adjacent squares, so that the
+lines form a single closed loop. In the resulting grid, some of the
+squares that the loop passes through will contain corners, and some
+will be straight horizontal or vertical lines. (And some squares can
+be completely empty \dash the loop doesn't have to pass through every
+square.)
+
+Some of the squares contain black and white circles, which are clues
+that the loop must satisfy.
+
+A black circle in a square indicates that that square is a corner, but
+neither of the squares adjacent to it in the loop is also a corner.
+
+A white circle indicates that the square is a straight edge, but \e{at
+least one} of the squares adjacent to it in the loop is a corner.
+
+(In both cases, the clue only constrains the two squares adjacent
+\e{in the loop}, that is, the squares that the loop passes into after
+leaving the clue square. The squares that are only adjacent \e{in the
+grid} are not constrained.)
+
+Credit for this puzzle goes to \i{Nikoli}, who call it \q{Masyu}.
+\k{nikoli-pearl}
+
+Thanks to James Harvey for assistance with the implementation.
+
+\B{nikoli-pearl}
+\W{http://www.nikoli.co.jp/en/puzzles/masyu.html}\cw{http://www.nikoli.co.jp/en/puzzles/masyu.html}
+(beware of Flash)
+
+\H{pearl-controls} \I{controls, for Pearl}Pearl controls
+
+Click with the left button on a grid edge to draw a segment of the
+loop through that edge, or to remove a segment once it is drawn.
+
+Drag with the left button through a series of squares to draw more
+than one segment of the loop in one go. Alternatively, drag over an
+existing part of the loop to undraw it, or to undraw part of it and
+then go in a different direction.
+
+Click with the right button on a grid edge to mark it with a cross,
+indicating that you are sure the loop does not go through that edge.
+(For instance, if you have decided which of the squares adjacent to a
+white clue has to be a corner, but don't yet know which way the corner
+turns, you might mark the one way it \e{can't} go with a cross.)
+
+Alternatively, use the cursor keys to move the cursor.  Use the Enter
+key to begin and end keyboard \q{drag} operations.  Use the Space,
+Escape or Backspace keys to cancel the drag.  Or, hold Control while
+dragging with the cursor keys to toggle segments as you move between
+squares.
+
+Pressing Control-Shift-arrowkey or Shift-arrowkey simulates a left or
+right click, respectively, on the edge in the direction of the key.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{pearl-parameters} \I{parameters, for Pearl}Pearl parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\C{undead} \i{Undead}
+
+\cfg{winhelp-topic}{games.undead}
+
+You are given a grid of squares, some of which contain diagonal
+mirrors. Every square which is not a mirror must be filled with one of
+three types of undead monster: a ghost, a vampire, or a zombie.
+
+Vampires can be seen directly, but are invisible when reflected in
+mirrors. Ghosts are the opposite way round: they can be seen in
+mirrors, but are invisible when looked at directly. Zombies are
+visible by any means.
+
+You are also told the total number of each type of monster in the
+grid. Also around the edge of the grid are written numbers, which
+indicate how many monsters can be seen if you look into the grid along
+a row or column starting from that position. (The diagonal mirrors are
+reflective on both sides. If your reflected line of sight crosses the
+same monster more than once, the number will count it each time it is
+visible, not just once.)
+
+This puzzle type was invented by David Millar, under the name
+\q{Haunted Mirror Maze}. See \k{janko-undead} for more details.
+
+Undead was contributed to this collection by Steffen Bauer.
+
+\B{janko-undead}
+\W{http://www.janko.at/Raetsel/Spukschloss/index.htm}\cw{http://www.janko.at/Raetsel/Spukschloss/index.htm}
+
+\H{undead-controls} \I{controls, for Undead}Undead controls
+
+Undead has a similar control system to Solo, Unequal and Keen.
+
+To play Undead, click the mouse in any empty square and then type a
+letter on the keyboard indicating the type of monster: \q{G} for a
+ghost, \q{V} for a vampire, or \q{Z} for a zombie. If you make a
+mistake, click the mouse in the incorrect square and press Space to
+clear it again (or use the Undo feature).
+
+If you \e{right}-click in a square and then type a letter, the
+corresponding monster will be shown in reduced size in that square, as
+a \q{pencil mark}. You can have pencil marks for multiple monsters in
+the same square. A square containing a full-size monster cannot also
+contain pencil marks.
+
+The game pays no attention to pencil marks, so exactly what you use
+them for is up to you: you can use them as reminders that a particular
+square needs to be re-examined once you know more about a particular
+monster, or you can use them as lists of the possible monster in a
+given square, or anything else you feel like.
+
+To erase a single pencil mark, right-click in the square and type
+the same letter again.
+
+All pencil marks in a square are erased when you left-click and type a
+monster letter, or when you left-click and press Space. Right-clicking
+and pressing space will also erase pencil marks.
+
+As for Solo, the cursor keys can be used in conjunction with the letter
+keys to place monsters or pencil marks. Use the cursor keys to move a
+highlight around the grid, and type a monster letter to enter it in
+the highlighted square. Pressing return toggles the highlight into a
+mode in which you can enter or remove pencil marks.
+
+If you prefer plain letters of the alphabet to cute monster pictures,
+you can press \q{A} to toggle between showing the monsters as monsters or
+showing them as letters.
+
+Left-clicking a clue will mark it as done (grey it out), or unmark it
+if it is already marked.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{undead-parameters} \I{parameters, for Undead}Undead parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+\dt \e{Difficulty}
+
+\dd Controls the difficulty of the generated puzzle.
+
+\C{unruly} \i{Unruly}
+
+\cfg{winhelp-topic}{games.unruly}
+
+You are given a grid of squares, which you must colour either black or
+white. Some squares are provided as clues; the rest are left for you
+to fill in. Each row and column must contain the same number of black
+and white squares, and no row or column may contain three consecutive
+squares of the same colour.
+
+This puzzle type was invented by Adolfo Zanellati, under the name
+\q{Tohu wa Vohu}. See \k{janko-unruly} for more details.
+
+Unruly was contributed to this collection by Lennard Sprong.
+
+\B{janko-unruly}
+\W{http://www.janko.at/Raetsel/Tohu-Wa-Vohu/index.htm}\cw{http://www.janko.at/Raetsel/Tohu-Wa-Vohu/index.htm}
+
+\H{unruly-controls} \I{controls, for Unruly}Unruly controls
+
+To play Unruly, click the mouse in a square to change its colour.
+Left-clicking an empty square will turn it black, and right-clicking
+will turn it white. Keep clicking the same button to cycle through the
+three possible states for the square. If you middle-click in a square
+it will be reset to empty.
+
+You can also use the cursor keys to move around the grid. Pressing the
+return or space keys will turn an empty square black or white
+respectively (and then cycle the colours in the same way as the mouse
+buttons), and pressing Backspace will reset a square to empty.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{unruly-parameters} \I{parameters, for Unruly}Unruly parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares. (Note that the rules of the game require
+both the width and height to be even numbers.)
+
+\dt \e{Difficulty}
+
+\dd Controls the difficulty of the generated puzzle.
+
+\dt \e{Unique rows and columns}
+
+\dd If enabled, no two rows are permitted to have exactly the same
+pattern, and likewise columns. (A row and a column can match, though.)
+
+\C{flood} \i{Flood}
+
+\cfg{winhelp-topic}{games.flood}
+
+You are given a grid of squares, coloured at random in multiple
+colours. In each move, you can flood-fill the top left square in a
+colour of your choice (i.e. every square reachable from the starting
+square by an orthogonally connected path of squares all the same
+colour will be filled in the new colour). As you do this, more and
+more of the grid becomes connected to the starting square.
+
+Your aim is to make the whole grid the same colour, in as few moves as
+possible. The game will set a limit on the number of moves, based on
+running its own internal solver. You win if you can make the whole
+grid the same colour in that many moves or fewer.
+
+I saw this game (with a fixed grid size, fixed number of colours, and
+fixed move limit) at http://floodit.appspot.com (no longer accessible).
+
+\H{flood-controls} \I{controls, for Flood}Flood controls
+
+To play Flood, click the mouse in a square. The top left corner and
+everything connected to it will be flood-filled with the colour of the
+square you clicked. Clicking a square the same colour as the top left
+corner has no effect, and therefore does not count as a move.
+
+You can also use the cursor keys to move a cursor (outline black
+square) around the grid. Pressing the return key will fill the top
+left corner in the colour of the square under the cursor.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{flood-parameters} \I{parameters, for Flood}Flood parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of the grid, in squares.
+
+\dt \e{Colours}
+
+\dd Number of colours used to fill the grid. Must be at least 3 (with
+two colours there would only be one legal move at any stage, hence no
+choice to make at all), and at most 10.
+
+\dt \e{Extra moves permitted}
+
+\dd Controls the difficulty of the puzzle, by increasing the move
+limit. In each new grid, Flood will run an internal solver to generate
+its own solution, and then the value in this field will be added to
+the length of Flood's solution to generate the game's move limit. So a
+value of 0 requires you to be just as efficient as Flood's automated
+solver, and a larger value makes it easier.
+
+\lcont{
+
+(Note that Flood's internal solver will not necessarily find the
+shortest possible solution, though I believe it's pretty close. For a
+real challenge, set this value to 0 and then try to solve a grid in
+\e{strictly fewer} moves than the limit you're given!)
+
+}
+
+\C{tracks} \i{Tracks}
+
+\cfg{winhelp-topic}{games.tracks}
+
+You are given a grid of squares, some of which are filled with train
+tracks. You need to complete the track from A to B so that the rows and
+columns contain the same number of track segments as are indicated in the
+clues to the top and right of the grid.
+
+There are only straight and 90 degree curved rails, and the track may not
+cross itself.
+
+Tracks was contributed to this collection by James Harvey.
+
+\H{tracks-controls} \I{controls, for Tracks}Tracks controls
+
+Left-clicking on an edge between two squares adds a track segment between
+the two squares. Right-clicking on an edge adds a cross on the edge,
+indicating no track is possible there.
+
+Left-clicking in a square adds a colour indicator showing that you know the
+square must contain a track, even if you don't know which edges it crosses
+yet. Right-clicking in a square adds a cross indicating it contains no
+track segment.
+
+Left- or right-dragging between squares allows you to lay a straight line
+of is-track or is-not-track indicators, useful for filling in rows or
+columns to match the clue.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{tracks-parameters} \I{parameters, for Tracks}Tracks parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of the grid, in squares.
+
+\dt \e{Difficulty}
+
+\dd Controls the difficulty of the generated puzzle: at Tricky level,
+you are required to make more deductions regarding disregarding moves
+that would lead to impossible crossings later.
+
+\dt \e{Disallow consecutive 1 clues}
+
+\dd Controls whether the Tracks game generation permits two adjacent
+rows or columns to have a 1 clue, or permits the row or column of the
+track's endpoint to have a 1 clue. By default this is not permitted,
+to avoid long straight boring segments of track and make the games
+more twiddly and interesting. If you want to restore the possibility,
+turn this option off.
+
+
+\C{palisade} \i{Palisade}
+
+\cfg{winhelp-topic}{games.palisade}
+
+You're given a grid of squares, some of which contain numbers.  Your
+goal is to subdivide the grid into contiguous regions, all of the same
+(given) size, such that each square containing a number is adjacent to
+exactly that many edges (including those between the inside and the
+outside of the grid).
+
+Credit for this puzzle goes to \i{Nikoli}, who call it \q{Five Cells}.
+\k{nikoli-palisade}.
+
+Palisade was contributed to this collection by Jonas K\u00F6{oe}lker.
+
+\B{nikoli-palisade}
+\W{http://nikoli.co.jp/en/puzzles/five_cells.html}\cw{http://nikoli.co.jp/en/puzzles/five_cells.html}
+
+\H{palisade-controls} \I{controls, for Palisade}Palisade controls
+
+Left-click to place an edge.  Right-click to indicate \q{no edge}.
+Alternatively, the arrow keys will move a keyboard cursor.  Holding
+Control while pressing an arrow key will place an edge.  Press
+Shift-arrowkey to switch off an edge.  Repeat an action to perform
+its inverse.
+
+(All the actions described in \k{common-actions} are also available.)
+
+\H{Palisade-parameters} \I{parameters, for Palisade}Palisade parameters
+
+These parameters are available from the \q{Custom...} option on the
+\q{Type} menu.
+
+\dt \e{Width}, \e{Height}
+
+\dd Size of grid in squares.
+
+\dt \e{Region size}
+
+\dd The size of the regions into which the grid must be subdivided.
+
+\A{licence} \I{MIT licence}\ii{Licence}
+
+This software is \i{copyright} 2004-2014 Simon Tatham.
+
+Portions copyright Richard Boulton, James Harvey, Mike Pinna, Jonas
+K\u00F6{oe}lker, Dariusz Olszewski, Michael Schierl, Lambros Lambrou,
+Bernd Schmidt, Steffen Bauer, Lennard Sprong and Rogier Goossens.
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation files
+(the \q{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 \q{AS IS}, WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+\IM{command-line}{command line} command line
+
+\IM{default parameters, specifying} default parameters, specifying
+\IM{default parameters, specifying} preferences, specifying default
+
+\IM{Unix} Unix
+\IM{Unix} Linux
+
+\IM{generating game IDs} generating game IDs
+\IM{generating game IDs} game ID, generating
+
+\IM{specific} \q{Specific}, menu option
+\IM{custom} \q{Custom}, menu option
+
+\IM{game ID} game ID
+\IM{game ID} ID, game
+\IM{ID format} ID format
+\IM{ID format} format, ID
+\IM{ID format} game ID, format
+
+\IM{keys} keys
+\IM{keys} shortcuts (keyboard)
+
+\IM{initial state} initial state
+\IM{initial state} state, initial
+
+\IM{MIT licence} MIT licence
+\IM{MIT licence} licence, MIT
+
+\versionid Simon Tatham's Portable Puzzle Collection, version 20161228.7cae89f
index 2c448b8030a947d04da986df5ccf0839501c23c0..473984d2b8724d72385007dc041a240b330b36a5 100644 (file)
 \cfg{html-contents-depth-1}{2}
 \cfg{html-leaf-contains-contents}{true}
 
-\cfg{chm-filename}{puzzles.chm}
-\cfg{chm-contents-filename}{index.html}
-\cfg{chm-template-filename}{%k.html}
-\cfg{chm-head-end}{<link rel="stylesheet" type="text/css" href="chm.css">}
-\cfg{chm-extra-file}{chm.css}
-
 \cfg{info-filename}{puzzles.info}
 
 \cfg{ps-filename}{puzzles.ps}
@@ -3405,3 +3399,5 @@ SOFTWARE.
 
 \IM{MIT licence} MIT licence
 \IM{MIT licence} licence, MIT
+
+\versionid Simon Tatham's Portable Puzzle Collection, version 20161228.7cae89f
diff --git a/puzzles.cnt b/puzzles.cnt
new file mode 100644 (file)
index 0000000..f858735
--- /dev/null
@@ -0,0 +1,167 @@
+:Title Simon Tatham's Portable Puzzle Collection\r
+1 Contents=Top
+1 Chapter 1: Introduction
+2 Chapter 1: Introduction=t00000000
+1 Chapter 2: Common features
+2 Chapter 2: Common features=t00000001
+2 Section 2.1: Common actions=t00000002
+2 Section 2.2: Specifying games with the game ID=t00000003
+2 Section 2.3: The \91Type\92 menu=t00000004
+2 Section 2.4: Specifying game parameters on the command line=t00000005
+2 Section 2.5: Unix command-line options=t00000006
+1 Chapter 3: Net
+2 Chapter 3: Net=games.net
+2 Section 3.1: Net controls=t00000007
+2 Section 3.2: Net parameters=t00000008
+1 Chapter 4: Cube
+2 Chapter 4: Cube=games.cube
+2 Section 4.1: Cube controls=t00000009
+2 Section 4.2: Cube parameters=t00000010
+1 Chapter 5: Fifteen
+2 Chapter 5: Fifteen=games.fifteen
+2 Section 5.1: Fifteen controls=t00000011
+2 Section 5.2: Fifteen parameters=t00000012
+1 Chapter 6: Sixteen
+2 Chapter 6: Sixteen=games.sixteen
+2 Section 6.1: Sixteen controls=t00000013
+2 Section 6.2: Sixteen parameters=t00000014
+1 Chapter 7: Twiddle
+2 Chapter 7: Twiddle=games.twiddle
+2 Section 7.1: Twiddle controls=t00000015
+2 Section 7.2: Twiddle parameters=t00000016
+1 Chapter 8: Rectangles
+2 Chapter 8: Rectangles=games.rectangles
+2 Section 8.1: Rectangles controls=t00000017
+2 Section 8.2: Rectangles parameters=t00000018
+1 Chapter 9: Netslide
+2 Chapter 9: Netslide=games.netslide
+1 Chapter 10: Pattern
+2 Chapter 10: Pattern=games.pattern
+2 Section 10.1: Pattern controls=t00000019
+2 Section 10.2: Pattern parameters=t00000020
+1 Chapter 11: Solo
+2 Chapter 11: Solo=games.solo
+2 Section 11.1: Solo controls=t00000021
+2 Section 11.2: Solo parameters=t00000022
+1 Chapter 12: Mines
+2 Chapter 12: Mines=games.mines
+2 Section 12.1: Mines controls=t00000023
+2 Section 12.2: Mines parameters=t00000024
+1 Chapter 13: Same Game
+2 Chapter 13: Same Game=games.samegame
+2 Section 13.1: Same Game controls=t00000025
+2 Section 13.2: Same Game parameters=t00000026
+1 Chapter 14: Flip
+2 Chapter 14: Flip=games.flip
+2 Section 14.1: Flip controls=t00000027
+2 Section 14.2: Flip parameters=t00000028
+1 Chapter 15: Guess
+2 Chapter 15: Guess=games.guess
+2 Section 15.1: Guess controls=t00000029
+2 Section 15.2: Guess parameters=t00000030
+1 Chapter 16: Pegs
+2 Chapter 16: Pegs=games.pegs
+2 Section 16.1: Pegs controls=t00000031
+2 Section 16.2: Pegs parameters=t00000032
+1 Chapter 17: Dominosa
+2 Chapter 17: Dominosa=games.dominosa
+2 Section 17.1: Dominosa controls=t00000033
+2 Section 17.2: Dominosa parameters=t00000034
+1 Chapter 18: Untangle
+2 Chapter 18: Untangle=games.untangle
+2 Section 18.1: Untangle controls=t00000035
+2 Section 18.2: Untangle parameters=t00000036
+1 Chapter 19: Black Box
+2 Chapter 19: Black Box=games.blackbox
+2 Section 19.1: Black Box controls=t00000037
+2 Section 19.2: Black Box parameters=t00000038
+1 Chapter 20: Slant
+2 Chapter 20: Slant=games.slant
+2 Section 20.1: Slant controls=t00000039
+2 Section 20.2: Slant parameters=t00000040
+1 Chapter 21: Light Up
+2 Chapter 21: Light Up=games.lightup
+2 Section 21.1: Light Up controls=t00000041
+2 Section 21.2: Light Up parameters=t00000042
+1 Chapter 22: Map
+2 Chapter 22: Map=games.map
+2 Section 22.1: Map controls=t00000043
+2 Section 22.2: Map parameters=t00000044
+1 Chapter 23: Loopy
+2 Chapter 23: Loopy=games.loopy
+2 Section 23.1: Loopy controls=t00000045
+2 Section 23.2: Loopy parameters=t00000046
+1 Chapter 24: Inertia
+2 Chapter 24: Inertia=games.inertia
+2 Section 24.1: Inertia controls=t00000047
+2 Section 24.2: Inertia parameters=t00000048
+1 Chapter 25: Tents
+2 Chapter 25: Tents=games.tents
+2 Section 25.1: Tents controls=t00000049
+2 Section 25.2: Tents parameters=t00000050
+1 Chapter 26: Bridges
+2 Chapter 26: Bridges=games.bridges
+2 Section 26.1: Bridges controls=t00000051
+2 Section 26.2: Bridges parameters=t00000052
+1 Chapter 27: Unequal
+2 Chapter 27: Unequal=games.unequal
+2 Section 27.1: Unequal controls=t00000053
+2 Section 27.2: Unequal parameters=t00000054
+1 Chapter 28: Galaxies
+2 Chapter 28: Galaxies=games.galaxies
+2 Section 28.1: Galaxies controls=t00000055
+2 Section 28.2: Galaxies parameters=t00000056
+1 Chapter 29: Filling
+2 Chapter 29: Filling=games.filling
+2 Section 29.1: Filling controls=t00000057
+2 Section 29.2: Filling parameters=t00000058
+1 Chapter 30: Keen
+2 Chapter 30: Keen=games.keen
+2 Section 30.1: Keen controls=t00000059
+2 Section 30.2: Keen parameters=t00000060
+1 Chapter 31: Towers
+2 Chapter 31: Towers=games.towers
+2 Section 31.1: Towers controls=t00000061
+2 Section 31.2: Towers parameters=t00000062
+1 Chapter 32: Singles
+2 Chapter 32: Singles=games.singles
+2 Section 32.1: Singles controls=t00000063
+2 Section 32.2: Singles parameters=t00000064
+1 Chapter 33: Magnets
+2 Chapter 33: Magnets=games.magnets
+2 Section 33.1: Magnets controls=t00000065
+2 Section 33.2: Magnets parameters=t00000066
+1 Chapter 34: Signpost
+2 Chapter 34: Signpost=games.signpost
+2 Section 34.1: Signpost controls=t00000067
+2 Section 34.2: Signpost parameters=t00000068
+1 Chapter 35: Range
+2 Chapter 35: Range=games.range
+2 Section 35.1: Range controls=t00000069
+2 Section 35.2: Range parameters=t00000070
+1 Chapter 36: Pearl
+2 Chapter 36: Pearl=games.pearl
+2 Section 36.1: Pearl controls=t00000071
+2 Section 36.2: Pearl parameters=t00000072
+1 Chapter 37: Undead
+2 Chapter 37: Undead=games.undead
+2 Section 37.1: Undead controls=t00000073
+2 Section 37.2: Undead parameters=t00000074
+1 Chapter 38: Unruly
+2 Chapter 38: Unruly=games.unruly
+2 Section 38.1: Unruly controls=t00000075
+2 Section 38.2: Unruly parameters=t00000076
+1 Chapter 39: Flood
+2 Chapter 39: Flood=games.flood
+2 Section 39.1: Flood controls=t00000077
+2 Section 39.2: Flood parameters=t00000078
+1 Chapter 40: Tracks
+2 Chapter 40: Tracks=games.tracks
+2 Section 40.1: Tracks controls=t00000079
+2 Section 40.2: Tracks parameters=t00000080
+1 Chapter 41: Palisade
+2 Chapter 41: Palisade=games.palisade
+2 Section 41.1: Palisade controls=t00000081
+2 Section 41.2: Palisade parameters=t00000082
+1 Appendix A: Licence
+2 Appendix A: Licence=t00000083
diff --git a/puzzles.hlp b/puzzles.hlp
new file mode 100644 (file)
index 0000000..b8a8542
Binary files /dev/null and b/puzzles.hlp differ
diff --git a/puzzles.txt b/puzzles.txt
new file mode 100644 (file)
index 0000000..f11346a
--- /dev/null
@@ -0,0 +1,3164 @@
+                 Simon Tatham's Portable Puzzle Collection
+                 =========================================
+
+This is a collection of small one-player puzzle games.
+
+This manual is copyright 2004-2014 Simon Tatham. All rights reserved. You
+may distribute this documentation under the MIT licence. See appendix A for
+the licence text in full.
+
+Chapter 1: Introduction
+-----------------------
+
+       I wrote this collection because I thought there should be more small
+       desktop toys available: little games you can pop up in a window and
+       play for two or three minutes while you take a break from whatever
+       else you were doing. And I was also annoyed that every time I found
+       a good game on (say) Unix, it wasn't available the next time I was
+       sitting at a Windows machine, or vice versa; so I arranged that
+       everything in my personal puzzle collection will happily run on
+       both, and have more recently done a port to Mac OS X as well. When I
+       find (or perhaps invent) further puzzle games that I like, they'll
+       be added to this collection and will immediately be available on
+       both platforms. And if anyone feels like writing any other front
+       ends - PocketPC, Mac OS pre-10, or whatever it might be - then all
+       the games in this framework will immediately become available on
+       another platform as well.
+
+       The actual games in this collection were mostly not my invention;
+       they are re-implementations of existing game concepts within my
+       portable puzzle framework. I do not claim credit, in general, for
+       inventing the rules of any of these puzzles. (I don't even claim
+       authorship of all the code; some of the puzzles have been submitted
+       by other authors.)
+
+       This collection is distributed under the MIT licence (see appendix
+       A). This means that you can do pretty much anything you like with
+       the game binaries or the code, except pretending you wrote them
+       yourself, or suing me if anything goes wrong.
+
+       The most recent versions, and source code, can be found at
+       http://www.chiark.greenend.org.uk/~sgtatham/puzzles/.
+
+       Please report bugs to anakin@pobox.com. You might find it helpful to
+       read this article before reporting a bug:
+
+       http://www.chiark.greenend.org.uk/~sgtatham/bugs.html
+
+       Patches are welcome. Especially if they provide a new front end (to
+       make all these games run on another platform), or a new game.
+
+Chapter 2: Common features
+--------------------------
+
+       This chapter describes features that are common to all the games.
+
+   2.1 Common actions
+
+       These actions are all available from the `Game' menu and via
+       keyboard shortcuts, in addition to any game-specific actions.
+
+       (On Mac OS X, to conform with local user interface standards, these
+       actions are situated on the `File' and `Edit' menus instead.)
+
+       _New game_ (`N', Ctrl+`N')
+
+           Starts a new game, with a random initial state.
+
+       _Restart game_
+
+           Resets the current game to its initial state. (This can be
+           undone.)
+
+       _Load_
+
+           Loads a saved game from a file on disk.
+
+       _Save_
+
+           Saves the current state of your game to a file on disk.
+
+           The Load and Save operations preserve your entire game history
+           (so you can save, reload, and still Undo and Redo things you had
+           done before saving).
+
+       _Print_
+
+           Where supported (currently only on Windows), brings up a dialog
+           allowing you to print an arbitrary number of puzzles randomly
+           generated from the current parameters, optionally including
+           the current puzzle. (Only for puzzles which make sense to
+           print, of course - it's hard to think of a sensible printable
+           representation of Fifteen!)
+
+       _Undo_ (`U', Ctrl+`Z', Ctrl+`_')
+
+           Undoes a single move. (You can undo moves back to the start of
+           the session.)
+
+       _Redo_ (`R', Ctrl+`R')
+
+           Redoes a previously undone move.
+
+       _Copy_
+
+           Copies the current state of your game to the clipboard in text
+           format, so that you can paste it into (say) an e-mail client or
+           a web message board if you're discussing the game with someone
+           else. (Not all games support this feature.)
+
+       _Solve_
+
+           Transforms the puzzle instantly into its solved state. For some
+           games (Cube) this feature is not supported at all because it is
+           of no particular use. For other games (such as Pattern), the
+           solved state can be used to give you information, if you can't
+           see how a solution can exist at all or you want to know where
+           you made a mistake. For still other games (such as Sixteen),
+           automatic solution tells you nothing about how to _get_ to
+           the solution, but it does provide a useful way to get there
+           quickly so that you can experiment with set-piece moves and
+           transformations.
+
+           Some games (such as Solo) are capable of solving a game ID you
+           have typed in from elsewhere. Other games (such as Rectangles)
+           cannot solve a game ID they didn't invent themself, but when
+           they did invent the game ID they know what the solution is
+           already. Still other games (Pattern) can solve _some_ external
+           game IDs, but only if they aren't too difficult.
+
+           The `Solve' command adds the solved state to the end of the undo
+           chain for the puzzle. In other words, if you want to go back to
+           solving it yourself after seeing the answer, you can just press
+           Undo.
+
+       _Quit_ (`Q', Ctrl+`Q')
+
+           Closes the application entirely.
+
+   2.2 Specifying games with the game ID
+
+       There are two ways to save a game specification out of a puzzle and
+       recreate it later, or recreate it in somebody else's copy of the
+       same puzzle.
+
+       The `Specific' and `Random Seed' options from the `Game' menu (or
+       the `File' menu, on Mac OS X) each show a piece of text (a `game
+       ID') which is sufficient to reconstruct precisely the same game at a
+       later date.
+
+       You can enter either of these pieces of text back into the program
+       (via the same `Specific' or `Random Seed' menu options) at a later
+       point, and it will recreate the same game. You can also use either
+       one as a command line argument (on Windows or Unix); see section 2.4
+       for more detail.
+
+       The difference between the two forms is that a descriptive game ID
+       is a literal _description_ of the initial state of the game, whereas
+       a random seed is just a piece of arbitrary text which was provided
+       as input to the random number generator used to create the puzzle.
+       This means that:
+
+        -  Descriptive game IDs tend to be longer in many puzzles
+           (although some, such as Cube (chapter 4), only need very short
+           descriptions). So a random seed is often a _quicker_ way to
+           note down the puzzle you're currently playing, or to tell it to
+           somebody else so they can play the same one as you.
+
+        -  Any text at all is a valid random seed. The automatically
+           generated ones are fifteen-digit numbers, but anything will do;
+           you can type in your full name, or a word you just made up, and
+           a valid puzzle will be generated from it. This provides a way
+           for two or more people to race to complete the same puzzle:
+           you think of a random seed, then everybody types it in at the
+           same time, and nobody has an advantage due to having seen the
+           generated puzzle before anybody else.
+
+        -  It is often possible to convert puzzles from other sources (such
+           as `nonograms' or `sudoku' from newspapers) into descriptive
+           game IDs suitable for use with these programs.
+
+        -  Random seeds are not guaranteed to produce the same result
+           if you use them with a different _version_ of the puzzle
+           program. This is because the generation algorithm might have
+           been improved or modified in later versions of the code, and
+           will therefore produce a different result when given the same
+           sequence of random numbers. Use a descriptive game ID if you
+           aren't sure that it will be used on the same version of the
+           program as yours.
+
+           (Use the `About' menu option to find out the version number of
+           the program. Programs with the same version number running on
+           different platforms should still be random-seed compatible.)
+
+       A descriptive game ID starts with a piece of text which encodes the
+       _parameters_ of the current game (such as grid size). Then there is
+       a colon, and after that is the description of the game's initial
+       state. A random seed starts with a similar string of parameters, but
+       then it contains a hash sign followed by arbitrary data.
+
+       If you enter a descriptive game ID, the program will not be able
+       to show you the random seed which generated it, since it wasn't
+       generated _from_ a random seed. If you _enter_ a random seed,
+       however, the program will be able to show you the descriptive game
+       ID derived from that random seed.
+
+       Note that the game parameter strings are not always identical
+       between the two forms. For some games, there will be parameter
+       data provided with the random seed which is not included in the
+       descriptive game ID. This is because that parameter information is
+       only relevant when _generating_ puzzle grids, and is not important
+       when playing them. Thus, for example, the difficulty level in Solo
+       (chapter 11) is not mentioned in the descriptive game ID.
+
+       These additional parameters are also not set permanently if you type
+       in a game ID. For example, suppose you have Solo set to `Advanced'
+       difficulty level, and then a friend wants your help with a `Trivial'
+       puzzle; so the friend reads out a random seed specifying `Trivial'
+       difficulty, and you type it in. The program will generate you the
+       same `Trivial' grid which your friend was having trouble with, but
+       once you have finished playing it, when you ask for a new game it
+       will automatically go back to the `Advanced' difficulty which it was
+       previously set on.
+
+   2.3 The `Type' menu
+
+       The `Type' menu, if present, may contain a list of preset game
+       settings. Selecting one of these will start a new random game with
+       the parameters specified.
+
+       The `Type' menu may also contain a `Custom' option which allows you
+       to fine-tune game parameters. The parameters available are specific
+       to each game and are described in the following sections.
+
+   2.4 Specifying game parameters on the command line
+
+       (This section does not apply to the Mac OS X version.)
+
+       The games in this collection deliberately do not ever save
+       information on to the computer they run on: they have no high score
+       tables and no saved preferences. (This is because I expect at least
+       some people to play them at work, and those people will probably
+       appreciate leaving as little evidence as possible!)
+
+       However, if you do want to arrange for one of these games to default
+       to a particular set of parameters, you can specify them on the
+       command line.
+
+       The easiest way to do this is to set up the parameters you want
+       using the `Type' menu (see section 2.3), and then to select `Random
+       Seed' from the `Game' or `File' menu (see section 2.2). The text
+       in the `Game ID' box will be composed of two parts, separated by a
+       hash. The first of these parts represents the game parameters (the
+       size of the playing area, for example, and anything else you set
+       using the `Type' menu).
+
+       If you run the game with just that parameter text on the command
+       line, it will start up with the settings you specified.
+
+       For example: if you run Cube (see chapter 4), select `Octahedron'
+       from the `Type' menu, and then go to the game ID selection, you
+       will see a string of the form `o2x2#338686542711620'. Take only the
+       part before the hash (`o2x2'), and start Cube with that text on the
+       command line: `PREFIX-cube o2x2'.
+
+       If you copy the _entire_ game ID on to the command line, the game
+       will start up in the specific game that was described. This is
+       occasionally a more convenient way to start a particular game ID
+       than by pasting it into the game ID selection box.
+
+       (You could also retrieve the encoded game parameters using the
+       `Specific' menu option instead of `Random Seed', but if you do then
+       some options, such as the difficulty level in Solo, will be missing.
+       See section 2.2 for more details on this.)
+
+   2.5 Unix command-line options
+
+       (This section only applies to the Unix port.)
+
+       In addition to being able to specify game parameters on the command
+       line (see section 2.4), there are various other options:
+
+       --game
+
+       --load
+
+           These options respectively determine whether the command-line
+           argument is treated as specifying game parameters or a save
+           file to load. Only one should be specified. If neither of these
+           options is specified, a guess is made based on the format of the
+           argument.
+
+       --generate _n_
+
+           If this option is specified, instead of a puzzle being
+           displayed, a number of descriptive game IDs will be invented and
+           printed on standard output. This is useful for gaining access
+           to the game generation algorithms without necessarily using the
+           frontend.
+
+           If game parameters are specified on the command-line, they will
+           be used to generate the game IDs; otherwise a default set of
+           parameters will be used.
+
+           The most common use of this option is in conjunction with `--
+           print', in which case its behaviour is slightly different; see
+           below.
+
+       --print _w_x_h_
+
+           If this option is specified, instead of a puzzle being
+           displayed, a printed representation of one or more unsolved
+           puzzles is sent to standard output, in PostScript format.
+
+           On each page of puzzles, there will be _w_ across and _h_ down.
+           If there are more puzzles than _w_x_h_, more than one page will
+           be printed.
+
+           If `--generate' has also been specified, the invented game
+           IDs will be used to generate the printed output. Otherwise,
+           a list of game IDs is expected on standard input (which can
+           be descriptive or random seeds; see section 2.2), in the same
+           format produced by `--generate'.
+
+           For example:
+
+             PREFIX-net --generate 12 --print 2x3 7x7w | lpr
+
+           will generate two pages of printed Net puzzles (each of which
+           will have a 7x7 wrapping grid), and pipe the output to the `lpr'
+           command, which on many systems will send them to an actual
+           printer.
+
+           There are various other options which affect printing; see
+           below.
+
+       --save _file-prefix_ [ --save-suffix _file-suffix_ ]
+
+           If this option is specified, instead of a puzzle being
+           displayed, saved-game files for one or more unsolved puzzles are
+           written to files constructed from the supplied prefix and/or
+           suffix.
+
+           If `--generate' has also been specified, the invented game
+           IDs will be used to generate the printed output. Otherwise,
+           a list of game IDs is expected on standard input (which can
+           be descriptive or random seeds; see section 2.2), in the same
+           format produced by `--generate'.
+
+           For example:
+
+             PREFIX-net --generate 12 --save game --save-suffix .sav
+
+           will generate twelve Net saved-game files with the names
+           game0.sav to game11.sav.
+
+       --version
+
+           Prints version information about the game, and then quits.
+
+       The following options are only meaningful if `--print' is also
+       specified:
+
+       --with-solutions
+
+           The set of pages filled with unsolved puzzles will be followed
+           by the solutions to those puzzles.
+
+       --scale _n_
+
+           Adjusts how big each puzzle is when printed. Larger numbers make
+           puzzles bigger; the default is 1.0.
+
+       --colour
+
+           Puzzles will be printed in colour, rather than in black and
+           white (if supported by the puzzle).
+
+Chapter 3: Net
+--------------
+
+       (_Note:_ the Windows version of this game is called NETGAME.EXE to
+       avoid clashing with Windows's own NET.EXE.)
+
+       I originally saw this in the form of a Flash game called
+       FreeNet [1], written by Pavils Jurjans; there are several other
+       implementations under the name NetWalk. The computer prepares a
+       network by connecting up the centres of squares in a grid, and then
+       shuffles the network by rotating every tile randomly. Your job is
+       to rotate it all back into place. The successful solution will be
+       an entirely connected network, with no closed loops. As a visual
+       aid, all tiles which are connected to the one in the middle are
+       highlighted.
+
+       [1] http://www.jurjans.lv/stuff/net/FreeNet.htm
+
+   3.1 Net controls
+
+       This game can be played with either the keyboard or the mouse. The
+       controls are:
+
+       _Select tile_: mouse pointer, arrow keys
+
+       _Rotate tile anticlockwise_: left mouse button, `A' key
+
+       _Rotate tile clockwise_: right mouse button, `D' key
+
+       _Rotate tile by 180 degrees_: `F' key
+
+       _Lock (or unlock) tile_: middle mouse button, shift-click, `S' key
+
+           You can lock a tile once you're sure of its orientation. You
+           can also unlock it again, but while it's locked you can't
+           accidentally turn it.
+
+       The following controls are not necessary to complete the game, but
+       may be useful:
+
+       _Shift grid_: Shift + arrow keys
+
+           On grids that wrap, you can move the origin of the grid, so
+           that tiles that were on opposite sides of the grid can be seen
+           together.
+
+       _Move centre_: Ctrl + arrow keys
+
+           You can change which tile is used as the source of highlighting.
+           (It doesn't ultimately matter which tile this is, as every tile
+           will be connected to every other tile in a correct solution,
+           but it may be helpful in the intermediate stages of solving the
+           puzzle.)
+
+       _Jumble tiles_: `J' key
+
+           This key turns all tiles that are not locked to random
+           orientations.
+
+       (All the actions described in section 2.1 are also available.)
+
+   3.2 Net parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in tiles.
+
+       _Walls wrap around_
+
+           If checked, flow can pass from the left edge to the right edge,
+           and from top to bottom, and vice versa.
+
+       _Barrier probability_
+
+           A number between 0.0 and 1.0 controlling whether an immovable
+           barrier is placed between two tiles to prevent flow between
+           them (a higher number gives more barriers). Since barriers
+           are immovable, they act as constraints on the solution (i.e.,
+           hints).
+
+           The grid generation in Net has been carefully arranged so that
+           the barriers are independent of the rest of the grid. This
+           means that if you note down the random seed used to generate
+           the current puzzle (see section 2.2), change the _Barrier
+           probability_ parameter, and then re-enter the same random seed,
+           you should see exactly the same starting grid, with the only
+           change being the number of barriers. So if you're stuck on a
+           particular grid and need a hint, you could start up another
+           instance of Net, set up the same parameters but a higher barrier
+           probability, and enter the game seed from the original Net
+           window.
+
+       _Ensure unique solution_
+
+           Normally, Net will make sure that the puzzles it presents have
+           only one solution. Puzzles with ambiguous sections can be more
+           difficult and more subtle, so if you like you can turn off this
+           feature and risk having ambiguous puzzles. (Also, finding _all_
+           the possible solutions can be an additional challenge for an
+           advanced player.)
+
+Chapter 4: Cube
+---------------
+
+       This is another one I originally saw as a web game. This one was a
+       Java game [2], by Paul Scott. You have a grid of 16 squares, six of
+       which are blue; on one square rests a cube. Your move is to use the
+       arrow keys to roll the cube through 90 degrees so that it moves to
+       an adjacent square. If you roll the cube on to a blue square, the
+       blue square is picked up on one face of the cube; if you roll a blue
+       face of the cube on to a non-blue square, the blueness is put down
+       again. (In general, whenever you roll the cube, the two faces that
+       come into contact swap colours.) Your job is to get all six blue
+       squares on to the six faces of the cube at the same time. Count your
+       moves and try to do it in as few as possible.
+
+       Unlike the original Java game, my version has an additional feature:
+       once you've mastered the game with a cube rolling on a square grid,
+       you can change to a triangular grid and roll any of a tetrahedron,
+       an octahedron or an icosahedron.
+
+       [2] http://www3.sympatico.ca/paulscott/cube/cube.htm
+
+   4.1 Cube controls
+
+       This game can be played with either the keyboard or the mouse.
+
+       Left-clicking anywhere on the window will move the cube (or other
+       solid) towards the mouse pointer.
+
+       The arrow keys can also used to roll the cube on its square grid in
+       the four cardinal directions. On the triangular grids, the mapping
+       of arrow keys to directions is more approximate. Vertical movement
+       is disallowed where it doesn't make sense. The four keys surrounding
+       the arrow keys on the numeric keypad (`7', `9', `1', `3') can be
+       used for diagonal movement.
+
+       (All the actions described in section 2.1 are also available.)
+
+   4.2 Cube parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Type of solid_
+
+           Selects the solid to roll (and hence the shape of the grid):
+           tetrahedron, cube, octahedron, or icosahedron.
+
+       _Width / top_, _Height / bottom_
+
+           On a square grid, horizontal and vertical dimensions. On a
+           triangular grid, the number of triangles on the top and bottom
+           rows respectively.
+
+Chapter 5: Fifteen
+------------------
+
+       The old ones are the best: this is the good old `15-puzzle' with
+       sliding tiles. You have a 4x4 square grid; 15 squares contain
+       numbered tiles, and the sixteenth is empty. Your move is to choose a
+       tile next to the empty space, and slide it into the space. The aim
+       is to end up with the tiles in numerical order, with the space in
+       the bottom right (so that the top row reads 1,2,3,4 and the bottom
+       row reads 13,14,15,_space_).
+
+   5.1 Fifteen controls
+
+       This game can be controlled with the mouse or the keyboard.
+
+       A left-click with the mouse in the row or column containing the
+       empty space will move as many tiles as necessary to move the space
+       to the mouse pointer.
+
+       The arrow keys will move a tile adjacent to the space in the
+       direction indicated (moving the space in the _opposite_ direction).
+
+       Pressing `h' will make a suggested move. Pressing `h' enough times
+       will solve the game, but it may scramble your progress while doing
+       so.
+
+       (All the actions described in section 2.1 are also available.)
+
+   5.2 Fifteen parameters
+
+       The only options available from the `Custom...' option on the `Type'
+       menu are _Width_ and _Height_, which are self-explanatory. (Once
+       you've changed these, it's not a `15-puzzle' any more, of course!)
+
+Chapter 6: Sixteen
+------------------
+
+       Another sliding tile puzzle, visually similar to Fifteen (see
+       chapter 5) but with a different type of move. This time, there is no
+       hole: all 16 squares on the grid contain numbered squares. Your move
+       is to shift an entire row left or right, or shift an entire column
+       up or down; every time you do that, the tile you shift off the grid
+       re-appears at the other end of the same row, in the space you just
+       vacated. To win, arrange the tiles into numerical order (1,2,3,4 on
+       the top row, 13,14,15,16 on the bottom). When you've done that, try
+       playing on different sizes of grid.
+
+       I _might_ have invented this game myself, though only by accident
+       if so (and I'm sure other people have independently invented it). I
+       thought I was imitating a screensaver I'd seen, but I have a feeling
+       that the screensaver might actually have been a Fifteen-type puzzle
+       rather than this slightly different kind. So this might be the one
+       thing in my puzzle collection which represents creativity on my part
+       rather than just engineering.
+
+   6.1 Sixteen controls
+
+       Left-clicking on an arrow will move the appropriate row or column in
+       the direction indicated. Right-clicking will move it in the opposite
+       direction.
+
+       Alternatively, use the cursor keys to move the position indicator
+       around the edge of the grid, and use the return key to move the
+       row/column in the direction indicated.
+
+       You can also move the tiles directly. Move the cursor onto a tile,
+       hold Control and press an arrow key to move the tile under the
+       cursor and move the cursor along with the tile. Or, hold Shift to
+       move only the tile. Pressing Enter simulates holding down Control
+       (press Enter again to release), while pressing Space simulates
+       holding down shift.
+
+       (All the actions described in section 2.1 are also available.)
+
+   6.2 Sixteen parameters
+
+       The parameters available from the `Custom...' option on the `Type'
+       menu are:
+
+        -  _Width_ and _Height_, which are self-explanatory.
+
+        -  You can ask for a limited shuffling operation to be performed on
+           the grid. By default, Sixteen will shuffle the grid in such a
+           way that any arrangement is about as probable as any other. You
+           can override this by requesting a precise number of shuffling
+           moves to be performed. Typically your aim is then to determine
+           the precise set of shuffling moves and invert them exactly,
+           so that you answer (say) a four-move shuffle with a four-move
+           solution. Note that the more moves you ask for, the more likely
+           it is that solutions shorter than the target length will turn
+           out to be possible.
+
+Chapter 7: Twiddle
+------------------
+
+       Twiddle is a tile-rearrangement puzzle, visually similar to Sixteen
+       (see chapter 6): you are given a grid of square tiles, each
+       containing a number, and your aim is to arrange the numbers into
+       ascending order.
+
+       In basic Twiddle, your move is to rotate a square group of four
+       tiles about their common centre. (Orientation is not significant
+       in the basic puzzle, although you can select it.) On more advanced
+       settings, you can rotate a larger square group of tiles.
+
+       I first saw this type of puzzle in the GameCube game `Metroid
+       Prime 2'. In the Main Gyro Chamber in that game, there is a puzzle
+       you solve to unlock a door, which is a special case of Twiddle. I
+       developed this game as a generalisation of that puzzle.
+
+   7.1 Twiddle controls
+
+       To play Twiddle, click the mouse in the centre of the square group
+       you wish to rotate. In the basic mode, you rotate a 2x2 square,
+       which means you have to click at a corner point where four tiles
+       meet.
+
+       In more advanced modes you might be rotating 3x3 or even more at a
+       time; if the size of the square is odd then you simply click in the
+       centre tile of the square you want to rotate.
+
+       Clicking with the left mouse button rotates the group anticlockwise.
+       Clicking with the right button rotates it clockwise.
+
+       You can also move an outline square around the grid with the cursor
+       keys; the square is the size above (2x2 by default, or larger).
+       Pressing the return key or space bar will rotate the current square
+       anticlockwise or clockwise respectively.
+
+       (All the actions described in section 2.1 are also available.)
+
+   7.2 Twiddle parameters
+
+       Twiddle provides several configuration options via the `Custom'
+       option on the `Type' menu:
+
+        -  You can configure the width and height of the puzzle grid.
+
+        -  You can configure the size of square block that rotates at a
+           time.
+
+        -  You can ask for every square in the grid to be distinguishable
+           (the default), or you can ask for a simplified puzzle in which
+           there are groups of identical numbers. In the simplified puzzle
+           your aim is just to arrange all the 1s into the first row, all
+           the 2s into the second row, and so on.
+
+        -  You can configure whether the orientation of tiles matters. If
+           you ask for an orientable puzzle, each tile will have a triangle
+           drawn in it. All the triangles must be pointing upwards to
+           complete the puzzle.
+
+        -  You can ask for a limited shuffling operation to be performed
+           on the grid. By default, Twiddle will shuffle the grid so much
+           that any arrangement is about as probable as any other. You can
+           override this by requesting a precise number of shuffling moves
+           to be performed. Typically your aim is then to determine the
+           precise set of shuffling moves and invert them exactly, so that
+           you answer (say) a four-move shuffle with a four-move solution.
+           Note that the more moves you ask for, the more likely it is that
+           solutions shorter than the target length will turn out to be
+           possible.
+
+Chapter 8: Rectangles
+---------------------
+
+       You have a grid of squares, with numbers written in some (but
+       not all) of the squares. Your task is to subdivide the grid into
+       rectangles of various sizes, such that (a) every rectangle contains
+       exactly one numbered square, and (b) the area of each rectangle is
+       equal to the number written in its numbered square.
+
+       Credit for this game goes to the Japanese puzzle magazine Nikoli [3]
+       ; I've also seen a Palm implementation at Puzzle Palace [4]. Unlike
+       Puzzle Palace's implementation, my version automatically generates
+       random grids of any size you like. The quality of puzzle design is
+       therefore not quite as good as hand-crafted puzzles would be, but on
+       the plus side you get an inexhaustible supply of puzzles tailored to
+       your own specification.
+
+       [3] http://www.nikoli.co.jp/en/puzzles/shikaku.html (beware of
+       Flash)
+
+       [4]
+       https://web.archive.org/web/20041024001459/http://www.puzzle.gr.jp/puzzle/sikaku/palm/index.html.en
+
+   8.1 Rectangles controls
+
+       This game is played with the mouse or cursor keys.
+
+       Left-click any edge to toggle it on or off, or left-click and
+       drag to draw an entire rectangle (or line) on the grid in one go
+       (removing any existing edges within that rectangle). Right-clicking
+       and dragging will allow you to erase the contents of a rectangle
+       without affecting its edges.
+
+       Alternatively, use the cursor keys to move the position indicator
+       around the board. Pressing the return key then allows you to use the
+       cursor keys to drag a rectangle out from that position, and pressing
+       the return key again completes the rectangle. Using the space bar
+       instead of the return key allows you to erase the contents of a
+       rectangle without affecting its edges, as above. Pressing escape
+       cancels a drag.
+
+       When a rectangle of the correct size is completed, it will be
+       shaded.
+
+       (All the actions described in section 2.1 are also available.)
+
+   8.2 Rectangles parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid, in squares.
+
+       _Expansion factor_
+
+           This is a mechanism for changing the type of grids generated by
+           the program. Some people prefer a grid containing a few large
+           rectangles to one containing many small ones. So you can ask
+           Rectangles to essentially generate a _smaller_ grid than the
+           size you specified, and then to expand it by adding rows and
+           columns.
+
+           The default expansion factor of zero means that Rectangles will
+           simply generate a grid of the size you ask for, and do nothing
+           further. If you set an expansion factor of (say) 0.5, it means
+           that each dimension of the grid will be expanded to half again
+           as big after generation. In other words, the initial grid will
+           be 2/3 the size in each dimension, and will be expanded to its
+           full size without adding any more rectangles.
+
+           Setting an expansion factor of around 0.5 tends to make the
+           game more difficult, and also (in my experience) rewards a
+           less deductive and more intuitive playing style. If you set it
+           _too_ high, though, the game simply cannot generate more than a
+           few rectangles to cover the entire grid, and the game becomes
+           trivial.
+
+       _Ensure unique solution_
+
+           Normally, Rectangles will make sure that the puzzles it presents
+           have only one solution. Puzzles with ambiguous sections can be
+           more difficult and more subtle, so if you like you can turn off
+           this feature and risk having ambiguous puzzles. Also, finding
+           _all_ the possible solutions can be an additional challenge for
+           an advanced player. Turning off this option can also speed up
+           puzzle generation.
+
+Chapter 9: Netslide
+-------------------
+
+       This game combines the grid generation of Net (see chapter 3) with
+       the movement of Sixteen (see chapter 6): you have a Net grid, but
+       instead of rotating tiles back into place you have to slide them
+       into place by moving a whole row at a time.
+
+       As in Sixteen, control is with the mouse or cursor keys. See section
+       6.1.
+
+       The available game parameters have similar meanings to those in Net
+       (see section 3.2) and Sixteen (see section 6.2).
+
+       Netslide was contributed to this collection by Richard Boulton.
+
+Chapter 10: Pattern
+-------------------
+
+       You have a grid of squares, which must all be filled in either black
+       or white. Beside each row of the grid are listed the lengths of the
+       runs of black squares on that row; above each column are listed the
+       lengths of the runs of black squares in that column. Your aim is to
+       fill in the entire grid black or white.
+
+       I first saw this puzzle form around 1995, under the name
+       `nonograms'. I've seen it in various places since then, under
+       different names.
+
+       Normally, puzzles of this type turn out to be a meaningful picture
+       of something once you've solved them. However, since this version
+       generates the puzzles automatically, they will just look like random
+       groupings of squares. (One user has suggested that this is actually
+       a _good_ thing, since it prevents you from guessing the colour of
+       squares based on the picture, and forces you to use logic instead.)
+       The advantage, though, is that you never run out of them.
+
+  10.1 Pattern controls
+
+       This game is played with the mouse.
+
+       Left-click in a square to colour it black. Right-click to colour it
+       white. If you make a mistake, you can middle-click, or hold down
+       Shift while clicking with any button, to colour the square in the
+       default grey (meaning `undecided') again.
+
+       You can click and drag with the left or right mouse button to colour
+       a vertical or horizontal line of squares black or white at a time
+       (respectively). If you click and drag with the middle button, or
+       with Shift held down, you can colour a whole rectangle of squares
+       grey.
+
+       You can also move around the grid with the cursor keys. Pressing the
+       return key will cycle the current cell through empty, then black,
+       then white, then empty, and the space bar does the same cycle in
+       reverse.
+
+       Moving the cursor while holding Control will colour the moved-over
+       squares black. Holding Shift will colour the moved-over squares
+       white, and holding both will colour them grey.
+
+       (All the actions described in section 2.1 are also available.)
+
+  10.2 Pattern parameters
+
+       The only options available from the `Custom...' option on the `Type'
+       menu are _Width_ and _Height_, which are self-explanatory.
+
+Chapter 11: Solo
+----------------
+
+       You have a square grid, which is divided into as many equally sized
+       sub-blocks as the grid has rows. Each square must be filled in with
+       a digit from 1 to the size of the grid, in such a way that
+
+        -  every row contains only one occurrence of each digit
+
+        -  every column contains only one occurrence of each digit
+
+        -  every block contains only one occurrence of each digit.
+
+        -  (optionally, by default off) each of the square's two main
+           diagonals contains only one occurrence of each digit.
+
+       You are given some of the numbers as clues; your aim is to place the
+       rest of the numbers correctly.
+
+       Under the default settings, the sub-blocks are square or
+       rectangular. The default puzzle size is 3x3 (a 9x9 actual grid,
+       divided into nine 3x3 blocks). You can also select sizes with
+       rectangular blocks instead of square ones, such as 2x3 (a 6x6 grid
+       divided into six 3x2 blocks). Alternatively, you can select `jigsaw'
+       mode, in which the sub-blocks are arbitrary shapes which differ
+       between individual puzzles.
+
+       Another available mode is `killer'. In this mode, clues are not
+       given in the form of filled-in squares; instead, the grid is divided
+       into `cages' by coloured lines, and for each cage the game tells
+       you what the sum of all the digits in that cage should be. Also,
+       no digit may appear more than once within a cage, even if the cage
+       crosses the boundaries of existing regions.
+
+       If you select a puzzle size which requires more than 9 digits, the
+       additional digits will be letters of the alphabet. For example, if
+       you select 3x4 then the digits which go in your grid will be 1 to 9,
+       plus `a', `b' and `c'. This cannot be selected for killer puzzles.
+
+       I first saw this puzzle in Nikoli [5], although it's also been
+       popularised by various newspapers under the name `Sudoku' or `Su
+       Doku'. Howard Garns is considered the inventor of the modern form of
+       the puzzle, and it was first published in _Dell Pencil Puzzles and
+       Word Games_. A more elaborate treatment of the history of the puzzle
+       can be found on Wikipedia [6].
+
+       [5] http://www.nikoli.co.jp/en/puzzles/sudoku.html (beware of Flash)
+
+       [6] http://en.wikipedia.org/wiki/Sudoku
+
+  11.1 Solo controls
+
+       To play Solo, simply click the mouse in any empty square and then
+       type a digit or letter on the keyboard to fill that square. If you
+       make a mistake, click the mouse in the incorrect square and press
+       Space to clear it again (or use the Undo feature).
+
+       If you _right_-click in a square and then type a number, that
+       number will be entered in the square as a `pencil mark'. You can
+       have pencil marks for multiple numbers in the same square. Squares
+       containing filled-in numbers cannot also contain pencil marks.
+
+       The game pays no attention to pencil marks, so exactly what you
+       use them for is up to you: you can use them as reminders that a
+       particular square needs to be re-examined once you know more about
+       a particular number, or you can use them as lists of the possible
+       numbers in a given square, or anything else you feel like.
+
+       To erase a single pencil mark, right-click in the square and type
+       the same number again.
+
+       All pencil marks in a square are erased when you left-click and type
+       a number, or when you left-click and press space. Right-clicking and
+       pressing space will also erase pencil marks.
+
+       Alternatively, use the cursor keys to move the mark around the grid.
+       Pressing the return key toggles the mark (from a normal mark to a
+       pencil mark), and typing a number in is entered in the square in the
+       appropriate way; typing in a 0 or using the space bar will clear a
+       filled square.
+
+       (All the actions described in section 2.1 are also available.)
+
+  11.2 Solo parameters
+
+       Solo allows you to configure two separate dimensions of the puzzle
+       grid on the `Type' menu: the number of columns, and the number of
+       rows, into which the main grid is divided. (The size of a block is
+       the inverse of this: for example, if you select 2 columns and 3
+       rows, each actual block will have 3 columns and 2 rows.)
+
+       If you tick the `X' checkbox, Solo will apply the optional extra
+       constraint that the two main diagonals of the grid also contain
+       one of every digit. (This is sometimes known as `Sudoku-X' in
+       newspapers.) In this mode, the squares on the two main diagonals
+       will be shaded slightly so that you know it's enabled.
+
+       If you tick the `Jigsaw' checkbox, Solo will generate randomly
+       shaped sub-blocks. In this mode, the actual grid size will be taken
+       to be the product of the numbers entered in the `Columns' and `Rows'
+       boxes. There is no reason why you have to enter a number greater
+       than 1 in both boxes; Jigsaw mode has no constraint on the grid
+       size, and it can even be a prime number if you feel like it.
+
+       If you tick the `Killer' checkbox, Solo will generate a set of
+       of cages, which are randomly shaped and drawn in an outline of a
+       different colour. Each of these regions contains a smaller clue
+       which shows the digit sum of all the squares in this region.
+
+       You can also configure the type of symmetry shown in the generated
+       puzzles. More symmetry makes the puzzles look prettier but may also
+       make them easier, since the symmetry constraints can force more
+       clues than necessary to be present. Completely asymmetric puzzles
+       have the freedom to contain as few clues as possible.
+
+       Finally, you can configure the difficulty of the generated puzzles.
+       Difficulty levels are judged by the complexity of the techniques
+       of deduction required to solve the puzzle: each level requires a
+       mode of reasoning which was not necessary in the previous one. In
+       particular, on difficulty levels `Trivial' and `Basic' there will be
+       a square you can fill in with a single number at all times, whereas
+       at `Intermediate' level and beyond you will have to make partial
+       deductions about the _set_ of squares a number could be in (or the
+       set of numbers that could be in a square). At `Unreasonable' level,
+       even this is not enough, and you will eventually have to make a
+       guess, and then backtrack if it turns out to be wrong.
+
+       Generating difficult puzzles is itself difficult: if you select one
+       of the higher difficulty levels, Solo may have to make many attempts
+       at generating a puzzle before it finds one hard enough for you. Be
+       prepared to wait, especially if you have also configured a large
+       puzzle size.
+
+Chapter 12: Mines
+-----------------
+
+       You have a grid of covered squares, some of which contain mines, but
+       you don't know which. Your job is to uncover every square which does
+       _not_ contain a mine. If you uncover a square containing a mine, you
+       lose. If you uncover a square which does not contain a mine, you
+       are told how many mines are contained within the eight surrounding
+       squares.
+
+       This game needs no introduction; popularised by Windows, it is
+       perhaps the single best known desktop puzzle game in existence.
+
+       This version of it has an unusual property. By default, it will
+       generate its mine positions in such a way as to ensure that you
+       never need to _guess_ where a mine is: you will always be able
+       to deduce it somehow. So you will never, as can happen in other
+       versions, get to the last four squares and discover that there are
+       two mines left but you have no way of knowing for sure where they
+       are.
+
+  12.1 Mines controls
+
+       This game is played with the mouse.
+
+       If you left-click in a covered square, it will be uncovered.
+
+       If you right-click in a covered square, it will place a flag which
+       indicates that the square is believed to be a mine. Left-clicking in
+       a marked square will not uncover it, for safety. You can right-click
+       again to remove a mark placed in error.
+
+       If you left-click in an _uncovered_ square, it will `clear around'
+       the square. This means: if the square has exactly as many flags
+       surrounding it as it should have mines, then all the covered squares
+       next to it which are _not_ flagged will be uncovered. So once you
+       think you know the location of all the mines around a square, you
+       can use this function as a shortcut to avoid having to click on each
+       of the remaining squares one by one.
+
+       If you uncover a square which has _no_ mines in the surrounding
+       eight squares, then it is obviously safe to uncover those squares in
+       turn, and so on if any of them also has no surrounding mines. This
+       will be done for you automatically; so sometimes when you uncover a
+       square, a whole new area will open up to be explored.
+
+       You can also use the cursor keys to move around the minefield.
+       Pressing the return key in a covered square uncovers it, and in
+       an uncovered square will clear around it (so it acts as the left
+       button), pressing the space bar in a covered square will place a
+       flag (similarly, it acts as the right button).
+
+       All the actions described in section 2.1 are also available.
+
+       Even Undo is available, although you might consider it cheating to
+       use it. If you step on a mine, the program will only reveal the mine
+       in question (unlike most other implementations, which reveal all of
+       them). You can then Undo your fatal move and continue playing if you
+       like. The program will track the number of times you died (and Undo
+       will not reduce that counter), so when you get to the end of the
+       game you know whether or not you did it without making any errors.
+
+       (If you really want to know the full layout of the grid, which other
+       implementations will show you after you die, you can always use the
+       Solve menu option.)
+
+  12.2 Mines parameters
+
+       The options available from the `Custom...' option on the `Type' menu
+       are:
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+       _Mines_
+
+           Number of mines in the grid. You can enter this as an absolute
+           mine count, or alternatively you can put a % sign on the end
+           in which case the game will arrange for that proportion of the
+           squares in the grid to be mines.
+
+           Beware of setting the mine count too high. At very high
+           densities, the program may spend forever searching for a
+           solvable grid.
+
+       _Ensure solubility_
+
+           When this option is enabled (as it is by default), Mines will
+           ensure that the entire grid can be fully deduced starting
+           from the initial open space. If you prefer the riskier grids
+           generated by other implementations, you can switch off this
+           option.
+
+Chapter 13: Same Game
+---------------------
+
+       You have a grid of coloured squares, which you have to clear by
+       highlighting contiguous regions of more than one coloured square;
+       the larger the region you highlight, the more points you get (and
+       the faster you clear the arena).
+
+       If you clear the grid you win. If you end up with nothing but single
+       squares (i.e., there are no more clickable regions left) you lose.
+
+       Removing a region causes the rest of the grid to shuffle up: blocks
+       that are suspended will fall down (first), and then empty columns
+       are filled from the right.
+
+       Same Game was contributed to this collection by James Harvey.
+
+  13.1 Same Game controls
+
+       This game can be played with either the keyboard or the mouse.
+
+       If you left-click an unselected region, it becomes selected
+       (possibly clearing the current selection).
+
+       If you left-click the selected region, it will be removed (and the
+       rest of the grid shuffled immediately).
+
+       If you right-click the selected region, it will be unselected.
+
+       The cursor keys move a cursor around the grid. Pressing the Space or
+       Enter keys while the cursor is in an unselected region selects it;
+       pressing Space or Enter again removes it as above.
+
+       (All the actions described in section 2.1 are also available.)
+
+  13.2 Same Game parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+       _No. of colours_
+
+           Number of different colours used to fill the grid; the more
+           colours, the fewer large regions of colour and thus the more
+           difficult it is to successfully clear the grid.
+
+       _Scoring system_
+
+           Controls the precise mechanism used for scoring. With the
+           default system, `(n-2)^2', only regions of three squares or more
+           will score any points at all. With the alternative `(n-1)^2'
+           system, regions of two squares score a point each, and larger
+           regions score relatively more points.
+
+       _Ensure solubility_
+
+           If this option is ticked (the default state), generated grids
+           will be guaranteed to have at least one solution.
+
+           If you turn it off, the game generator will not try to guarantee
+           soluble grids; it will, however, still ensure that there are at
+           least 2 squares of each colour on the grid at the start (since a
+           grid with exactly one square of a given colour is _definitely_
+           insoluble). Grids generated with this option disabled may
+           contain more large areas of contiguous colour, leading to
+           opportunities for higher scores; they can also take less time to
+           generate.
+
+Chapter 14: Flip
+----------------
+
+       You have a grid of squares, some light and some dark. Your aim is to
+       light all the squares up at the same time. You can choose any square
+       and flip its state from light to dark or dark to light, but when you
+       do so, other squares around it change state as well.
+
+       Each square contains a small diagram showing which other squares
+       change when you flip it.
+
+  14.1 Flip controls
+
+       This game can be played with either the keyboard or the mouse.
+
+       Left-click in a square to flip it and its associated squares, or use
+       the cursor keys to choose a square and the space bar or Enter key to
+       flip.
+
+       If you use the `Solve' function on this game, it will mark some of
+       the squares in red. If you click once in every square with a red
+       mark, the game should be solved. (If you click in a square _without_
+       a red mark, a red mark will appear in it to indicate that you will
+       need to reverse that operation to reach the solution.)
+
+       (All the actions described in section 2.1 are also available.)
+
+  14.2 Flip parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+       _Shape type_
+
+           This control determines the shape of the region which is flipped
+           by clicking in any given square. The default setting, `Crosses',
+           causes every square to flip itself and its four immediate
+           neighbours (or three or two if it's at an edge or corner). The
+           other setting, `Random', causes a random shape to be chosen for
+           every square, so the game is different every time.
+
+Chapter 15: Guess
+-----------------
+
+       You have a set of coloured pegs, and have to reproduce a
+       predetermined sequence of them (chosen by the computer) within a
+       certain number of guesses.
+
+       Each guess gets marked with the number of correctly-coloured pegs
+       in the correct places (in black), and also the number of correctly-
+       coloured pegs in the wrong places (in white).
+
+       This game is also known (and marketed, by Hasbro, mainly) as a board
+       game `Mastermind', with 6 colours, 4 pegs per row, and 10 guesses.
+       However, this version allows custom settings of number of colours
+       (up to 10), number of pegs per row, and number of guesses.
+
+       Guess was contributed to this collection by James Harvey.
+
+  15.1 Guess controls
+
+       This game can be played with either the keyboard or the mouse.
+
+       With the mouse, drag a coloured peg from the tray on the left-hand
+       side to its required position in the current guess; pegs may also
+       be dragged from current and past guesses to copy them elsewhere. To
+       remove a peg, drag it off its current position to somewhere invalid.
+
+       Right-clicking in the current guess adds a `hold' marker; pegs that
+       have hold markers will be automatically added to the next guess
+       after marking.
+
+       Alternatively, with the keyboard, the up and down cursor keys can
+       be used to select a peg colour, the left and right keys to select a
+       peg position, and the space bar or Enter key to place a peg of the
+       selected colour in the chosen position. `D' or Backspace removes a
+       peg, and Space adds a hold marker.
+
+       Pressing `h' or `?' will fill the current guess with a suggested
+       guess. Using this is not recommended for 10 or more pegs as it is
+       slow.
+
+       When the guess is complete, the smaller feedback pegs will be
+       highlighted; clicking on these (or moving the peg cursor to them
+       with the arrow keys and pressing the space bar or Enter key) will
+       mark the current guess, copy any held pegs to the next guess, and
+       move the `current guess' marker.
+
+       If you correctly position all the pegs the solution will be
+       displayed below; if you run out of guesses (or select `Solve...')
+       the solution will also be revealed.
+
+       (All the actions described in section 2.1 are also available.)
+
+  15.2 Guess parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu. The default game matches the parameters for the board
+       game `Mastermind'.
+
+       _Colours_
+
+           Number of colours the solution is chosen from; from 2 to 10
+           (more is harder).
+
+       _Pegs per guess_
+
+           Number of pegs per guess (more is harder).
+
+       _Guesses_
+
+           Number of guesses you have to find the solution in (fewer is
+           harder).
+
+       _Allow blanks_
+
+           Allows blank pegs to be given as part of a guess (makes it
+           easier, because you know that those will never be counted as
+           part of the solution). This is turned off by default.
+
+           Note that this doesn't allow blank pegs in the solution; if you
+           really wanted that, use one extra colour.
+
+       _Allow duplicates_
+
+           Allows the solution (and the guesses) to contain colours more
+           than once; this increases the search space (making things
+           harder), and is turned on by default.
+
+Chapter 16: Pegs
+----------------
+
+       A number of pegs are placed in holes on a board. You can remove a
+       peg by jumping an adjacent peg over it (horizontally or vertically)
+       to a vacant hole on the other side. Your aim is to remove all but
+       one of the pegs initially present.
+
+       This game, best known as `Peg Solitaire', is possibly one of the
+       oldest puzzle games still commonly known.
+
+  16.1 Pegs controls
+
+       To move a peg, drag it with the mouse from its current position to
+       its final position. If the final position is exactly two holes away
+       from the initial position, is currently unoccupied by a peg, and
+       there is a peg in the intervening square, the move will be permitted
+       and the intervening peg will be removed.
+
+       Vacant spaces which you can move a peg into are marked with holes. A
+       space with no peg and no hole is not available for moving at all: it
+       is an obstacle which you must work around.
+
+       You can also use the cursor keys to move a position indicator around
+       the board. Pressing the return key while over a peg, followed by a
+       cursor key, will jump the peg in that direction (if that is a legal
+       move).
+
+       (All the actions described in section 2.1 are also available.)
+
+  16.2 Pegs parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in holes.
+
+       _Board type_
+
+           Controls whether you are given a board of a standard shape or
+           a randomly generated shape. The two standard shapes currently
+           supported are `Cross' and `Octagon' (also commonly known as the
+           English and European traditional board layouts respectively).
+           Selecting `Random' will give you a different board shape every
+           time (but always one that is known to have a solution).
+
+Chapter 17: Dominosa
+--------------------
+
+       A normal set of dominoes - that is, one instance of every
+       (unordered) pair of numbers from 0 to 6 - has been arranged
+       irregularly into a rectangle; then the number in each square has
+       been written down and the dominoes themselves removed. Your task is
+       to reconstruct the pattern by arranging the set of dominoes to match
+       the provided array of numbers.
+
+       This puzzle is widely credited to O. S. Adler, and takes part of its
+       name from those initials.
+
+  17.1 Dominosa controls
+
+       Left-clicking between any two adjacent numbers places a domino
+       covering them, or removes one if it is already present. Trying to
+       place a domino which overlaps existing dominoes will remove the ones
+       it overlaps.
+
+       Right-clicking between two adjacent numbers draws a line between
+       them, which you can use to remind yourself that you know those two
+       numbers are _not_ covered by a single domino. Right-clicking again
+       removes the line.
+
+       You can also use the cursor keys to move a cursor around the grid.
+       When the cursor is half way between two adjacent numbers, pressing
+       the return key will place a domino covering those numbers, or
+       pressing the space bar will lay a line between the two squares.
+       Repeating either action removes the domino or line.
+
+       Pressing a number key will highlight all occurrences of that number.
+       Pressing that number again will clear the highlighting. Up to two
+       different numbers can be highlighted at any given time.
+
+       (All the actions described in section 2.1 are also available.)
+
+  17.2 Dominosa parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Maximum number on dominoes_
+
+           Controls the size of the puzzle, by controlling the size of the
+           set of dominoes used to make it. Dominoes with numbers going
+           up to N will give rise to an (N+2) x (N+1) rectangle; so, in
+           particular, the default value of 6 gives an 8x7 grid.
+
+       _Ensure unique solution_
+
+           Normally, Dominosa will make sure that the puzzles it presents
+           have only one solution. Puzzles with ambiguous sections can be
+           more difficult and sometimes more subtle, so if you like you
+           can turn off this feature. Also, finding _all_ the possible
+           solutions can be an additional challenge for an advanced player.
+           Turning off this option can also speed up puzzle generation.
+
+Chapter 18: Untangle
+--------------------
+
+       You are given a number of points, some of which have lines drawn
+       between them. You can move the points about arbitrarily; your aim is
+       to position the points so that no line crosses another.
+
+       I originally saw this in the form of a Flash game called Planarity
+       [7], written by John Tantalo.
+
+       [7] http://planarity.net
+
+  18.1 Untangle controls
+
+       To move a point, click on it with the left mouse button and drag it
+       into a new position.
+
+       (All the actions described in section 2.1 are also available.)
+
+  18.2 Untangle parameters
+
+       There is only one parameter available from the `Custom...' option on
+       the `Type' menu:
+
+       _Number of points_
+
+           Controls the size of the puzzle, by specifying the number of
+           points in the generated graph.
+
+Chapter 19: Black Box
+---------------------
+
+       A number of balls are hidden in a rectangular arena. You have to
+       deduce the positions of the balls by firing lasers positioned at the
+       edges of the arena and observing how their beams are deflected.
+
+       Beams will travel straight from their origin until they hit the
+       opposite side of the arena (at which point they emerge), unless
+       affected by balls in one of the following ways:
+
+        -  A beam that hits a ball head-on is absorbed and will never re-
+           emerge. This includes beams that meet a ball on the first rank
+           of the arena.
+
+        -  A beam with a ball in its front-left square and no ball ahead of
+           it gets deflected 90 degrees to the right.
+
+        -  A beam with a ball in its front-right square and no ball ahead
+           of it gets similarly deflected to the left.
+
+        -  A beam that would re-emerge from its entry location is
+           considered to be `reflected'.
+
+        -  A beam which would get deflected before entering the arena by a
+           ball to the front-left or front-right of its entry point is also
+           considered to be `reflected'.
+
+       Beams that are reflected appear as a `R'; beams that hit balls head-
+       on appear as `H'. Otherwise, a number appears at the firing point
+       and the location where the beam emerges (this number is unique to
+       that shot).
+
+       You can place guesses as to the location of the balls, based on the
+       entry and exit patterns of the beams; once you have placed enough
+       balls a button appears enabling you to have your guesses checked.
+
+       Here is a diagram showing how the positions of balls can create each
+       of the beam behaviours shown above:
+
+          1RHR---- 
+         |..O.O...|
+         2........3
+         |........|
+         |........|
+         3........|
+         |......O.|
+         H........|
+         |.....O..|
+          12-RR---
+
+       As shown, it is possible for a beam to receive multiple reflections
+       before re-emerging (see turn 3). Similarly, a beam may be reflected
+       (possibly more than once) before receiving a hit (the `H' on the
+       left side of the example).
+
+       Note that any layout with more than 4 balls may have a non-unique
+       solution. The following diagram illustrates this; if you know the
+       board contains 5 balls, it is impossible to determine where the
+       fifth ball is (possible positions marked with an x):
+
+          -------- 
+         |........|
+         |........|
+         |..O..O..|
+         |...xx...|
+         |...xx...|
+         |..O..O..|
+         |........|
+         |........|
+          --------
+
+       For this reason, when you have your guesses checked, the game
+       will check that your solution _produces the same results_ as the
+       computer's, rather than that your solution is identical to the
+       computer's. So in the above example, you could put the fifth ball at
+       _any_ of the locations marked with an x, and you would still win.
+
+       Black Box was contributed to this collection by James Harvey.
+
+  19.1 Black Box controls
+
+       To fire a laser beam, left-click in a square around the edge of
+       the arena. The results will be displayed immediately. Clicking or
+       holding the left button on one of these squares will highlight the
+       current go (or a previous go) to confirm the exit point for that
+       laser, if applicable.
+
+       To guess the location of a ball, left-click within the arena and a
+       black circle will appear marking the guess; click again to remove
+       the guessed ball.
+
+       Locations in the arena may be locked against modification by right-
+       clicking; whole rows and columns may be similarly locked by right-
+       clicking in the laser square above/below that column, or to the
+       left/right of that row.
+
+       The cursor keys may also be used to move around the grid. Pressing
+       the Enter key will fire a laser or add a new ball-location guess,
+       and pressing Space will lock a cell, row, or column.
+
+       When an appropriate number of balls have been guessed, a button will
+       appear at the top-left corner of the grid; clicking that (with mouse
+       or cursor) will check your guesses.
+
+       If you click the `check' button and your guesses are not correct,
+       the game will show you the minimum information necessary to
+       demonstrate this to you, so you can try again. If your ball
+       positions are not consistent with the beam paths you already know
+       about, one beam path will be circled to indicate that it proves you
+       wrong. If your positions match all the existing beam paths but are
+       still wrong, one new beam path will be revealed (written in red)
+       which is not consistent with your current guesses.
+
+       If you decide to give up completely, you can select Solve to reveal
+       the actual ball positions. At this point, correctly-placed balls
+       will be displayed as filled black circles, incorrectly-placed balls
+       as filled black circles with red crosses, and missing balls as
+       filled red circles. In addition, a red circle marks any laser you
+       had already fired which is not consistent with your ball layout
+       (just as when you press the `check' button), and red text marks
+       any laser you _could_ have fired in order to distinguish your ball
+       layout from the correct one.
+
+       (All the actions described in section 2.1 are also available.)
+
+  19.2 Black Box parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares. There are 2 x _Width_ x _Height_ lasers
+           per grid, two per row and two per column.
+
+       _No. of balls_
+
+           Number of balls to place in the grid. This can be a single
+           number, or a range (separated with a hyphen, like `2-6'),
+           and determines the number of balls to place on the grid.
+           The `reveal' button is only enabled if you have guessed an
+           appropriate number of balls; a guess using a different number
+           to the original solution is still acceptable, if all the beam
+           inputs and outputs match.
+
+Chapter 20: Slant
+-----------------
+
+       You have a grid of squares. Your aim is to draw a diagonal line
+       through each square, and choose which way each line slants so that
+       the following conditions are met:
+
+        -  The diagonal lines never form a loop.
+
+        -  Any point with a circled number has precisely that many lines
+           meeting at it. (Thus, a 4 is the centre of a cross shape,
+           whereas a zero is the centre of a diamond shape - or rather, a
+           partial diamond shape, because a zero can never appear in the
+           middle of the grid because that would immediately cause a loop.)
+
+       Credit for this puzzle goes to Nikoli [8].
+
+       [8] http://www.nikoli.co.jp/ja/puzzles/gokigen_naname (in Japanese)
+
+  20.1 Slant controls
+
+       Left-clicking in a blank square will place a \ in it (a line leaning
+       to the left, i.e. running from the top left of the square to the
+       bottom right). Right-clicking in a blank square will place a / in it
+       (leaning to the right, running from top right to bottom left).
+
+       Continuing to click either button will cycle between the three
+       possible square contents. Thus, if you left-click repeatedly in a
+       blank square it will change from blank to \ to / back to blank, and
+       if you right-click repeatedly the square will change from blank to /
+       to \ back to blank. (Therefore, you can play the game entirely with
+       one button if you need to.)
+
+       You can also use the cursor keys to move around the grid. Pressing
+       the return or space keys will place a \ or a /, respectively, and
+       will then cycle them as above. You can also press / or \ to place a
+       / or \, respectively, independent of what is already in the cursor
+       square. Backspace removes any line from the cursor square.
+
+       (All the actions described in section 2.1 are also available.)
+
+  20.2 Slant parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+       _Difficulty_
+
+           Controls the difficulty of the generated puzzle. At Hard
+           level, you are required to do deductions based on knowledge of
+           _relationships_ between squares rather than always being able to
+           deduce the exact contents of one square at a time. (For example,
+           you might know that two squares slant in the same direction,
+           even if you don't yet know what that direction is, and this
+           might enable you to deduce something about still other squares.)
+           Even at Hard level, guesswork and backtracking should never be
+           necessary.
+
+Chapter 21: Light Up
+--------------------
+
+       You have a grid of squares. Some are filled in black; some of the
+       black squares are numbered. Your aim is to `light up' all the empty
+       squares by placing light bulbs in some of them.
+
+       Each light bulb illuminates the square it is on, plus all squares
+       in line with it horizontally or vertically unless a black square is
+       blocking the way.
+
+       To win the game, you must satisfy the following conditions:
+
+        -  All non-black squares are lit.
+
+        -  No light is lit by another light.
+
+        -  All numbered black squares have exactly that number of lights
+           adjacent to them (in the four squares above, below, and to the
+           side).
+
+       Non-numbered black squares may have any number of lights adjacent to
+       them.
+
+       Credit for this puzzle goes to Nikoli [9].
+
+       Light Up was contributed to this collection by James Harvey.
+
+       [9] http://www.nikoli.co.jp/en/puzzles/akari.html (beware of Flash)
+
+  21.1 Light Up controls
+
+       Left-clicking in a non-black square will toggle the presence of a
+       light in that square. Right-clicking in a non-black square toggles a
+       mark there to aid solving; it can be used to highlight squares that
+       cannot be lit, for example.
+
+       You may not place a light in a marked square, nor place a mark in a
+       lit square.
+
+       The game will highlight obvious errors in red. Lights lit by other
+       lights are highlighted in this way, as are numbered squares which do
+       not (or cannot) have the right number of lights next to them.
+
+       Thus, the grid is solved when all non-black squares have yellow
+       highlights and there are no red lights.
+
+       (All the actions described in section 2.1 are also available.)
+
+  21.2 Light Up parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+       _%age of black squares_
+
+           Rough percentage of black squares in the grid.
+
+           This is a hint rather than an instruction. If the grid generator
+           is unable to generate a puzzle to this precise specification, it
+           will increase the proportion of black squares until it can.
+
+       _Symmetry_
+
+           Allows you to specify the required symmetry of the black squares
+           in the grid. (This does not affect the difficulty of the puzzles
+           noticeably.)
+
+       _Difficulty_
+
+           `Easy' means that the puzzles should be soluble without
+           backtracking or guessing, `Hard' means that some guesses will
+           probably be necessary.
+
+Chapter 22: Map
+---------------
+
+       You are given a map consisting of a number of regions. Your task is
+       to colour each region with one of four colours, in such a way that
+       no two regions sharing a boundary have the same colour. You are
+       provided with some regions already coloured, sufficient to make the
+       remainder of the solution unique.
+
+       Only regions which share a length of border are required to be
+       different colours. Two regions which meet at only one _point_ (i.e.
+       are diagonally separated) may be the same colour.
+
+       I believe this puzzle is original; I've never seen an implementation
+       of it anywhere else. The concept of a four-colouring puzzle was
+       suggested by Owen Dunn; credit must also go to Nikoli and to Verity
+       Allan for inspiring the train of thought that led to me realising
+       Owen's suggestion was a viable puzzle. Thanks also to Gareth Taylor
+       for many detailed suggestions.
+
+  22.1 Map controls
+
+       To colour a region, click the left mouse button on an existing
+       region of the desired colour and drag that colour into the new
+       region.
+
+       (The program will always ensure the starting puzzle has at least one
+       region of each colour, so that this is always possible!)
+
+       If you need to clear a region, you can drag from an empty region, or
+       from the puzzle boundary if there are no empty regions left.
+
+       Dragging a colour using the _right_ mouse button will stipple the
+       region in that colour, which you can use as a note to yourself that
+       you think the region _might_ be that colour. A region can contain
+       stipples in multiple colours at once. (This is often useful at the
+       harder difficulty levels.)
+
+       You can also use the cursor keys to move around the map: the colour
+       of the cursor indicates the position of the colour you would drag
+       (which is not obvious if you're on a region's boundary, since it
+       depends on the direction from which you approached the boundary).
+       Pressing the return key starts a drag of that colour, as above,
+       which you control with the cursor keys; pressing the return key
+       again finishes the drag. The space bar can be used similarly to
+       create a stippled region. Double-pressing the return key (without
+       moving the cursor) will clear the region, as a drag from an empty
+       region does: this is useful with the cursor mode if you have filled
+       the entire map in but need to correct the layout.
+
+       If you press L during play, the game will toggle display of a number
+       in each region of the map. This is useful if you want to discuss a
+       particular puzzle instance with a friend - having an unambiguous
+       name for each region is much easier than trying to refer to them all
+       by names such as `the one down and right of the brown one on the top
+       border'.
+
+       (All the actions described in section 2.1 are also available.)
+
+  22.2 Map parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+       _Regions_
+
+           Number of regions in the generated map.
+
+       _Difficulty_
+
+           In `Easy' mode, there should always be at least one region whose
+           colour can be determined trivially. In `Normal' and `Hard'
+           modes, you will have to use increasingly complex logic to deduce
+           the colour of some regions. However, it will always be possible
+           without having to guess or backtrack.
+
+           In `Unreasonable' mode, the program will feel free to generate
+           puzzles which are as hard as it can possibly make them: the
+           only constraint is that they should still have a unique
+           solution. Solving Unreasonable puzzles may require guessing and
+           backtracking.
+
+Chapter 23: Loopy
+-----------------
+
+       You are given a grid of dots, marked with yellow lines to indicate
+       which dots you are allowed to connect directly together. Your aim is
+       to use some subset of those yellow lines to draw a single unbroken
+       loop from dot to dot within the grid.
+
+       Some of the spaces between the lines contain numbers. These numbers
+       indicate how many of the lines around that space form part of the
+       loop. The loop you draw must correctly satisfy all of these clues to
+       be considered a correct solution.
+
+       In the default mode, the dots are arranged in a grid of squares;
+       however, you can also play on triangular or hexagonal grids, or even
+       more exotic ones.
+
+       Credit for the basic puzzle idea goes to Nikoli [10].
+
+       Loopy was originally contributed to this collection by Mike Pinna,
+       and subsequently enhanced to handle various types of non-square grid
+       by Lambros Lambrou.
+
+       [10] http://www.nikoli.co.jp/en/puzzles/slitherlink.html (beware of
+       Flash)
+
+  23.1 Loopy controls
+
+       Click the left mouse button on a yellow line to turn it black,
+       indicating that you think it is part of the loop. Click again to
+       turn the line yellow again (meaning you aren't sure yet).
+
+       If you are sure that a particular line segment is _not_ part of the
+       loop, you can click the right mouse button to remove it completely.
+       Again, clicking a second time will turn the line back to yellow.
+
+       (All the actions described in section 2.1 are also available.)
+
+  23.2 Loopy parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid, measured in number of regions across and down. For
+           square grids, it's clear how this is counted; for other types of
+           grid you may have to think a bit to see how the dimensions are
+           measured.
+
+       _Grid type_
+
+           Allows you to choose between a selection of types of tiling.
+           Some have all the faces the same but may have multiple different
+           types of vertex (e.g. the _Cairo_ or _Kites_ mode); others
+           have all the vertices the same but may have different types of
+           face (e.g. the _Great Hexagonal_). The square, triangular and
+           honeycomb grids are fully regular, and have all their vertices
+           _and_ faces the same; this makes them the least confusing to
+           play.
+
+       _Difficulty_
+
+           Controls the difficulty of the generated puzzle.
+
+Chapter 24: Inertia
+-------------------
+
+       You are a small green ball sitting in a grid full of obstacles. Your
+       aim is to collect all the gems without running into any mines.
+
+       You can move the ball in any orthogonal _or diagonal_ direction.
+       Once the ball starts moving, it will continue until something stops
+       it. A wall directly in its path will stop it (but if it is moving
+       diagonally, it will move through a diagonal gap between two other
+       walls without stopping). Also, some of the squares are `stops'; when
+       the ball moves on to a stop, it will stop moving no matter what
+       direction it was going in. Gems do _not_ stop the ball; it picks
+       them up and keeps on going.
+
+       Running into a mine is fatal. Even if you picked up the last gem in
+       the same move which then hit a mine, the game will count you as dead
+       rather than victorious.
+
+       This game was originally implemented for Windows by Ben Olmstead
+       [11], who was kind enough to release his source code on request so
+       that it could be re-implemented for this collection.
+
+       [11] http://xn13.com/
+
+  24.1 Inertia controls
+
+       You can move the ball in any of the eight directions using the
+       numeric keypad. Alternatively, if you click the left mouse button
+       on the grid, the ball will begin a move in the general direction of
+       where you clicked.
+
+       If you use the `Solve' function on this game, the program will
+       compute a path through the grid which collects all the remaining
+       gems and returns to the current position. A hint arrow will appear
+       on the ball indicating the direction in which you should move to
+       begin on this path. If you then move in that direction, the arrow
+       will update to indicate the next direction on the path. You can
+       also press Space to automatically move in the direction of the hint
+       arrow. If you move in a different direction from the one shown
+       by the arrow, arrows will be shown only if the puzzle is still
+       solvable.
+
+       All the actions described in section 2.1 are also available. In
+       particular, if you do run into a mine and die, you can use the Undo
+       function and resume playing from before the fatal move. The game
+       will keep track of the number of times you have done this.
+
+  24.2 Inertia parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+Chapter 25: Tents
+-----------------
+
+       You have a grid of squares, some of which contain trees. Your aim is
+       to place tents in some of the remaining squares, in such a way that
+       the following conditions are met:
+
+        -  There are exactly as many tents as trees.
+
+        -  The tents and trees can be matched up in such a way that each
+           tent is directly adjacent (horizontally or vertically, but not
+           diagonally) to its own tree. However, a tent may be adjacent to
+           other trees as well as its own.
+
+        -  No two tents are adjacent horizontally, vertically _or
+           diagonally_.
+
+        -  The number of tents in each row, and in each column, matches the
+           numbers given round the sides of the grid.
+
+       This puzzle can be found in several places on the Internet, and was
+       brought to my attention by e-mail. I don't know who I should credit
+       for inventing it.
+
+  25.1 Tents controls
+
+       Left-clicking in a blank square will place a tent in it. Right-
+       clicking in a blank square will colour it green, indicating that you
+       are sure it _isn't_ a tent. Clicking either button in an occupied
+       square will clear it.
+
+       If you _drag_ with the right button along a row or column, every
+       blank square in the region you cover will be turned green, and no
+       other squares will be affected. (This is useful for clearing the
+       remainder of a row once you have placed all its tents.)
+
+       You can also use the cursor keys to move around the grid. Pressing
+       the return key over an empty square will place a tent, and pressing
+       the space bar over an empty square will colour it green; either key
+       will clear an occupied square. Holding Shift and pressing the cursor
+       keys will colour empty squares green. Holding Control and pressing
+       the cursor keys will colour green both empty squares and squares
+       with tents.
+
+       (All the actions described in section 2.1 are also available.)
+
+  25.2 Tents parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+       _Difficulty_
+
+           Controls the difficulty of the generated puzzle. More difficult
+           puzzles require more complex deductions, but at present none
+           of the available difficulty levels requires guesswork or
+           backtracking.
+
+Chapter 26: Bridges
+-------------------
+
+       You have a set of islands distributed across the playing area.
+       Each island contains a number. Your aim is to connect the islands
+       together with bridges, in such a way that:
+
+        -  Bridges run horizontally or vertically.
+
+        -  The number of bridges terminating at any island is equal to the
+           number written in that island.
+
+        -  Two bridges may run in parallel between the same two islands,
+           but no more than two may do so.
+
+        -  No bridge crosses another bridge.
+
+        -  All the islands are connected together.
+
+       There are some configurable alternative modes, which involve
+       changing the parallel-bridge limit to something other than 2, and
+       introducing the additional constraint that no sequence of bridges
+       may form a loop from one island back to the same island. The rules
+       stated above are the default ones.
+
+       Credit for this puzzle goes to Nikoli [12].
+
+       Bridges was contributed to this collection by James Harvey.
+
+       [12] http://www.nikoli.co.jp/en/puzzles/hashiwokakero.html (beware
+       of Flash)
+
+  26.1 Bridges controls
+
+       To place a bridge between two islands, click the mouse down on one
+       island and drag it towards the other. You do not need to drag all
+       the way to the other island; you only need to move the mouse far
+       enough for the intended bridge direction to be unambiguous. (So you
+       can keep the mouse near the starting island and conveniently throw
+       bridges out from it in many directions.)
+
+       Doing this again when a bridge is already present will add another
+       parallel bridge. If there are already as many bridges between the
+       two islands as permitted by the current game rules (i.e. two by
+       default), the same dragging action will remove all of them.
+
+       If you want to remind yourself that two islands definitely _do not_
+       have a bridge between them, you can right-drag between them in the
+       same way to draw a `non-bridge' marker.
+
+       If you think you have finished with an island (i.e. you have placed
+       all its bridges and are confident that they are in the right
+       places), you can mark the island as finished by left-clicking on it.
+       This will highlight it and all the bridges connected to it, and you
+       will be prevented from accidentally modifying any of those bridges
+       in future. Left-clicking again on a highlighted island will unmark
+       it and restore your ability to modify it.
+
+       You can also use the cursor keys to move around the grid: if
+       possible the cursor will always move orthogonally, otherwise it
+       will move towards the nearest island to the indicated direction.
+       Holding Control and pressing a cursor key will lay a bridge in that
+       direction (if available); Shift and a cursor key will lay a `non-
+       bridge' marker. Pressing the return key followed by a cursor key
+       will also lay a bridge in that direction.
+
+       You can mark an island as finished by pressing the space bar or by
+       pressing the return key twice.
+
+       By pressing a number key, you can jump to the nearest island with
+       that number. Letters `a', ..., `f' count as 10, ..., 15 and `0' as
+       16.
+
+       Violations of the puzzle rules will be marked in red:
+
+        -  An island with too many bridges will be highlighted in red.
+
+        -  An island with too few bridges will be highlighted in red if it
+           is definitely an error (as opposed to merely not being finished
+           yet): if adding enough bridges would involve having to cross
+           another bridge or remove a non-bridge marker, or if the island
+           has been highlighted as complete.
+
+        -  A group of islands and bridges may be highlighted in red if it
+           is a closed subset of the puzzle with no way to connect it to
+           the rest of the islands. For example, if you directly connect
+           two 1s together with a bridge and they are not the only two
+           islands on the grid, they will light up red to indicate that
+           such a group cannot be contained in any valid solution.
+
+        -  If you have selected the (non-default) option to disallow loops
+           in the solution, a group of bridges which forms a loop will be
+           highlighted.
+
+       (All the actions described in section 2.1 are also available.)
+
+  26.2 Bridges parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+       _Difficulty_
+
+           Difficulty level of puzzle.
+
+       _Allow loops_
+
+           This is set by default. If cleared, puzzles will be generated in
+           such a way that they are always soluble without creating a loop,
+           and solutions which do involve a loop will be disallowed.
+
+       _Max. bridges per direction_
+
+           Maximum number of bridges in any particular direction. The
+           default is 2, but you can change it to 1, 3 or 4. In general,
+           fewer is easier.
+
+       _%age of island squares_
+
+           Gives a rough percentage of islands the generator will try and
+           lay before finishing the puzzle. Certain layouts will not manage
+           to lay enough islands; this is an upper bound.
+
+       _Expansion factor (%age)_
+
+           The grid generator works by picking an existing island at random
+           (after first creating an initial island somewhere). It then
+           decides on a direction (at random), and then works out how far
+           it could extend before creating another island. This parameter
+           determines how likely it is to extend as far as it can, rather
+           than choosing somewhere closer.
+
+           High expansion factors usually mean easier puzzles with fewer
+           possible islands; low expansion factors can create lots of
+           tightly-packed islands.
+
+Chapter 27: Unequal
+-------------------
+
+       You have a square grid; each square may contain a digit from 1 to
+       the size of the grid, and some squares have clue signs between them.
+       Your aim is to fully populate the grid with numbers such that:
+
+        -  Each row contains only one occurrence of each digit
+
+        -  Each column contains only one occurrence of each digit
+
+        -  All the clue signs are satisfied.
+
+       There are two modes for this game, `Unequal' and `Adjacent'.
+
+       In `Unequal' mode, the clue signs are greater-than symbols
+       indicating one square's value is greater than its neighbour's. In
+       this mode not all clues may be visible, particularly at higher
+       difficulty levels.
+
+       In `Adjacent' mode, the clue signs are bars indicating one square's
+       value is numerically adjacent (i.e. one higher or one lower) than
+       its neighbour. In this mode all clues are always visible: absence of
+       a bar thus means that a square's value is definitely not numerically
+       adjacent to that neighbour's.
+
+       In `Trivial' difficulty level (available via the `Custom' game type
+       selector), there are no greater-than signs in `Unequal' mode; the
+       puzzle is to solve the Latin square only.
+
+       At the time of writing, the `Unequal' mode of this puzzle is
+       appearing in the Guardian weekly under the name `Futoshiki'.
+
+       Unequal was contributed to this collection by James Harvey.
+
+  27.1 Unequal controls
+
+       Unequal shares much of its control system with Solo.
+
+       To play Unequal, simply click the mouse in any empty square and then
+       type a digit or letter on the keyboard to fill that square. If you
+       make a mistake, click the mouse in the incorrect square and press
+       Space to clear it again (or use the Undo feature).
+
+       If you _right_-click in a square and then type a number, that
+       number will be entered in the square as a `pencil mark'. You can
+       have pencil marks for multiple numbers in the same square. Squares
+       containing filled-in numbers cannot also contain pencil marks.
+
+       The game pays no attention to pencil marks, so exactly what you
+       use them for is up to you: you can use them as reminders that a
+       particular square needs to be re-examined once you know more about
+       a particular number, or you can use them as lists of the possible
+       numbers in a given square, or anything else you feel like.
+
+       To erase a single pencil mark, right-click in the square and type
+       the same number again.
+
+       All pencil marks in a square are erased when you left-click and type
+       a number, or when you left-click and press space. Right-clicking and
+       pressing space will also erase pencil marks.
+
+       As for Solo, the cursor keys can be used in conjunction with the
+       digit keys to set numbers or pencil marks. You can also use the `M'
+       key to auto-fill every numeric hint, ready for removal as required,
+       or the `H' key to do the same but also to remove all obvious hints.
+
+       Alternatively, use the cursor keys to move the mark around the grid.
+       Pressing the return key toggles the mark (from a normal mark to a
+       pencil mark), and typing a number in is entered in the square in the
+       appropriate way; typing in a 0 or using the space bar will clear a
+       filled square.
+
+       Left-clicking a clue will mark it as done (grey it out), or unmark
+       it if it is already marked. Holding Control or Shift and pressing
+       an arrow key likewise marks any clue adjacent to the cursor in the
+       given direction.
+
+       (All the actions described in section 2.1 are also available.)
+
+  27.2 Unequal parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Mode_
+
+           Mode of the puzzle (`Unequal' or `Adjacent')
+
+       _Size (s*s)_
+
+           Size of grid.
+
+       _Difficulty_
+
+           Controls the difficulty of the generated puzzle. At Trivial
+           level, there are no greater-than signs; the puzzle is to solve
+           the Latin square only. At Recursive level (only available via
+           the `Custom' game type selector) backtracking will be required,
+           but the solution should still be unique. The levels in between
+           require increasingly complex reasoning to avoid having to
+           backtrack.
+
+Chapter 28: Galaxies
+--------------------
+
+       You have a rectangular grid containing a number of dots. Your aim is
+       to draw edges along the grid lines which divide the rectangle into
+       regions in such a way that every region is 180-degree rotationally
+       symmetric, and contains exactly one dot which is located at its
+       centre of symmetry.
+
+       This puzzle was invented by Nikoli [13], under the name `Tentai
+       Show'; its name is commonly translated into English as `Spiral
+       Galaxies'.
+
+       Galaxies was contributed to this collection by James Harvey.
+
+       [13] http://www.nikoli.co.jp/en/puzzles/astronomical_show.html
+
+  28.1 Galaxies controls
+
+       Left-click on any grid line to draw an edge if there isn't one
+       already, or to remove one if there is. When you create a valid
+       region (one which is closed, contains exactly one dot, is 180-degree
+       symmetric about that dot, and contains no extraneous edges inside
+       it) it will be highlighted automatically; so your aim is to have the
+       whole grid highlighted in that way.
+
+       During solving, you might know that a particular grid square belongs
+       to a specific dot, but not be sure of where the edges go and which
+       other squares are connected to the dot. In order to mark this so you
+       don't forget, you can right-click on the dot and drag, which will
+       create an arrow marker pointing at the dot. Drop that in a square of
+       your choice and it will remind you which dot it's associated with.
+       You can also right-click on existing arrows to pick them up and move
+       them, or destroy them by dropping them off the edge of the grid.
+       (Also, if you're not sure which dot an arrow is pointing at, you can
+       pick it up and move it around to make it clearer. It will swivel
+       constantly as you drag it, to stay pointed at its parent dot.)
+
+       You can also use the cursor keys to move around the grid squares and
+       lines. Pressing the return key when over a grid line will draw or
+       clear its edge, as above. Pressing the return key when over a dot
+       will pick up an arrow, to be dropped the next time the return key
+       is pressed; this can also be used to move existing arrows around,
+       removing them by dropping them on a dot or another arrow.
+
+       (All the actions described in section 2.1 are also available.)
+
+  28.2 Galaxies parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+       _Difficulty_
+
+           Controls the difficulty of the generated puzzle. More difficult
+           puzzles require more complex deductions, and the `Unreasonable'
+           difficulty level may require backtracking.
+
+Chapter 29: Filling
+-------------------
+
+       You have a grid of squares, some of which contain digits, and the
+       rest of which are empty. Your job is to fill in digits in the empty
+       squares, in such a way that each connected region of squares all
+       containing the same digit has an area equal to that digit.
+
+       (`Connected region', for the purposes of this game, does not count
+       diagonally separated squares as adjacent.)
+
+       For example, it follows that no square can contain a zero, and that
+       two adjacent squares can not both contain a one. No region has an
+       area greater than 9 (because then its area would not be a single
+       digit).
+
+       Credit for this puzzle goes to Nikoli [14].
+
+       Filling was contributed to this collection by Jonas Koelker.
+
+       [14] http://www.nikoli.co.jp/en/puzzles/fillomino.html
+
+  29.1 Filling controls
+
+       To play Filling, simply click the mouse in any empty square and
+       then type a digit on the keyboard to fill that square. By dragging
+       the mouse, you can select multiple squares to fill with a single
+       keypress. If you make a mistake, click the mouse in the incorrect
+       square and press 0, Space, Backspace or Enter to clear it again (or
+       use the Undo feature).
+
+       You can also move around the grid with the cursor keys; typing a
+       digit will fill the square containing the cursor with that number;
+       typing 0 will clear it. You can also select multiple squares for
+       numbering or clearing with the return and arrow keys, before typing
+       a digit to fill or clear the highlighted squares (as above). The
+       space bar adds and removes single squares to and from the selection.
+       Backspace and escape remove all squares from the selection.
+
+       (All the actions described in section 2.1 are also available.)
+
+  29.2 Filling parameters
+
+       Filling allows you to configure the number of rows and columns of
+       the grid, through the `Type' menu.
+
+Chapter 30: Keen
+----------------
+
+       You have a square grid; each square may contain a digit from 1 to
+       the size of the grid. The grid is divided into blocks of varying
+       shape and size, with arithmetic clues written in them. Your aim is
+       to fully populate the grid with digits such that:
+
+        -  Each row contains only one occurrence of each digit
+
+        -  Each column contains only one occurrence of each digit
+
+        -  The digits in each block can be combined to form the number
+           stated in the clue, using the arithmetic operation given in the
+           clue. That is:
+
+            -  An addition clue means that the sum of the digits in the
+               block must be the given number. For example, `15+' means the
+               contents of the block adds up to fifteen.
+
+            -  A multiplication clue (e.g. `60*'), similarly, means that
+               the product of the digits in the block must be the given
+               number.
+
+            -  A subtraction clue will always be written in a block of
+               size two, and it means that one of the digits in the block
+               is greater than the other by the given amount. For example,
+               `2-' means that one of the digits in the block is 2 more
+               than the other, or equivalently that one digit minus the
+               other one is 2. The two digits could be either way round,
+               though.
+
+            -  A division clue (e.g. `3/'), similarly, is always in a block
+               of size two and means that one digit divided by the other is
+               equal to the given amount.
+
+           Note that a block may contain the same digit more than once
+           (provided the identical ones are not in the same row and
+           column). This rule is precisely the opposite of the rule in
+           Solo's `Killer' mode (see chapter 11).
+
+       This puzzle appears in the Times under the name `KenKen'.
+
+  30.1 Keen controls
+
+       Keen shares much of its control system with Solo (and Unequal).
+
+       To play Keen, simply click the mouse in any empty square and then
+       type a digit on the keyboard to fill that square. If you make a
+       mistake, click the mouse in the incorrect square and press Space to
+       clear it again (or use the Undo feature).
+
+       If you _right_-click in a square and then type a number, that
+       number will be entered in the square as a `pencil mark'. You can
+       have pencil marks for multiple numbers in the same square. Squares
+       containing filled-in numbers cannot also contain pencil marks.
+
+       The game pays no attention to pencil marks, so exactly what you
+       use them for is up to you: you can use them as reminders that a
+       particular square needs to be re-examined once you know more about
+       a particular number, or you can use them as lists of the possible
+       numbers in a given square, or anything else you feel like.
+
+       To erase a single pencil mark, right-click in the square and type
+       the same number again.
+
+       All pencil marks in a square are erased when you left-click and type
+       a number, or when you left-click and press space. Right-clicking and
+       pressing space will also erase pencil marks.
+
+       As for Solo, the cursor keys can be used in conjunction with the
+       digit keys to set numbers or pencil marks. Use the cursor keys to
+       move a highlight around the grid, and type a digit to enter it in
+       the highlighted square. Pressing return toggles the highlight into a
+       mode in which you can enter or remove pencil marks.
+
+       Pressing M will fill in a full set of pencil marks in every square
+       that does not have a main digit in it.
+
+       (All the actions described in section 2.1 are also available.)
+
+  30.2 Keen parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Grid size_
+
+           Specifies the size of the grid. Lower limit is 3; upper limit is
+           9 (because the user interface would become more difficult with
+           `digits' bigger than 9!).
+
+       _Difficulty_
+
+           Controls the difficulty of the generated puzzle. At Unreasonable
+           level, some backtracking will be required, but the solution
+           should still be unique. The remaining levels require
+           increasingly complex reasoning to avoid having to backtrack.
+
+       _Multiplication only_
+
+           If this is enabled, all boxes will be multiplication boxes. With
+           this rule, the puzzle is known as `Inshi No Heya'.
+
+Chapter 31: Towers
+------------------
+
+       You have a square grid. On each square of the grid you can build
+       a tower, with its height ranging from 1 to the size of the grid.
+       Around the edge of the grid are some numeric clues.
+
+       Your task is to build a tower on every square, in such a way that:
+
+        -  Each row contains every possible height of tower once
+
+        -  Each column contains every possible height of tower once
+
+        -  Each numeric clue describes the number of towers that can be
+           seen if you look into the square from that direction, assuming
+           that shorter towers are hidden behind taller ones. For example,
+           in a 5x5 grid, a clue marked `5' indicates that the five tower
+           heights must appear in increasing order (otherwise you would
+           not be able to see all five towers), whereas a clue marked `1'
+           indicates that the tallest tower (the one marked 5) must come
+           first.
+
+       In harder or larger puzzles, some towers will be specified for you
+       as well as the clues round the edge, and some edge clues may be
+       missing.
+
+       This puzzle appears on the web under various names, particularly
+       `Skyscrapers', but I don't know who first invented it.
+
+  31.1 Towers controls
+
+       Towers shares much of its control system with Solo, Unequal and
+       Keen.
+
+       To play Towers, simply click the mouse in any empty square and then
+       type a digit on the keyboard to fill that square with a tower of
+       the given height. If you make a mistake, click the mouse in the
+       incorrect square and press Space to clear it again (or use the Undo
+       feature).
+
+       If you _right_-click in a square and then type a number, that
+       number will be entered in the square as a `pencil mark'. You can
+       have pencil marks for multiple numbers in the same square. A square
+       containing a tower cannot also contain pencil marks.
+
+       The game pays no attention to pencil marks, so exactly what you
+       use them for is up to you: you can use them as reminders that a
+       particular square needs to be re-examined once you know more about
+       a particular number, or you can use them as lists of the possible
+       numbers in a given square, or anything else you feel like.
+
+       To erase a single pencil mark, right-click in the square and type
+       the same number again.
+
+       All pencil marks in a square are erased when you left-click and type
+       a number, or when you left-click and press space. Right-clicking and
+       pressing space will also erase pencil marks.
+
+       As for Solo, the cursor keys can be used in conjunction with the
+       digit keys to set numbers or pencil marks. Use the cursor keys to
+       move a highlight around the grid, and type a digit to enter it in
+       the highlighted square. Pressing return toggles the highlight into a
+       mode in which you can enter or remove pencil marks.
+
+       Pressing M will fill in a full set of pencil marks in every square
+       that does not have a main digit in it.
+
+       Left-clicking a clue will mark it as done (grey it out), or unmark
+       it if it is already marked. Holding Control or Shift and pressing an
+       arrow key likewise marks any clue in the given direction.
+
+       (All the actions described in section 2.1 are also available.)
+
+  31.2 Towers parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Grid size_
+
+           Specifies the size of the grid. Lower limit is 3; upper limit is
+           9 (because the user interface would become more difficult with
+           `digits' bigger than 9!).
+
+       _Difficulty_
+
+           Controls the difficulty of the generated puzzle. At Unreasonable
+           level, some backtracking will be required, but the solution
+           should still be unique. The remaining levels require
+           increasingly complex reasoning to avoid having to backtrack.
+
+Chapter 32: Singles
+-------------------
+
+       You have a grid of white squares, all of which contain numbers. Your
+       task is to colour some of the squares black (removing the number) so
+       as to satisfy all of the following conditions:
+
+        -  No number occurs more than once in any row or column.
+
+        -  No black square is horizontally or vertically adjacent to any
+           other black square.
+
+        -  The remaining white squares must all form one contiguous region
+           (connected by edges, not just touching at corners).
+
+       Credit for this puzzle goes to Nikoli [15] who call it Hitori.
+
+       Singles was contributed to this collection by James Harvey.
+
+       [15] http://www.nikoli.com/en/puzzles/hitori.html (beware of Flash)
+
+  32.1 Singles controls
+
+       Left-clicking on an empty square will colour it black; left-clicking
+       again will restore the number. Right-clicking will add a circle
+       (useful for indicating that a cell is definitely not black).
+
+       You can also use the cursor keys to move around the grid. Pressing
+       the return or space keys will turn a square black or add a circle
+       respectively, and pressing the key again will restore the number or
+       remove the circle.
+
+       (All the actions described in section 2.1 are also available.)
+
+  32.2 Singles parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+       _Difficulty_
+
+           Controls the difficulty of the generated puzzle.
+
+Chapter 33: Magnets
+-------------------
+
+       A rectangular grid has been filled with a mixture of magnets (that
+       is, dominoes with one positive end and one negative end) and blank
+       dominoes (that is, dominoes with two neutral poles). These dominoes
+       are initially only seen in silhouette. Around the grid are placed a
+       number of clues indicating the number of positive and negative poles
+       contained in certain columns and rows.
+
+       Your aim is to correctly place the magnets and blank dominoes such
+       that all the clues are satisfied, with the additional constraint
+       that no two similar magnetic poles may be orthogonally adjacent
+       (since they repel). Neutral poles do not repel, and can be adjacent
+       to any other pole.
+
+       Credit for this puzzle goes to Janko [16].
+
+       Magnets was contributed to this collection by James Harvey.
+
+       [16] http://www.janko.at/Raetsel/Magnete/index.htm
+
+  33.1 Magnets controls
+
+       Left-clicking on an empty square places a magnet at that position
+       with the positive pole on the square and the negative pole on the
+       other half of the magnet; left-clicking again reverses the polarity,
+       and a third click removes the magnet.
+
+       Right-clicking on an empty square places a blank domino there.
+       Right-clicking again places two question marks on the domino,
+       signifying `this cannot be blank' (which can be useful to note
+       deductions while solving), and right-clicking again empties the
+       domino.
+
+       Left-clicking a clue will mark it as done (grey it out), or unmark
+       it if it is already marked.
+
+       You can also use the cursor keys to move a cursor around the grid.
+       Pressing the return key will lay a domino with a positive pole at
+       that position; pressing again reverses the polarity and then removes
+       the domino, as with left-clicking. Using the space bar allows
+       placement of blank dominoes and cannot-be-blank hints, as for right-
+       clicking.
+
+       (All the actions described in section 2.1 are also available.)
+
+  33.2 Magnets parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares. There will be half _Width_ x _Height_
+           dominoes in the grid: if this number is odd then one square will
+           be blank.
+
+           (Grids with at least one odd dimension tend to be easier to
+           solve.)
+
+       _Difficulty_
+
+           Controls the difficulty of the generated puzzle. At Tricky
+           level, you are required to make more deductions about empty
+           dominoes and row/column counts.
+
+       _Strip clues_
+
+           If true, some of the clues around the grid are removed at
+           generation time, making the puzzle more difficult.
+
+Chapter 34: Signpost
+--------------------
+
+       You have a grid of squares; each square (except the last one)
+       contains an arrow, and some squares also contain numbers. Your job
+       is to connect the squares to form a continuous list of numbers
+       starting at 1 and linked in the direction of the arrows - so the
+       arrow inside the square with the number 1 will point to the square
+       containing the number 2, which will point to the square containing
+       the number 3, etc. Each square can be any distance away from the
+       previous one, as long as it is somewhere in the direction of the
+       arrow.
+
+       By convention the first and last numbers are shown; one or more
+       interim numbers may also appear at the beginning.
+
+       Credit for this puzzle goes to Janko [17], who call it `Pfeilpfad'
+       (`arrow path').
+
+       Signpost was contributed to this collection by James Harvey.
+
+       [17] http://janko.at/Raetsel/Pfeilpfad/index.htm
+
+  34.1 Signpost controls
+
+       To play Signpost, you connect squares together by dragging from
+       one square to another, indicating that they are adjacent in the
+       sequence. Drag with the left button from a square to its successor,
+       or with the right button from a square to its predecessor.
+
+       If you connect together two squares in this way and one of them has
+       a number in it, the appropriate number will appear in the other
+       square. If you connect two non-numbered squares, they will be
+       assigned temporary algebraic labels: on the first occasion, they
+       will be labelled `a' and `a+1', and then `b' and `b+1', and so on.
+       Connecting more squares on to the ends of such a chain will cause
+       them all to be labelled with the same letter.
+
+       When you left-click or right-click in a square, the legal squares to
+       connect it to will be shown.
+
+       The arrow in each square starts off black, and goes grey once you
+       connect the square to its successor. Also, each square which needs
+       a predecessor has a small dot in the bottom left corner, which
+       vanishes once you link a square to it. So your aim is always to
+       connect a square with a black arrow to a square with a dot.
+
+       To remove any links for a particular square (both incoming and
+       outgoing), left-drag it off the grid. To remove a whole chain,
+       right-drag any square in the chain off the grid.
+
+       You can also use the cursor keys to move around the grid squares
+       and lines. Pressing the return key when over a square starts a link
+       operation, and pressing the return key again over a square will
+       finish the link, if allowable. Pressing the space bar over a square
+       will show the other squares pointing to it, and allow you to form a
+       backward link, and pressing the space bar again cancels this.
+
+       (All the actions described in section 2.1 are also available.)
+
+  34.2 Signpost parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+       _Force start/end to corners_
+
+           If true, the start and end squares are always placed in opposite
+           corners (the start at the top left, and the end at the bottom
+           right). If false the start and end squares are placed randomly
+           (although always both shown).
+
+Chapter 35: Range
+-----------------
+
+       You have a grid of squares; some squares contain numbers. Your job
+       is to colour some of the squares black, such that several criteria
+       are satisfied:
+
+        -  no square with a number is coloured black.
+
+        -  no two black squares are adjacent (horizontally or vertically).
+
+        -  for any two white squares, there is a path between them using
+           only white squares.
+
+        -  for each square with a number, that number denotes the total
+           number of white squares reachable from that square going in a
+           straight line in any horizontal or vertical direction until
+           hitting a wall or a black square; the square with the number is
+           included in the total (once).
+
+       For instance, a square containing the number one must have four
+       black squares as its neighbours by the last criterion; but then it's
+       impossible for it to be connected to any outside white square, which
+       violates the second to last criterion. So no square will contain the
+       number one.
+
+       Credit for this puzzle goes to Nikoli, who have variously called it
+       `Kurodoko', `Kuromasu' or `Where is Black Cells'. [18].
+
+       Range was contributed to this collection by Jonas Koelker.
+
+       [18] http://www.nikoli.co.jp/en/puzzles/where_is_black_cells.html
+
+  35.1 Range controls
+
+       Click with the left button to paint a square black, or with the
+       right button to mark a square with a dot to indicate that you are
+       sure it should _not_ be painted black. Repeated clicking with either
+       button will cycle the square through the three possible states
+       (filled, dotted or empty) in opposite directions.
+
+       You can also use the cursor keys to move around the grid squares.
+       Pressing Return does the same as clicking with the left button,
+       while pressing Space does the same as a right button click. Moving
+       with the cursor keys while holding Shift will place dots in all
+       squares that are moved through.
+
+       (All the actions described in section 2.1 are also available.)
+
+  35.2 Range parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+Chapter 36: Pearl
+-----------------
+
+       You have a grid of squares. Your job is to draw lines between the
+       centres of horizontally or vertically adjacent squares, so that the
+       lines form a single closed loop. In the resulting grid, some of the
+       squares that the loop passes through will contain corners, and some
+       will be straight horizontal or vertical lines. (And some squares can
+       be completely empty - the loop doesn't have to pass through every
+       square.)
+
+       Some of the squares contain black and white circles, which are clues
+       that the loop must satisfy.
+
+       A black circle in a square indicates that that square is a corner,
+       but neither of the squares adjacent to it in the loop is also a
+       corner.
+
+       A white circle indicates that the square is a straight edge, but _at
+       least one_ of the squares adjacent to it in the loop is a corner.
+
+       (In both cases, the clue only constrains the two squares adjacent
+       _in the loop_, that is, the squares that the loop passes into after
+       leaving the clue square. The squares that are only adjacent _in the
+       grid_ are not constrained.)
+
+       Credit for this puzzle goes to Nikoli, who call it `Masyu'. [19]
+
+       Thanks to James Harvey for assistance with the implementation.
+
+       [19] http://www.nikoli.co.jp/en/puzzles/masyu.html (beware of Flash)
+
+  36.1 Pearl controls
+
+       Click with the left button on a grid edge to draw a segment of the
+       loop through that edge, or to remove a segment once it is drawn.
+
+       Drag with the left button through a series of squares to draw more
+       than one segment of the loop in one go. Alternatively, drag over an
+       existing part of the loop to undraw it, or to undraw part of it and
+       then go in a different direction.
+
+       Click with the right button on a grid edge to mark it with a cross,
+       indicating that you are sure the loop does not go through that edge.
+       (For instance, if you have decided which of the squares adjacent
+       to a white clue has to be a corner, but don't yet know which way
+       the corner turns, you might mark the one way it _can't_ go with a
+       cross.)
+
+       Alternatively, use the cursor keys to move the cursor. Use the Enter
+       key to begin and end keyboard `drag' operations. Use the Space,
+       Escape or Backspace keys to cancel the drag. Or, hold Control while
+       dragging with the cursor keys to toggle segments as you move between
+       squares.
+
+       Pressing Control-Shift-arrowkey or Shift-arrowkey simulates a left
+       or right click, respectively, on the edge in the direction of the
+       key.
+
+       (All the actions described in section 2.1 are also available.)
+
+  36.2 Pearl parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+Chapter 37: Undead
+------------------
+
+       You are given a grid of squares, some of which contain diagonal
+       mirrors. Every square which is not a mirror must be filled with one
+       of three types of undead monster: a ghost, a vampire, or a zombie.
+
+       Vampires can be seen directly, but are invisible when reflected in
+       mirrors. Ghosts are the opposite way round: they can be seen in
+       mirrors, but are invisible when looked at directly. Zombies are
+       visible by any means.
+
+       You are also told the total number of each type of monster in the
+       grid. Also around the edge of the grid are written numbers, which
+       indicate how many monsters can be seen if you look into the grid
+       along a row or column starting from that position. (The diagonal
+       mirrors are reflective on both sides. If your reflected line of
+       sight crosses the same monster more than once, the number will count
+       it each time it is visible, not just once.)
+
+       This puzzle type was invented by David Millar, under the name
+       `Haunted Mirror Maze'. See [20] for more details.
+
+       Undead was contributed to this collection by Steffen Bauer.
+
+       [20] http://www.janko.at/Raetsel/Spukschloss/index.htm
+
+  37.1 Undead controls
+
+       Undead has a similar control system to Solo, Unequal and Keen.
+
+       To play Undead, click the mouse in any empty square and then type
+       a letter on the keyboard indicating the type of monster: `G' for
+       a ghost, `V' for a vampire, or `Z' for a zombie. If you make a
+       mistake, click the mouse in the incorrect square and press Space to
+       clear it again (or use the Undo feature).
+
+       If you _right_-click in a square and then type a letter, the
+       corresponding monster will be shown in reduced size in that square,
+       as a `pencil mark'. You can have pencil marks for multiple monsters
+       in the same square. A square containing a full-size monster cannot
+       also contain pencil marks.
+
+       The game pays no attention to pencil marks, so exactly what you
+       use them for is up to you: you can use them as reminders that a
+       particular square needs to be re-examined once you know more about
+       a particular monster, or you can use them as lists of the possible
+       monster in a given square, or anything else you feel like.
+
+       To erase a single pencil mark, right-click in the square and type
+       the same letter again.
+
+       All pencil marks in a square are erased when you left-click and type
+       a monster letter, or when you left-click and press Space. Right-
+       clicking and pressing space will also erase pencil marks.
+
+       As for Solo, the cursor keys can be used in conjunction with the
+       letter keys to place monsters or pencil marks. Use the cursor keys
+       to move a highlight around the grid, and type a monster letter to
+       enter it in the highlighted square. Pressing return toggles the
+       highlight into a mode in which you can enter or remove pencil marks.
+
+       If you prefer plain letters of the alphabet to cute monster
+       pictures, you can press `A' to toggle between showing the monsters
+       as monsters or showing them as letters.
+
+       Left-clicking a clue will mark it as done (grey it out), or unmark
+       it if it is already marked.
+
+       (All the actions described in section 2.1 are also available.)
+
+  37.2 Undead parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+       _Difficulty_
+
+           Controls the difficulty of the generated puzzle.
+
+Chapter 38: Unruly
+------------------
+
+       You are given a grid of squares, which you must colour either black
+       or white. Some squares are provided as clues; the rest are left for
+       you to fill in. Each row and column must contain the same number
+       of black and white squares, and no row or column may contain three
+       consecutive squares of the same colour.
+
+       This puzzle type was invented by Adolfo Zanellati, under the name
+       `Tohu wa Vohu'. See [21] for more details.
+
+       Unruly was contributed to this collection by Lennard Sprong.
+
+       [21] http://www.janko.at/Raetsel/Tohu-Wa-Vohu/index.htm
+
+  38.1 Unruly controls
+
+       To play Unruly, click the mouse in a square to change its colour.
+       Left-clicking an empty square will turn it black, and right-clicking
+       will turn it white. Keep clicking the same button to cycle through
+       the three possible states for the square. If you middle-click in a
+       square it will be reset to empty.
+
+       You can also use the cursor keys to move around the grid. Pressing
+       the return or space keys will turn an empty square black or white
+       respectively (and then cycle the colours in the same way as the
+       mouse buttons), and pressing Backspace will reset a square to empty.
+
+       (All the actions described in section 2.1 are also available.)
+
+  38.2 Unruly parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares. (Note that the rules of the game
+           require both the width and height to be even numbers.)
+
+       _Difficulty_
+
+           Controls the difficulty of the generated puzzle.
+
+       _Unique rows and columns_
+
+           If enabled, no two rows are permitted to have exactly the same
+           pattern, and likewise columns. (A row and a column can match,
+           though.)
+
+Chapter 39: Flood
+-----------------
+
+       You are given a grid of squares, coloured at random in multiple
+       colours. In each move, you can flood-fill the top left square in a
+       colour of your choice (i.e. every square reachable from the starting
+       square by an orthogonally connected path of squares all the same
+       colour will be filled in the new colour). As you do this, more and
+       more of the grid becomes connected to the starting square.
+
+       Your aim is to make the whole grid the same colour, in as few moves
+       as possible. The game will set a limit on the number of moves, based
+       on running its own internal solver. You win if you can make the
+       whole grid the same colour in that many moves or fewer.
+
+       I saw this game (with a fixed grid size, fixed number of colours,
+       and fixed move limit) at http://floodit.appspot.com (no longer
+       accessible).
+
+  39.1 Flood controls
+
+       To play Flood, click the mouse in a square. The top left corner and
+       everything connected to it will be flood-filled with the colour of
+       the square you clicked. Clicking a square the same colour as the top
+       left corner has no effect, and therefore does not count as a move.
+
+       You can also use the cursor keys to move a cursor (outline black
+       square) around the grid. Pressing the return key will fill the top
+       left corner in the colour of the square under the cursor.
+
+       (All the actions described in section 2.1 are also available.)
+
+  39.2 Flood parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of the grid, in squares.
+
+       _Colours_
+
+           Number of colours used to fill the grid. Must be at least 3
+           (with two colours there would only be one legal move at any
+           stage, hence no choice to make at all), and at most 10.
+
+       _Extra moves permitted_
+
+           Controls the difficulty of the puzzle, by increasing the move
+           limit. In each new grid, Flood will run an internal solver to
+           generate its own solution, and then the value in this field
+           will be added to the length of Flood's solution to generate the
+           game's move limit. So a value of 0 requires you to be just as
+           efficient as Flood's automated solver, and a larger value makes
+           it easier.
+
+           (Note that Flood's internal solver will not necessarily find the
+           shortest possible solution, though I believe it's pretty close.
+           For a real challenge, set this value to 0 and then try to solve
+           a grid in _strictly fewer_ moves than the limit you're given!)
+
+Chapter 40: Tracks
+------------------
+
+       You are given a grid of squares, some of which are filled with train
+       tracks. You need to complete the track from A to B so that the
+       rows and columns contain the same number of track segments as are
+       indicated in the clues to the top and right of the grid.
+
+       There are only straight and 90 degree curved rails, and the track
+       may not cross itself.
+
+       Tracks was contributed to this collection by James Harvey.
+
+  40.1 Tracks controls
+
+       Left-clicking on an edge between two squares adds a track segment
+       between the two squares. Right-clicking on an edge adds a cross on
+       the edge, indicating no track is possible there.
+
+       Left-clicking in a square adds a colour indicator showing that
+       you know the square must contain a track, even if you don't know
+       which edges it crosses yet. Right-clicking in a square adds a cross
+       indicating it contains no track segment.
+
+       Left- or right-dragging between squares allows you to lay a straight
+       line of is-track or is-not-track indicators, useful for filling in
+       rows or columns to match the clue.
+
+       (All the actions described in section 2.1 are also available.)
+
+  40.2 Tracks parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of the grid, in squares.
+
+       _Difficulty_
+
+           Controls the difficulty of the generated puzzle: at Tricky
+           level, you are required to make more deductions regarding
+           disregarding moves that would lead to impossible crossings
+           later.
+
+       _Disallow consecutive 1 clues_
+
+           Controls whether the Tracks game generation permits two adjacent
+           rows or columns to have a 1 clue, or permits the row or column
+           of the track's endpoint to have a 1 clue. By default this is
+           not permitted, to avoid long straight boring segments of track
+           and make the games more twiddly and interesting. If you want to
+           restore the possibility, turn this option off.
+
+Chapter 41: Palisade
+--------------------
+
+       You're given a grid of squares, some of which contain numbers. Your
+       goal is to subdivide the grid into contiguous regions, all of the
+       same (given) size, such that each square containing a number is
+       adjacent to exactly that many edges (including those between the
+       inside and the outside of the grid).
+
+       Credit for this puzzle goes to Nikoli, who call it `Five Cells'.
+       [22].
+
+       Palisade was contributed to this collection by Jonas Koelker.
+
+       [22] http://nikoli.co.jp/en/puzzles/five_cells.html
+
+  41.1 Palisade controls
+
+       Left-click to place an edge. Right-click to indicate `no edge'.
+       Alternatively, the arrow keys will move a keyboard cursor. Holding
+       Control while pressing an arrow key will place an edge. Press Shift-
+       arrowkey to switch off an edge. Repeat an action to perform its
+       inverse.
+
+       (All the actions described in section 2.1 are also available.)
+
+  41.2 Palisade parameters
+
+       These parameters are available from the `Custom...' option on the
+       `Type' menu.
+
+       _Width_, _Height_
+
+           Size of grid in squares.
+
+       _Region size_
+
+           The size of the regions into which the grid must be subdivided.
+
+Appendix A: Licence
+-------------------
+
+       This software is copyright 2004-2014 Simon Tatham.
+
+       Portions copyright Richard Boulton, James Harvey, Mike Pinna, Jonas
+       Koelker, Dariusz Olszewski, Michael Schierl, Lambros Lambrou, Bernd
+       Schmidt, Steffen Bauer, Lennard Sprong and Rogier Goossens.
+
+       Permission is hereby granted, free of charge, to any person
+       obtaining a copy of this software and associated documentation files
+       (the `Software'), to deal in the Software without restriction,
+       including without limitation the rights to use, copy, modify, merge,
+       publish, distribute, sublicense, and/or sell copies of the Software,
+       and to permit persons to whom the Software is furnished to do so,
+       subject to the following conditions:
+
+       The above copyright notice and this permission notice shall be
+       included in all copies or substantial portions of the Software.
+
+       THE SOFTWARE IS PROVIDED `AS IS', WITHOUT WARRANTY OF ANY KIND,
+       EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+       OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+       NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+       BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+       ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+       CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+       SOFTWARE.
+
+[Simon Tatham's Portable Puzzle Collection, version 20161228.7cae89f]
diff --git a/slant.c b/slant.c
index 3fd66115b15f36aeeaedb30a9c8950c0f0575ea7..c9b6b40ac65b764620205a5529bce6f4b9c0e528 100644 (file)
--- a/slant.c
+++ b/slant.c
@@ -1789,11 +1789,7 @@ static float *game_colours(frontend *fe, int *ncolours)
     float *ret = snewn(3 * NCOLOURS, float);
 
     /* CURSOR colour is a background highlight. */
-    game_mkhighlight(fe, ret, COL_BACKGROUND, COL_CURSOR, -1);
-
-    ret[COL_FILLEDSQUARE * 3 + 0] = ret[COL_BACKGROUND * 3 + 0];
-    ret[COL_FILLEDSQUARE * 3 + 1] = ret[COL_BACKGROUND * 3 + 1];
-    ret[COL_FILLEDSQUARE * 3 + 2] = ret[COL_BACKGROUND * 3 + 2];
+    game_mkhighlight(fe, ret, COL_BACKGROUND, COL_CURSOR, COL_FILLEDSQUARE);
 
     ret[COL_GRID * 3 + 0] = ret[COL_BACKGROUND * 3 + 0] * 0.7F;
     ret[COL_GRID * 3 + 1] = ret[COL_BACKGROUND * 3 + 1] * 0.7F;
index 9ccc6ae1857707ddcba795a30d8b3024c73b97de..3862639c73c626224f8c9bc32beb35c2603e50df 100644 (file)
--- a/towers.c
+++ b/towers.c
@@ -385,12 +385,12 @@ static int solver_easy(struct latin_solver *solver, void *vctx)
            return ret;
 
 #ifdef STANDALONE_SOLVER
-           if (solver_show_working)
-               sprintf(prefix, "%*slower bounds for clue %s %d:\n",
-                       solver_recurse_depth*4, "",
-                       cluepos[c/w], c%w+1);
-           else
-               prefix[0] = '\0';              /* placate optimiser */
+       if (solver_show_working)
+           sprintf(prefix, "%*slower bounds for clue %s %d:\n",
+                   solver_recurse_depth*4, "",
+                   cluepos[c/w], c%w+1);
+       else
+           prefix[0] = '\0';          /* placate optimiser */
 #endif
 
        i = 0;
index 1cef29feb7922af1510a4c525162f8b0ae375fb0..54c3e4e3b32f19fd70109db96b2eb54968bfb55a 100644 (file)
--- a/version.c
+++ b/version.c
@@ -4,4 +4,8 @@
 
 #include "version.h"
 
-char ver[] = VER;
+char ver[] = VER
+#if defined DEBIAN_VERSION
+    " (Debian package " DEBIAN_VERSION ")"
+#endif
+    ;
index 997e00592b0f8b1bc222ce417861e5a96f8b6d4b..04958297b024a54c4a72137f4d1108780e3fcd94 100644 (file)
--- a/version.h
+++ b/version.h
@@ -1,11 +1,2 @@
-/*
- * This header file provides the version #define for a particular
- * build of Puzzles.
- *
- * When my automated build system does a full build, Buildscr
- * completely overwrites this file with information appropriate to
- * that build. The information _here_ is default stuff used for local
- * development runs of 'make'.
- */
-
-#define VER "Unidentified build"
+/* Generated by automated build script */
+#define VER "Version 20161228.7cae89f"
diff --git a/wceinf.pl b/wceinf.pl
deleted file mode 100644 (file)
index 4756f3c..0000000
--- a/wceinf.pl
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/perl
-
-# Perl script to generate a .INF file for building a Pocket PC .CAB
-# archive of Puzzles. This has to be scripted so that it can read
-# gamedesc.txt and automatically adjust to the current available
-# set of puzzles.
-
-# Usage:
-#
-#   $ ./wceinf.pl gamedesc.txt > puzzles.inf
-
-$desc = shift @ARGV;
-open DESC, "<", $desc;
-while (<DESC>) {
-    chomp;
-    @_ = split /:/;
-    push @exes, $_[1];
-    $names{$_[1]} = $_[2];
-}
-close DESC;
-
-print '[Version]'."\n";
-print 'Signature   = "$Windows NT$"    ; required as-is'."\n";
-print 'Provider    = "Simon Tatham"    ; full app name will be "<Provider> <AppName>"'."\n";
-print 'CESignature = "$Windows CE$"    ; required as-is'."\n";
-print ''."\n";
-print '[CEStrings]'."\n";
-print 'AppName     = "Puzzle Collection"    ; full app name will be "<Provider> <AppName>"'."\n";
-print 'InstallDir  = %CE8%\%AppName%        ; "\Program Files\Games\Puzzle Collection" (default install directory)'."\n";
-print ''."\n";
-print '[CEDevice.x86]'."\n";
-print 'ProcessorType = 686'."\n";
-print ''."\n";
-print '[CEDevice.ARM]'."\n";
-print 'ProcessorType = 2577'."\n";
-print ''."\n";
-print '[SourceDisksNames.x86]             ; CPU-dependent files'."\n";
-print '2 = ,"x86 Files",,.'."\n";
-print ''."\n";
-print '[SourceDisksNames.ARMV4]           ; CPU-dependent files'."\n";
-print '2 = ,"ARM Files",,.'."\n";
-print ''."\n";
-print '[SourceDisksFiles]'."\n";
-for $exe (@exes) {
-    print $exe.' = 2'."\n";
-}
-print ''."\n";
-print '[DefaultInstall]'."\n";
-print 'CopyFiles   = PuzzleFiles'."\n";
-print 'CEShortcuts = Links'."\n";
-print ''."\n";
-print '[DestinationDirs]'."\n";
-print 'PuzzleFiles = 0, %InstallDir%'."\n";
-print 'Links       = 0, %CE14%\Puzzles'."\n";
-print ''."\n";
-print ';File copy list.'."\n";
-print '[PuzzleFiles]'."\n";
-for $exe (@exes) {
-    print $exe."\n";
-}
-print ''."\n";
-print '[Links]'."\n";
-for $exe (@exes) {
-    print '"'.$names{$exe}.'",0,'.$exe."\n";
-}
diff --git a/webpage.pl b/webpage.pl
deleted file mode 100755 (executable)
index c6144bb..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/perl
-
-# Construct the two pieces of my main puzzle collection web page that
-# need to vary with the set of puzzles: the big list of <span>s with
-# puzzle pictures and links etc, and the list of Windows executable
-# files down in the downloads section.
-
-use strict;
-use warnings;
-use HTML::Entities;
-
-open my $desc, "<", "gamedesc.txt"
-    or die "gamedesc.txt: open: $!\n";
-
-open my $spans, ">", "wwwspans.html"
-    or die "wwwspans.html: open: $!\n";
-
-open my $links, ">", "wwwlinks.html"
-    or die "wwwspans.html: open: $!\n";
-
-my $n = 0;
-while (<$desc>) {
-    chomp;
-    my ($id, $win, $displayname, $description, $summary) = split /:/, $_;
-
-    printf $spans
-        '<span class="puzzle"><table>'.
-        '<tr><th align="center">%s</th></tr>'.
-        '<tr><td align="center">'.
-        '<a href="js/%s.html"><img style="margin: 0.5em" alt="" title="%s" width=150 height=150 border=0 src="%s-web.png" /></a>'.
-        '</td></tr>'.
-        '<tr><td align="center" style="font-size: 70%%"><code>[</code>'.
-        ' <a href="java/%s.html">java</a> '.
-        '|'.
-        ' <a href="js/%s.html">js</a> '.
-        '|'.
-        ' <a href="doc/%s.html#%s">manual</a> '.
-        '<code>]</code><br><code>[</code>'.
-        ' <a href="%s"><code>%s</code></a> '.
-        '<code>]</code></td></tr>'.
-        '<tr><td align="center">%s</td></tr></table></span>'.
-        "\n",
-        encode_entities($displayname),
-        encode_entities($id),
-        encode_entities($description),
-        encode_entities($id),
-        encode_entities($id),
-        encode_entities($id),
-        encode_entities($id),
-        encode_entities($id),
-        encode_entities($win),
-        encode_entities($win),
-        encode_entities($summary);
-
-    if ($n > 0) {
-        if ($n % 5 == 0) {
-            print $links "<br />";
-        } else {
-            print $links " | ";
-        }
-    }
-    printf $links '<a href="%s">%s</a>',
-    encode_entities($win), encode_entities($win);
-
-    $n++;
-}
-
-close $desc;
-close $spans;
-close $links;
diff --git a/website.url b/website.url
deleted file mode 100644 (file)
index 2913e62..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-[InternetShortcut]
-URL=https://www.chiark.greenend.org.uk/~sgtatham/puzzles/
diff --git a/winiss.pl b/winiss.pl
deleted file mode 100755 (executable)
index 3200337..0000000
--- a/winiss.pl
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/perl
-
-# Perl script to generate an Inno Setup installer script for
-# Puzzles. This has to be scripted so that it can read gamedesc.txt
-# and automatically adjust to the current available set of puzzles.
-
-# Usage:
-#
-#   $ ./winiss.pl 20140922.sdfsdf gamedesc.txt > puzzles.iss
-#
-# where the first argument is the version number which will be encoded
-# in the installer's version indicators. The first component of that
-# version number will be expected to be a YYYYMMDD-format date.
-
-use warnings;
-use Time::Local;
-
-$ver = shift @ARGV;
-
-# Parse the date out of $ver, and convert it into an integer number of
-# days since an arbitrary epoch. This number is used for the Windows
-# version resource (which wants a monotonic 16-bit integer). The epoch
-# is chosen so that the first build using this date-based mechanism
-# has a higher number than the last build in which that number was
-# derived from a Subversion revision.
-die "bad date format" if $ver !~ /^(\d{4})(\d{2})(\d{2})/;
-$date = timegm(0,0,0,$3,$2-1,$1);
-$integer_date = int($date / 86400) - 6000;
-
-$desc = shift @ARGV;
-open DESC, "<", $desc;
-while (<DESC>) {
-    chomp;
-    @_ = split /:/;
-    push @exes, $_[1];
-    $names{$_[1]} = $_[2];
-}
-close DESC;
-
-print '; -*- no -*-'."\n";
-print ';'."\n";
-print '; -- Inno Setup installer script for Puzzles.'."\n";
-print ''."\n";
-print '[Setup]'."\n";
-print 'AppName=Simon Tatham\'s Portable Puzzle Collection'."\n";
-print 'AppVerName=Puzzles version '.$ver."\n";
-print 'VersionInfoTextVersion=Version '.$ver."\n";
-print 'AppVersion=r'.$ver."\n";
-print 'VersionInfoVersion=0.0.'.$integer_date.'.0'."\n";
-print 'AppPublisher=Simon Tatham'."\n";
-print 'AppPublisherURL=https://www.chiark.greenend.org.uk/~sgtatham/puzzles/'."\n";
-print 'DefaultDirName={pf}\Simon Tatham\'s Portable Puzzle Collection'."\n";
-print 'DefaultGroupName=Simon Tatham\'s Puzzles'."\n";
-# print 'SetupIconFile=fixmethinkoneup.ico'."\n";
-# print 'UninstallDisplayIcon={app}\fixmethinkoneup.exe'."\n";
-print 'ChangesAssociations=no'."\n";
-print 'Compression=zip/9'."\n";
-print 'AllowNoIcons=yes'."\n";
-print 'OutputBaseFilename=installer'."\n";
-print ''."\n";
-print '[Files]'."\n";
-for $exe (@exes) {
-    print 'Source: "'.$exe.'"; DestDir: "{app}"; Flags: promptifolder replacesameversion uninsrestartdelete'."\n";
-}
-print 'Source: "website.url"; DestDir: "{app}"; Flags: uninsrestartdelete'."\n";
-print 'Source: "puzzles.chm"; DestDir: "{app}"; Flags: uninsrestartdelete'."\n";
-print 'Source: "puzzles.hlp"; DestDir: "{app}"; Flags: uninsrestartdelete'."\n";
-print 'Source: "puzzles.cnt"; DestDir: "{app}"; Flags: uninsrestartdelete'."\n";
-print 'Source: "LICENCE"; DestDir: "{app}"; Flags: uninsrestartdelete'."\n";
-print ''."\n";
-print '[Icons]'."\n";
-for $exe (@exes) {
-    print 'Name: "{group}\\'.$names{$exe}.'"; Filename: "{app}\\'.$exe.'"'."\n";
-}
-print '; We have to fall back from the .chm to the older .hlp file on some Windows'."\n";
-print '; versions.'."\n";
-print 'Name: "{group}\Puzzles Manual"; Filename: "{app}\puzzles.chm"; MinVersion: 4.1,5.0'."\n";
-print 'Name: "{group}\Puzzles Manual"; Filename: "{app}\puzzles.hlp"; OnlyBelowVersion: 4.1,5.0'."\n";
-print 'Name: "{group}\Puzzles Web Site"; Filename: "{app}\website.url"'."\n";
diff --git a/winwix.mc b/winwix.mc
deleted file mode 100644 (file)
index 4a72c09..0000000
--- a/winwix.mc
+++ /dev/null
@@ -1,334 +0,0 @@
-% # Source code for the Puzzles installer.
-% #
-% # The installer is built using WiX, but this file itself is not valid
-% # XML input to WiX's candle.exe; instead, this is a template intended
-% # to be processed through the standalone 'mason.pl' script provided
-% # with Perl's Mason module.
-
-<%class>
-has 'version' => (required => 1);
-has 'descfile' => (required => 1);
-</%class>
-
-<?xml version="1.0" encoding="utf-8"?>
-
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
-
-% # Product tag. The Id component is set to "*", which causes WiX to
-% # make up a new GUID every time it's run, whereas UpgradeCode is set
-% # to a fixed GUID. This combination allows Windows to
-% # recognise each new installer as different (because of Id)
-% # versions of the same underlying thing (because of the common
-% # UpgradeCode).
-  <Product
-      Name="Simon Tatham's Portable Puzzle Collection"
-      Manufacturer="Simon Tatham"
-      Id="*"
-      UpgradeCode="<% invent_guid('upgradecode') %>"
-      Language="1033" Codepage="1252" Version="<% $winver %>">
-
-% # We force the install scope to perMachine, largely because I
-% # don't really understand how to make it usefully switchable
-% # between the two. If anyone is a WiX expert and does want to
-% # install Puzzles locally in a user account, I hope they'll send a
-% # well explained patch!
-    <Package Id="*" Keywords="Installer"
-             Description="Simon Tatham's Portable Puzzle Collection installer, version <% $.version %>"
-             Manufacturer="Simon Tatham"
-             InstallerVersion="100" Languages="1033"
-             Compressed="yes" SummaryCodepage="1252"
-             InstallScope="perMachine" />
-
-% # Permit installing an arbitrary one of these installers
-% # over the top of an existing one, whether it's an upgrade or a
-% # downgrade.
-% # 
-% # Setting the REINSTALLMODE property to "amus" (from its default
-% # of "omus") forces every component replaced by a different
-% # version of the installer to be _actually_ reinstalled; the 'o'
-% # flag in the default setting breaks the downgrade case by
-% # causing Windows to disallow installation of an older version
-% # over the top of a newer one - and to do so _silently_, so the
-% # installer claims to have worked fine but the files that would have
-% # been downgraded aren't there.
-    <MajorUpgrade AllowDowngrades="yes" MigrateFeatures="yes" />
-    <Property Id="REINSTALLMODE" Value="amus"/>
-
-% # Boilerplate
-    <Media Id="1" Cabinet="puzzles.cab" EmbedCab="yes" />
-
-% # The actual directory structure and list of 'components'
-% # (individual files or shortcuts or additions to PATH) that are
-% # installed.
-    <Directory Id="TARGETDIR" Name="SourceDir">
-      <Directory Id="ProgramFiles64Folder" Name="PFiles">
-        <Directory Id="INSTALLDIR" Name="Simon Tatham's Portable Puzzle Collection">
-
-% # The following components all install things in the main
-% # install directory (implicitly, by being nested where
-% # they are in the XML structure). Most of them also put a
-% # shortcut in a subdir of the Start menu, though some of
-% # the more obscure things like LICENCE are just there for
-% # the sake of being _somewhere_ and don't rate a shortcut.
-
-<%method file_component ($filename, $shortcutname)>
-% my $filename_id = file_component_name($filename);
-<Component Id="File_Component_<% $filename_id %>"
-    Guid="<% invent_guid('file:' . $filename) %>">
-  <File Id="File_<% $filename_id %>"
-        Source="<% $filename %>" KeyPath="yes">
-% if (defined $shortcutname) {
-    <Shortcut Id="startmenu_<% $filename_id %>"
-              Directory="ProgramMenuDir" WorkingDirectory="INSTALLDIR"
-              Name="<% $shortcutname %>" Advertise="no" />
-% }
-  </File>
-</Component>
-</%method>
-
-% for my $exe (@exes) {
-<% $.file_component($exe, $names{$exe}) %>
-% }
-
-<% $.file_component("puzzles.chm", "Puzzles Manual") %>
-<% $.file_component("website.url", "Puzzles Web Site") %>
-<% $.file_component("LICENCE") %>
-
-        </Directory>
-      </Directory>
-
-% # This component doesn't actually install anything, but it
-% # arranges for the Start Menu _directory_ to be removed again
-% # on uninstall. All the actual shortcuts inside the directory
-% # are placed by code above here.
-      <Directory Id="ProgramMenuFolder" Name="Programs">
-        <Directory Id="ProgramMenuDir" Name="Simon Tatham's Portable Puzzle Collection">
-          <Component Id="ProgramMenuDir"
-                     Guid="<% invent_guid('programmenudir') %>">
-            <RemoveFolder Id="ProgramMenuDir" On="uninstall" />
-            <RegistryValue Root="HKLM"
-                           Key="Software\SimonTatham\Puzzles\StartMenu"
-                           Type="string" Value="" KeyPath="yes" />
-          </Component>
-        </Directory>
-      </Directory>
-    </Directory>
-
-% # Detect an installation of Puzzles made by the old Inno Setup
-% # installer, and refuse to run if we find one. I don't know what
-% # would happen if you tried anyway, but since they install files
-% # at the same pathnames, it surely wouldn't end well.
-% # 
-% # It could be argued that a better approach would be to actually
-% # _launch_ the Inno Setup uninstaller automatically at this
-% # point (prompting the user first, of course), but I'm not
-% # nearly skilled enough with WiX to know how, or even if it's
-% # feasible.
-    <Property Id="LEGACYINNOSETUPINSTALLERNATIVE32PROPERTY">
-      <RegistrySearch
-          Id="LegacyInnoSetupInstallerNative32RegSearch"
-          Root="HKLM"
-          Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Simon Tatham's Portable Puzzle Collection_is1"
-          Name="QuietUninstallString" Type="raw" />
-    </Property>
-    <Property Id="LEGACYINNOSETUPINSTALLER32ON64PROPERTY">
-      <RegistrySearch
-          Id="LegacyInnoSetupInstaller32On64RegSearch"
-          Root="HKLM"
-          Key="SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Simon Tatham's Portable Puzzle Collection_is1"
-          Name="QuietUninstallString" Type="raw" />
-    </Property>
-    <Condition Message="A version of this software is already installed on this system using its old Inno Setup installer. Please uninstall that before running the new installer.">
-      <![CDATA[Installed OR
-               (LEGACYINNOSETUPINSTALLERNATIVE32PROPERTY = "" AND
-                LEGACYINNOSETUPINSTALLER32ON64PROPERTY = "")]]>
-    </Condition>
-
-% # Separate the installation into 'features', which are parts of
-% # the install that can be chosen separately. Trivial: there is only
-% # one feature here.
-    <Feature Id="FilesFeature" Level="1" Absent="disallow" AllowAdvertise="no"
-             Title="Install puzzle games">
-% for my $exe (@exes) {
-      <ComponentRef Id="File_Component_<% file_component_name($exe) %>" />
-% }
-      <ComponentRef Id="File_Component_<% file_component_name("puzzles.chm") %>" />
-      <ComponentRef Id="File_Component_<% file_component_name("website.url") %>" />
-      <ComponentRef Id="File_Component_<% file_component_name("LICENCE") %>" />
-      <ComponentRef Id="ProgramMenuDir" />
-    </Feature>
-
-% # Installer user interface.
-% # 
-% # Basically like WixUI_InstallDir, only I've ripped out the EULA.
-    <UIRef Id="WixUI_Common" />
-
-    <UI>
-      <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
-      <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
-      <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
-
-      <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
-      <Property Id="WixUI_Mode" Value="InstallDir" />
-
-      <DialogRef Id="BrowseDlg" />
-      <DialogRef Id="DiskCostDlg" />
-      <DialogRef Id="ErrorDlg" />
-      <DialogRef Id="FatalError" />
-      <DialogRef Id="FilesInUse" />
-      <DialogRef Id="MsiRMFilesInUse" />
-      <DialogRef Id="PrepareDlg" />
-      <DialogRef Id="ProgressDlg" />
-      <DialogRef Id="ResumeDlg" />
-      <DialogRef Id="UserExit" />
-
-      <Publish Dialog="BrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="3">1</Publish>
-      <Publish Dialog="BrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="4"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
-
-      <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
-
-      <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg">NOT Installed</Publish>
-      <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed</Publish>
-
-      <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
-      <Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
-      <Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish>
-      <Publish Dialog="InstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
-      <Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="4">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"</Publish>
-      <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
-      <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish>
-
-      <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg" Order="1">NOT Installed</Publish>
-      <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish>
-      <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">Installed AND PATCH</Publish>
-
-      <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
-
-      <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
-      <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
-      <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
-
-% # This ARPNOMODIFY flag prohibits changing the set of
-% # installed features, because we don't have any.
-      <Property Id="ARPNOMODIFY" Value="1" />
-    </UI>
-
-% # Glue: tell the install dir part of the UI what id my actual
-% # install dir is known by. Otherwise the former won't know how
-% # to alter the setting of the latter.
-    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" />
-
-% # Include my custom installer artwork, created in Buildscr. FIXME:
-% # create some!
-% #    <WixVariable Id="WixUIDialogBmp" Value="msidialog.bmp" />
-% #    <WixVariable Id="WixUIBannerBmp" Value="msibanner.bmp" />
-
-  </Product>
-</Wix>
-
-<%init>
-
-use Digest::SHA qw(sha512_hex);
-use Time::Local;
-
-die "bad date format" if $.version !~ /^(\d{4})(\d{2})(\d{2})/;
-my $date = timegm(0,0,0,$3,$2-1,$1);
-my $integer_date = int($date / 86400) - 6000;
-my $winver = sprintf "0.0.%d.0", $integer_date;
-
-my @exes;
-my %names;
-{
-    open my $descfh, "<", $.descfile or die "$.descfile: open: $!\n";
-    while (<$descfh>) {
-        chomp;
-        my @fields = split /:/;
-        push @exes, $fields[1];
-        $names{$fields[1]} = $fields[2];
-    }
-    close $descfh;
-}
-
-sub file_component_name($) {
-    my ($id) = @_;
-    $id =~ s!.*\\!!;
-    $id =~ y!A-Za-z0-9!_!cs;
-    return $id;
-}
-
-sub invent_guid($) {
-    my ($name) = @_;
-
-    # Invent a GUID. We'll need a lot of these in this installer - one
-    # per puzzle game and a few standard ones - and we'd like to
-    # arrange for them to be stable between versions of the installer,
-    # while not having to _manually_ invent one every time.
-    #
-    # So we generate our GUIDs by hashing a pile of fixed (but
-    # originally randomly generated) data with an identifying string
-    # that acts as source for the particular GUID. For example,
-    # hashing (fixed_random_data || "upgradecode") produces the GUID
-    # used as the upgrade code, and (fixed_random_data ||
-    # "installfile:" || filename) gives the GUID for an MSI component
-    # that installs a specific file.
-    #
-    # Hashing _just_ the id strings would clearly be cheating (it's
-    # quite conceivable that someone might hash the same string for
-    # another reason and so generate a colliding GUID), but hashing a
-    # whole SHA-512 data block of random gibberish as well should make
-    # these GUIDs pseudo-random enough to not collide with anyone
-    # else's.
-
-    my $randdata = pack "N*",
-    0xCCAA8D31,0x42931BD9,0xA9D9878A,0x72E4FB9C,0xEA9B11DE,0x4FF17AEC,
-    0x1AFA2DEC,0xB662640A,0x780143F5,0xBFFFF0FC,0x01CB46CF,0x832AE842,
-    0xBCCDDA12,0x4DB24889,0xEC7A9BCD,0xBCCF70ED,0x85800659,0x8ABA9524,
-    0xE484F8D6,0x5CBE55B3,0x95AD9B3D,0x0555F432,0x46737F89,0xE981471C,
-    0x4B3419AD,0xD4E49DF4,0xB3EF69DE,0x2A7E391E,0xF3C3D370,0x3EA5E9FC,
-    0xB35A57ED,0x52B21099,0x9BD99092,0x7B5097AE,0x4DBE59BD,0x2FCC709B,
-    0xC555A779,0x4AE2E5AB,0xB7C74314,0x7F9194CF,0x8FFBCA88,0x46263306,
-    0x4C714DF7,0x07FE8CEE,0x28974885,0x0869865D,0xBB5B0EA4,0x4064A928,
-    0x28C41910,0x07030758,0x19E66319,0x050C9D4E,0xD79A37FB,0xF232D98B,
-    0x0C3E4C25,0xC94F865B,0xB6D86BED,0x87DB718D,0xC65D4C43,0x7C8BBF6A,
-    0x9DFDD26A,0x8C478976,0x53E47640,0x263E04AA,0xDD7C5456,0x766BDF50,
-    0x86946E34,0xE80D8DE3,0xFB92949E,0x691FDAD0,0x96AB210D,0xB278D60B,
-    0x71C7DC6B,0xD49846FC,0x38953F66,0x39777D72,0x4A0F80E5,0xFE1DD1A4,
-    0xDA9D191A,0xA32844AD,0x171BFBCC,0xA7D556F6,0xF9F6D944,0xF9687060,
-    0xDDDB81D0,0xE9AF4F2F,0xEF84685A,0x8A172492,0x50615EFC,0x20817881,
-    0xC3E507E5,0x33189771,0xB9E2EBBD,0x2AAE34A3,0x8D3E7486,0x0A448F13,
-    0x94F92A81,0x5150A34F,0x5ED50563,0xAD801A42,0xD0617AFA,0xB78F85F7,
-    0x0019D384,0xF0F1C06F,0x6EF8D5B3,0x38092D09,0xC87CD4B3,0xE9D8C84F,
-    0xE036648C,0xF2500BD9,0xCF069B5C,0x835326BA,0xCD107B6A,0x64F152B3,
-    0xA9663E24,0x33ED5E08,0xC3B24F7E,0xA83205C8,0xA0560F30,0xDFF1226E,
-    0xF1A404B7,0x9C2B4EF2,0x62802F88,0xE393A05F,0xC7F72F7B,0x1CD989BD,
-    0x725AB516,0xA84F7E39,0xACC3572A,0x820ACB2D,0xAFF5BF06,0x476A2405,
-    0x90953482,0x8E8035E1,0x1FB95F6E,0x01FD6766,0x1E63D78E,0xD7D42220,
-    0x188D23E4,0x1941BCC5,0xEE1E6487,0x6E197F82,0x32772265,0x9B79D0C8,
-    0xB4B617A1,0xCD2475B4,0xDE0F410B,0xE9CF69E4,0x831AC9A4,0xD549A00E,
-    0x12ECC561,0x3D636A43,0x1FFFC99A,0xF79401C5,0xAA1D8251,0x84D29609,
-    0x5464CB71,0xB28AAE5A,0x4AD934FC,0x347E8A5D,0xC87BCBA0,0x67172E33,
-    0xEC70E245,0x4289A9EF,0xA8AF6BA5,0x1528FE0C,0xA87CBFF8,0x79AE1554,
-    0xBD59DB9E,0xF1879F94,0x14D7E9F6,0x85196447,0xC4363A67,0x7E02A325,
-    0x54051E05,0xABAFE646,0x65D5DF96,0xD3F8173B,0x09D475E7,0x9BF7BD0C,
-    0x2DAF371A,0x793D063C,0xA68FD47B,0xBE2500A7,0x0D5071C4,0x08384AC8,
-    0xF6CFE74E,0x124A5086,0x03475917,0x47267765,0x56F7DF31,0xE5696381,
-    0xEB2B4668,0x78345B5B,0x6E2AFC0F,0x3AD0D43B,0x5C3C2BC9,0x833AB4A0,
-    0x1DE2CDBF,0x4DDDCF58,0xEA25D69B,0x36E9B3B0,0xC8B11465,0x066A997E,
-    0x9D51C7CD,0x8C6AE686,0xAFB06CE6,0xCC3F3017,0x6E4E4CC0,0x85A34875,
-    0x498FE759,0xC24B6332,0xEBCD2257,0xE70FC659,0x439EC788,0xB47F2A06,
-    0x696EE8A7,0xF70A31B8,0xECD840F7,0x80AE5E7A,0xC6EDF8AE,0x8165EAFD,
-    0x5DAE5ADE,0x9FFD39CE,0xFC6B4C23,0x02BCA024,0xC1497A68,0xD18153EF,
-    0xD787EA51,0x91386720,0xBF6E2200,0x98638391,0x144B9148,0x9A554DE1,
-    0xA940DC7F,0x37C08265,0x7B782C60,0xC081FDD7,0x62B47201,0x43427563,
-    0x1B66E983,0x3DAC0305,0x21E9DEA8,0xA9490EE0,0xE2EFD37D,0x3501F306,
-    0x16361BD5,0x668B219D,0x17177844,0x3861A9A4,0x222403B2,0xB29F6714,
-    0x7A2A938A,0xBC797418,0x3B241624,0x9163C3F2;
-    my $digest = sha512_hex($name . "\0" . $randdata);
-    return sprintf("%s-%s-%04x-%04x-%s",
-                   substr($digest,0,8),
-                   substr($digest,8,4),
-                   0x4000 | (0xFFF & hex(substr($digest,12,4))),
-                   0x8000 | (0x3FFF & hex(substr($digest,16,4))),
-                   substr($digest,20,12));
-}
-</%init>