diff --git a/codeword-maker.sh b/codeword-maker.sh
new file mode 100644
index 0000000..100ac2a
--- /dev/null
+++ b/codeword-maker.sh
@@ -0,0 +1,292 @@
+#!/bin/bash
+
+## Title: CodeWord Maker 1.00
+## Author: Ze'ev Schurmann
+## License: This project is licensed under the GNU General Public License v3.0 only.
+## License: URL
+## Git: https://git.zaks.web.za/thisiszeev/ipuz-to-pdf
+## https://github.com/thisiszeev/ipuz-to-pdf
+
+## What is this script?
+## This script will convert a ipuz crossword file into set of PDF files.
+
+## Why did I make this script?
+## I needed to create vector file of various ipuz files as per the defined ipuz standard.
+## These vector files are for use in print publications. So I need a script, that can be
+## run in batch jobs. Thus the script can be executed as:
+## $ bash codeword-maker.sh {filename}.ipuz
+
+## Where can I get software to create ipuz files?
+## Crosswords: https://gitlab.gnome.org/jrb/crosswords
+## Sudokus: https://invent.kde.org/games/ksudoku
+
+## Where I can learn more about the ipuz format?
+## ipuz is essentially a JSON format designed for storing puzzles.
+## Website: https://libipuz.org/ipuz-spec.html
+
+## What must I do first?
+## First you need to install FontConfig, Inkscape, JQ and the Ubuntu Font Family or this
+## script will not run.
+## FontConfig: https://www.baeldung.com/linux/find-installed-fonts-command-line
+## Inkscape: https://inkscape.org/
+## JQ: https://jqlang.github.io/jq/
+## Ubuntu Font Family: https://design.ubuntu.com/font
+
+## Donations & Support:
+## Left for last, as usual. If you want support, you can hit me up on Reddit u/thisiszeev.
+## I will try help out when I get time. But donations are a major source of my income, as
+## I need to eat.
+
+## Paypal: https://paypal.me/thisiszeev
+## $5 buys me a coffee
+## $10 buys me a a nice burger
+## $20 buys me a bottle of wine
+
+## If you plan to use this script for commercial use, you are free to do so, but please
+## remember I put a lot of work and effort into these scripts. I kindly urge you to
+## please make a donation of at least $50. You will then get priority support for a
+## period of 12 months.
+
+## SVGHEADER ARRAY
+svgheader=("\n\n\n"
+
+## SVGCELL ARRAY AND START POSITION
+svgcell=(" ")
+svgcellx="20"
+svgcelly="20"
+
+## SVGVAL ARRAY AND START POSITION
+svgval=(" " "")
+svgvalx="30"
+svgvaly="35"
+
+## SVGNUM ARRAY AND START POSITION
+svgnum=(" " "")
+svgnumx="21"
+svgnumxdec=".25"
+svgnumy="25"
+svgnumydec=".5"
+
+## COLOUR PALETTE FOR FILLING CELLS
+colblack="#000000"
+colwhite="#FFFFFF"
+
+## OFFSETS
+offsetx="20"
+offsety="20"
+
+errorcode=""
+
+temp=($(whereis inkscape))
+
+if [[ $? != 0 ]]; then
+ echo "Unexpected Error: whereis not found?"
+ exit 3
+fi
+
+if [[ ${#temp[@]} == 1 ]]; then
+ echo "Please install Inscape : https://inkscape.org/"
+ errorcode="${errorcode}I"
+fi
+
+temp=($(whereis jq))
+
+if [[ ${#temp[@]} == 1 ]]; then
+ echo "Please install JQ : https://jqlang.github.io/jq/"
+ errorcode="${errorcode}J"
+fi
+
+temp=($(whereis fc-match))
+
+if [[ ${#temp[@]} == 1 ]]; then
+ echo "Please install FontConfig : https://www.baeldung.com/linux/find-installed-fonts-command-line"
+ errorcode="${errorcode}F"
+else
+ temp2=$(fc-match "Ubuntu Mono")
+ if [[ $temp2 != 'UbuntuMono-R.ttf: "Ubuntu Mono" "Regular"' ]]; then
+ echo "Please install Ubuntu Font Family : https://design.ubuntu.com/font"
+ errorcode="${errorcode}U"
+ fi
+fi
+
+if [[ ! -z $errorcode ]] || [[ $errorcode != "" ]]; then
+ exit 2
+fi
+
+if [[ -z $1 ]] || [[ $1 == "" ]]; then
+ echo "Usage:"
+ echo " $ bash codeword-maker.sh {puzzlefile}.ipuz"
+ exit 1
+fi
+
+puzzlename="$1"
+
+width=$(jq -r ".dimensions.width" "$puzzlename")
+height=$(jq -r ".dimensions.height" "$puzzlename")
+block=$(jq -r ".block" "$puzzlename")
+empty=$(jq -r ".empty" "$puzzlename")
+
+echo "Puzzle is $width by $height in size!"
+
+declare -A gridarray
+declare -A valuearray
+
+echo "Loading Grid..."
+
+for ((y=0; y<$height; y++)); do
+ for ((x=0; x<$width; x++)); do
+ #gridarray[$x,$y]=$(jq -r ".puzzle[$y][$x]" "$puzzlename")
+ valuearray[$x,$y]=$(jq -r ".solution[$y][$x]" "$puzzlename")
+ #echo "$x, $y = ${gridarray[$x,$y]} = ${valuearray[$x,$y]}"
+ done
+done
+
+echo "Puzzle Data:"
+
+for ((y=0; y<$height; y++)); do
+ for ((x=0; x<$width; x++)); do
+ if [[ ${valuearray[$x,$y]} == "null" ]]; then
+ echo -n " "
+ else
+ echo -n " ${valuearray[$x,$y]}"
+ fi
+ done
+ echo
+done
+
+echo "Converting letters to numbers..."
+
+string=""
+
+for ((y=0; y<$height; y++)); do
+ for ((x=0; x<$width; x++)); do
+ if [[ ${valuearray[$x,$y]} != "null" ]]; then
+ test=$(echo "$string" | grep ${valuearray[$x,$y]})
+ if [[ -z $test ]] || [[ $test == "" ]]; then
+ string=$string${valuearray[$x,$y]}
+ fi
+ gridarray[$x,$y]=$(expr index "$string" ${valuearray[$x,$y]})
+ else
+ gridarray[$x,$y]=$block
+ fi
+ done
+done
+
+ongrid=${#string}
+
+echo "$ongrid - $string"
+
+randnum[0]=$(((RANDOM%$ongrid)+1))
+randnum[1]=${randnum[0]}
+while [[ ${randnum[0]} == ${randnum[1]} ]]; do
+ randnum[1]=$(((RANDOM%$ongrid)+1))
+done
+randnum[2]=${randnum[0]}
+while [[ ${randnum[0]} == ${randnum[2]} ]] || [[ ${randnum[1]} == ${randnum[2]} ]]; do
+ randnum[2]=$(((RANDOM%$ongrid)+1))
+done
+
+for ((c=0; c<3; c++)); do
+ echo "${randnum[$c]} - ${string:$((randnum[$c]-1)):1}"
+done
+
+echo "Building SVG Files..."
+
+pagex=$((width * offsetx + offsetx + offsetx))
+pagey=$((height * offsety + offsety + offsety))
+
+outputfile="CodeWord-${puzzlename%.*}"
+
+echo -e "${svgheader[0]}$pagex${svgheader[1]}$pagey${svgheader[2]}$pagex $pagey${svgheader[3]}" > "$outputfile.puzzle.svg"
+echo -e "${svgheader[0]}$pagex${svgheader[1]}$pagey${svgheader[2]}$pagex $pagey${svgheader[3]}" > "$outputfile.solution.svg"
+echo -e "${svgheader[0]}300${svgheader[1]}80${svgheader[2]}300 80${svgheader[3]}" > "$outputfile.legendbottom.svg"
+echo -e "${svgheader[0]}80${svgheader[1]}300${svgheader[2]}80 300${svgheader[3]}" > "$outputfile.legendside.svg"
+
+for ((n=0; n<13; n++)); do
+ if [[ $n -lt $ongrid ]]; then
+ echo -e "${svgcell[0]}$colwhite${svgcell[1]}$((n*20+svgcellx))${svgcell[2]}$((svgcelly))${svgcell[3]}leg$((n+1))${svgcell[4]}" >> "$outputfile.legendbottom.svg"
+ echo -e "${svgcell[0]}$colwhite${svgcell[1]}$((svgcellx))${svgcell[2]}$((n*20+svgcelly))${svgcell[3]}leg$((n+1))${svgcell[4]}" >> "$outputfile.legendside.svg"
+ echo -e "${svgnum[0]}$((n*20+svgnumx))$svgnumxdec${svgnum[1]}$((svgnumy))$svgnumydec${svgnum[2]}leg$((n+1))${svgnum[3]}$((n+1))${svgnum[4]}" >> "$outputfile.legendbottom.svg"
+ echo -e "${svgnum[0]}$((svgnumx))$svgnumxdec${svgnum[1]}$((n*20+svgnumy))$svgnumydec${svgnum[2]}leg$((n+1))${svgnum[3]}$((n+1))${svgnum[4]}" >> "$outputfile.legendside.svg"
+ for ((c=0; c<3; c++)); do
+ if [[ $((n+1)) == ${randnum[$c]} ]]; then
+ echo -e "${svgval[0]}$((n*20+svgvalx))${svgval[1]}$((svgvaly))${svgval[2]}leg$((n+1))${svgval[3]}${string:$n:1}${svgval[4]}" >> "$outputfile.legendbottom.svg"
+ echo -e "${svgval[0]}$((svgvalx))${svgval[1]}$((n*20+svgvaly))${svgval[2]}leg$((n+1))${svgval[3]}${string:$n:1}${svgval[4]}" >> "$outputfile.legendside.svg"
+ fi
+ done
+ else
+ echo -e "${svgcell[0]}$colblack${svgcell[1]}$((n*20+svgcellx))${svgcell[2]}$((svgcelly))${svgcell[3]}leg$((n+1))${svgcell[4]}" >> "$outputfile.legendbottom.svg"
+ echo -e "${svgcell[0]}$colblack${svgcell[1]}$((svgcellx))${svgcell[2]}$((n*20+svgcelly))${svgcell[3]}leg$((n+1))${svgcell[4]}" >> "$outputfile.legendside.svg"
+ fi
+done
+
+for ((n=0; n<13; n++)); do
+ if [[ $((n+13)) -lt $ongrid ]]; then
+ echo -e "${svgcell[0]}$colwhite${svgcell[1]}$((n*20+svgcellx))${svgcell[2]}$((20+svgcelly))${svgcell[3]}leg$((n+14))${svgcell[4]}" >> "$outputfile.legendbottom.svg"
+ echo -e "${svgcell[0]}$colwhite${svgcell[1]}$((20+svgcellx))${svgcell[2]}$((n*20+svgcelly))${svgcell[3]}leg$((n+14))${svgcell[4]}" >> "$outputfile.legendside.svg"
+ echo -e "${svgnum[0]}$((n*20+svgnumx))$svgnumxdec${svgnum[1]}$((20+svgnumy))$svgnumydec${svgnum[2]}leg$((n+14))${svgnum[3]}$((n+14))${svgnum[4]}" >> "$outputfile.legendbottom.svg"
+ echo -e "${svgnum[0]}$((20+svgnumx))$svgnumxdec${svgnum[1]}$((n*20+svgnumy))$svgnumydec${svgnum[2]}leg$((n+14))${svgnum[3]}$((n+14))${svgnum[4]}" >> "$outputfile.legendside.svg"
+ for ((c=0; c<3; c++)); do
+ if [[ $((n+14)) == ${randnum[$c]} ]]; then
+ echo -e "${svgval[0]}$((n*20+svgvalx))${svgval[1]}$((20+svgvaly))${svgval[2]}leg$((n+14))${svgval[3]}${string:$((n+13)):1}${svgval[4]}" >> "$outputfile.legendbottom.svg"
+ echo -e "${svgval[0]}$((20+svgvalx))${svgval[1]}$((n*20+svgvaly))${svgval[2]}leg$((n+14))${svgval[3]}${string:$((n+13)):1}${svgval[4]}" >> "$outputfile.legendside.svg"
+ fi
+ done
+ else
+ echo -e "${svgcell[0]}$colblack${svgcell[1]}$((n*20+svgcellx))${svgcell[2]}$((20+svgcelly))${svgcell[3]}leg$((n+14))${svgcell[4]}" >> "$outputfile.legendbottom.svg"
+ echo -e "${svgcell[0]}$colblack${svgcell[1]}$((20+svgcellx))${svgcell[2]}$((n*20+svgcelly))${svgcell[3]}leg$((n+14))${svgcell[4]}" >> "$outputfile.legendside.svg"
+ fi
+done
+
+for ((y=0; y<$height; y++)); do
+ if [[ $y -lt 10 ]]; then
+ idy="0$y"
+ else
+ idy="$y"
+ fi
+ for ((x=0; x<$width; x++)); do
+ if [[ $x -lt 10 ]]; then
+ idx="0$x"
+ else
+ idx="$x"
+ fi
+ if [[ ${gridarray[$x,$y]} == $block ]]; then
+ echo -e "${svgcell[0]}$colblack${svgcell[1]}$((x*20+svgcellx))${svgcell[2]}$((y*20+svgcelly))${svgcell[3]}$idx$idy${svgcell[4]}" >> "$outputfile.puzzle.svg"
+ echo -e "${svgcell[0]}$colblack${svgcell[1]}$((x*20+svgcellx))${svgcell[2]}$((y*20+svgcelly))${svgcell[3]}$idx$idy${svgcell[4]}" >> "$outputfile.solution.svg"
+ else
+ echo -e "${svgcell[0]}$colwhite${svgcell[1]}$((x*20+svgcellx))${svgcell[2]}$((y*20+svgcelly))${svgcell[3]}$idx$idy${svgcell[4]}" >> "$outputfile.puzzle.svg"
+ echo -e "${svgcell[0]}$colwhite${svgcell[1]}$((x*20+svgcellx))${svgcell[2]}$((y*20+svgcelly))${svgcell[3]}$idx$idy${svgcell[4]}" >> "$outputfile.solution.svg"
+ if [[ ${gridarray[$x,$y]} != $block ]] && [[ ${gridarray[$x,$y]} != $empty ]]; then
+ echo -e "${svgnum[0]}$((x*20+svgnumx))$svgnumxdec${svgnum[1]}$((y*20+svgnumy))$svgnumydec${svgnum[2]}$idx$idy${svgnum[3]}${gridarray[$x,$y]}${svgnum[4]}" >> "$outputfile.puzzle.svg"
+ echo -e "${svgnum[0]}$((x*20+svgnumx))$svgnumxdec${svgnum[1]}$((y*20+svgnumy))$svgnumydec${svgnum[2]}$idx$idy${svgnum[3]}${gridarray[$x,$y]}${svgnum[4]}" >> "$outputfile.solution.svg"
+ fi
+ for ((c=0; c<3; c++)); do
+ if [[ ${gridarray[$x,$y]} == ${randnum[$c]} ]]; then
+ echo -e "${svgval[0]}$((x*20+svgvalx))${svgval[1]}$((y*20+svgvaly))${svgval[2]}$idx$idy${svgval[3]}${valuearray[$x,$y]}${svgval[4]}" >> "$outputfile.puzzle.svg"
+ fi
+ done
+ echo -e "${svgval[0]}$((x*20+svgvalx))${svgval[1]}$((y*20+svgvaly))${svgval[2]}$idx$idy${svgval[3]}${valuearray[$x,$y]}${svgval[4]}" >> "$outputfile.solution.svg"
+ fi
+ done
+done
+
+echo -e "$svgfooter" >> "$outputfile.puzzle.svg"
+echo -e "$svgfooter" >> "$outputfile.solution.svg"
+echo -e "$svgfooter" >> "$outputfile.legendbottom.svg"
+echo -e "$svgfooter" >> "$outputfile.legendside.svg"
+
+echo "Converting SVG files to PDF files..."
+
+inkscape "$outputfile.puzzle.svg" --export-filename="$outputfile.puzzle.pdf" --export-area-drawing --export-type=pdf --export-text-to-path
+inkscape "$outputfile.solution.svg" --export-filename="$outputfile.solution.pdf" --export-area-drawing --export-type=pdf --export-text-to-path
+inkscape "$outputfile.legendbottom.svg" --export-filename="$outputfile.legendbottom.pdf" --export-area-drawing --export-type=pdf --export-text-to-path
+inkscape "$outputfile.legendside.svg" --export-filename="$outputfile.legendside.pdf" --export-area-drawing --export-type=pdf --export-text-to-path
+
+echo "Cleaning up..."
+
+rm "$outputfile.puzzle.svg" "$outputfile.solution.svg" "$outputfile.legendbottom.svg" "$outputfile.legendside.svg"
+
+echo "DONE!!!"
diff --git a/crossword-maker.sh b/crossword-maker.sh
new file mode 100644
index 0000000..04e045b
--- /dev/null
+++ b/crossword-maker.sh
@@ -0,0 +1,242 @@
+#!/bin/bash
+
+## Title: CrossWord Maker 1.00
+## Author: Ze'ev Schurmann
+## License: This project is licensed under the GNU General Public License v3.0 only.
+## License: URL
+## Git: https://git.zaks.web.za/thisiszeev/ipuz-to-pdf
+## https://github.com/thisiszeev/ipuz-to-pdf
+
+## What is this script?
+## This script will convert a ipuz crossword file into set of PDF files.
+
+## Why did I make this script?
+## I needed to create vector file of various ipuz files as per the defined ipuz standard.
+## These vector files are for use in print publications. So I need a script, that can be
+## run in batch jobs. Thus the script can be executed as:
+## $ bash crossword-maker.sh {filename}.ipuz
+
+## Where can I get software to create ipuz files?
+## Crosswords: https://gitlab.gnome.org/jrb/crosswords
+## Sudokus: https://invent.kde.org/games/ksudoku
+
+## Where I can learn more about the ipuz format?
+## ipuz is essentially a JSON format designed for storing puzzles.
+## Website: https://libipuz.org/ipuz-spec.html
+
+## What must I do first?
+## First you need to install FontConfig, Inkscape, JQ and the Ubuntu Font Family or this
+## script will not run.
+## FontConfig: https://www.baeldung.com/linux/find-installed-fonts-command-line
+## Inkscape: https://inkscape.org/
+## JQ: https://jqlang.github.io/jq/
+## Ubuntu Font Family: https://design.ubuntu.com/font
+
+## Donations & Support:
+## Left for last, as usual. If you want support, you can hit me up on Reddit u/thisiszeev.
+## I will try help out when I get time. But donations are a major source of my income, as
+## I need to eat.
+
+## Paypal: https://paypal.me/thisiszeev
+## $5 buys me a coffee
+## $10 buys me a a nice burger
+## $20 buys me a bottle of wine
+
+## If you plan to use this script for commercial use, you are free to do so, but please
+## remember I put a lot of work and effort into these scripts. I kindly urge you to
+## please make a donation of at least $50. You will then get priority support for a
+## period of 12 months.
+
+## SVGHEADER ARRAY
+svgheader=("\n\n\n"
+
+## SVGCELL ARRAY AND START POSITION
+svgcell=(" ")
+svgcellx="20"
+svgcelly="20"
+
+## SVGVAL ARRAY AND START POSITION
+svgval=(" " "")
+svgvalx="30"
+svgvaly="35"
+
+## SVGNUM ARRAY AND START POSITION
+svgnum=(" " "")
+svgnumx="21"
+svgnumxdec=".25"
+svgnumy="25"
+svgnumydec=".5"
+
+## COLOUR PALETTE FOR FILLING CELLS
+colblack="#000000"
+colwhite="#FFFFFF"
+
+## OFFSETS
+offsetx="20"
+offsety="20"
+
+errorcode=""
+
+temp=($(whereis inkscape))
+
+if [[ $? != 0 ]]; then
+ echo "Unexpected Error: whereis not found?"
+ exit 3
+fi
+
+if [[ ${#temp[@]} == 1 ]]; then
+ echo "Please install Inscape : https://inkscape.org/"
+ errorcode="${errorcode}I"
+fi
+
+temp=($(whereis jq))
+
+if [[ ${#temp[@]} == 1 ]]; then
+ echo "Please install JQ : https://jqlang.github.io/jq/"
+ errorcode="${errorcode}J"
+fi
+
+temp=($(whereis fc-match))
+
+if [[ ${#temp[@]} == 1 ]]; then
+ echo "Please install FontConfig : https://www.baeldung.com/linux/find-installed-fonts-command-line"
+ errorcode="${errorcode}F"
+else
+ temp2=$(fc-match "Ubuntu Mono")
+ if [[ $temp2 != 'UbuntuMono-R.ttf: "Ubuntu Mono" "Regular"' ]]; then
+ echo "Please install Ubuntu Font Family : https://design.ubuntu.com/font"
+ errorcode="${errorcode}U"
+ fi
+fi
+
+if [[ ! -z $errorcode ]] || [[ $errorcode != "" ]]; then
+ exit 2
+fi
+
+if [[ -z $1 ]] || [[ $1 == "" ]]; then
+ echo "Usage:"
+ echo " $ bash crossword-maker.sh {puzzlefile}.ipuz"
+ exit 1
+fi
+
+puzzlename="$1"
+
+width=$(jq -r ".dimensions.width" "$puzzlename")
+height=$(jq -r ".dimensions.height" "$puzzlename")
+block=$(jq -r ".block" "$puzzlename")
+empty=$(jq -r ".empty" "$puzzlename")
+acrosssize=$(jq -r ".clues.\"Across:Across\" | length" "$puzzlename")
+downsize=$(jq -r ".clues.\"Down:Down\" | length" "$puzzlename")
+
+echo "Puzzle is $width by $height in size!"
+
+declare -A gridarray
+declare -A valuearray
+declare -a acrossclue
+declare -a downclue
+declare -a acrossnumber
+declare -a downnumber
+
+echo "Loading Grid..."
+
+for ((y=0; y<$height; y++)); do
+ for ((x=0; x<$width; x++)); do
+ gridarray[$x,$y]=$(jq -r ".puzzle[$y][$x]" "$puzzlename")
+ valuearray[$x,$y]=$(jq -r ".solution[$y][$x]" "$puzzlename")
+ #echo "$x, $y = ${gridarray[$x,$y]} = ${valuearray[$x,$y]}"
+ done
+done
+
+echo "Loading Clues..."
+
+for ((n=0; n<$acrosssize; n++)); do
+ acrossnumber[$n]=$(jq -r ".clues.\"Across:Across\"[$n].number" "$puzzlename")
+ acrossclue[$n]=$(jq -r ".clues.\"Across:Across\"[$n].clue" "$puzzlename")
+done
+
+for ((n=0; n<$downsize; n++)); do
+ downnumber[$n]=$(jq -r ".clues.\"Down:Down\"[$n].number" "$puzzlename")
+ downclue[$n]=$(jq -r ".clues.\"Down:Down\"[$n].clue" "$puzzlename")
+done
+
+echo "Puzzle Data:"
+
+for ((y=0; y<$height; y++)); do
+ for ((x=0; x<$width; x++)); do
+ if [[ ${valuearray[$x,$y]} == "null" ]]; then
+ echo -n " "
+ else
+ echo -n " ${valuearray[$x,$y]}"
+ fi
+ done
+ echo
+done
+
+echo "Building SVG Files..."
+
+pagex=$((width * offsetx + offsetx + offsetx))
+pagey=$((height * offsety + offsety + offsety))
+
+outputfile="CrossWord-${puzzlename%.*}"
+
+echo -e "${svgheader[0]}$pagex${svgheader[1]}$pagey${svgheader[2]}$pagex $pagey${svgheader[3]}" > "$outputfile.puzzle.svg"
+echo -e "${svgheader[0]}$pagex${svgheader[1]}$pagey${svgheader[2]}$pagex $pagey${svgheader[3]}" > "$outputfile.solution.svg"
+
+for ((y=0; y<$height; y++)); do
+ if [[ $y -lt 10 ]]; then
+ idy="0$y"
+ else
+ idy="$y"
+ fi
+ for ((x=0; x<$width; x++)); do
+ if [[ $x -lt 10 ]]; then
+ idx="0$x"
+ else
+ idx="$x"
+ fi
+ if [[ ${gridarray[$x,$y]} == $block ]]; then
+ echo -e "${svgcell[0]}$colblack${svgcell[1]}$((x*20+svgcellx))${svgcell[2]}$((y*20+svgcelly))${svgcell[3]}$idx$idy${svgcell[4]}" >> "$outputfile.puzzle.svg"
+ echo -e "${svgcell[0]}$colblack${svgcell[1]}$((x*20+svgcellx))${svgcell[2]}$((y*20+svgcelly))${svgcell[3]}$idx$idy${svgcell[4]}" >> "$outputfile.solution.svg"
+ else
+ echo -e "${svgcell[0]}$colwhite${svgcell[1]}$((x*20+svgcellx))${svgcell[2]}$((y*20+svgcelly))${svgcell[3]}$idx$idy${svgcell[4]}" >> "$outputfile.puzzle.svg"
+ echo -e "${svgcell[0]}$colwhite${svgcell[1]}$((x*20+svgcellx))${svgcell[2]}$((y*20+svgcelly))${svgcell[3]}$idx$idy${svgcell[4]}" >> "$outputfile.solution.svg"
+ if [[ ${gridarray[$x,$y]} != $block ]] && [[ ${gridarray[$x,$y]} != $empty ]]; then
+ echo -e "${svgnum[0]}$((x*20+svgnumx))$svgnumxdec${svgnum[1]}$((y*20+svgnumy))$svgnumydec${svgnum[2]}$idx$idy${svgnum[3]}${gridarray[$x,$y]}${svgnum[4]}" >> "$outputfile.puzzle.svg"
+ echo -e "${svgnum[0]}$((x*20+svgnumx))$svgnumxdec${svgnum[1]}$((y*20+svgnumy))$svgnumydec${svgnum[2]}$idx$idy${svgnum[3]}${gridarray[$x,$y]}${svgnum[4]}" >> "$outputfile.solution.svg"
+ fi
+ echo -e "${svgval[0]}$((x*20+svgvalx))${svgval[1]}$((y*20+svgvaly))${svgval[2]}$idx$idy${svgval[3]}${valuearray[$x,$y]}${svgval[4]}" >> "$outputfile.solution.svg"
+ fi
+ done
+done
+
+echo -e "$svgfooter" >> "$outputfile.puzzle.svg"
+echo -e "$svgfooter" >> "$outputfile.solution.svg"
+
+echo "Exporting Clues..."
+
+echo "ACROSS:" > "$outputfile.clues.txt"
+
+for ((n=0; n<${#acrossclue[@]}; n++)); do
+ echo "${acrossnumber[$n]} ${acrossclue[$n]}" >> "$outputfile.clues.txt"
+done
+
+echo >> "$outputfile.clues.txt"
+echo "DOWN:" >> "$outputfile.clues.txt"
+
+for ((n=0; n<${#downclue[@]}; n++)); do
+ echo "${downnumber[$n]} ${downclue[$n]}" >> "$outputfile.clues.txt"
+done
+
+echo "Converting SVG files to PDF files..."
+
+inkscape "$outputfile.puzzle.svg" --export-filename="$outputfile.puzzle.pdf" --export-area-drawing --export-type=pdf --export-text-to-path
+inkscape "$outputfile.solution.svg" --export-filename="$outputfile.solution.pdf" --export-area-drawing --export-type=pdf --export-text-to-path
+
+echo "Cleaning up..."
+
+rm "$outputfile.puzzle.svg" "$outputfile.solution.svg"
+
+echo "DONE!!!"
diff --git a/cwsample1.ipuz b/cwsample1.ipuz
new file mode 100644
index 0000000..f650c66
--- /dev/null
+++ b/cwsample1.ipuz
@@ -0,0 +1,1721 @@
+{
+ "kind" : [
+ "http://ipuz.org/crossword#1",
+ "http://ipuz.org/crossword/crypticcrossword#1"
+ ],
+ "version" : "http://ipuz.org/v2",
+ "copyright" : "GW Puzzles",
+ "publisher" : "GW Puzzles",
+ "title" : "Cryptic Crossword",
+ "author" : "GW Puzzles",
+ "editor" : "GW Puzzles",
+ "date" : "2024-04-22",
+ "difficulty" : "Mixed",
+ "block" : "#",
+ "empty" : "0",
+ "dimensions" : {
+ "width" : 15,
+ "height" : 15
+ },
+ "showenumerations" : true,
+ "puzzle" : [
+ [
+ 1,
+ 0,
+ 2,
+ 0,
+ 3,
+ 0,
+ 4,
+ "#",
+ 5,
+ "#",
+ 6,
+ 0,
+ 7,
+ 0,
+ 8
+ ],
+ [
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 9,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 0,
+ "#",
+ 0
+ ],
+ [
+ 10,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 0,
+ "#",
+ 11,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ 0,
+ "#",
+ 0,
+ "#",
+ "#",
+ "#",
+ 0,
+ "#",
+ 12,
+ 0,
+ 0,
+ "#",
+ 0,
+ "#",
+ 0
+ ],
+ [
+ 13,
+ 0,
+ 0,
+ 0,
+ 14,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 15,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ "#",
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0
+ ],
+ [
+ 16,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 17,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ "#",
+ "#",
+ "#",
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ "#",
+ "#",
+ "#"
+ ],
+ [
+ 18,
+ 0,
+ 19,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 20,
+ 0,
+ 21,
+ 0,
+ 22
+ ],
+ [
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ "#",
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0
+ ],
+ [
+ 23,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 24,
+ 0,
+ 25,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ 0,
+ "#",
+ 0,
+ "#",
+ 26,
+ 0,
+ 0,
+ "#",
+ 0,
+ "#",
+ "#",
+ "#",
+ 0,
+ "#",
+ 0
+ ],
+ [
+ 27,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 0,
+ "#",
+ 28,
+ 0,
+ 29,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ 0,
+ "#",
+ 0,
+ "#",
+ 30,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0
+ ],
+ [
+ 31,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 0,
+ "#",
+ 32,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ ],
+ "solution" : [
+ [
+ "D",
+ "A",
+ "D",
+ "J",
+ "O",
+ "K",
+ "E",
+ null,
+ "F",
+ null,
+ "S",
+ "L",
+ "E",
+ "E",
+ "P"
+ ],
+ [
+ "I",
+ null,
+ "O",
+ null,
+ "D",
+ null,
+ "S",
+ "T",
+ "A",
+ "R",
+ "T",
+ null,
+ "M",
+ null,
+ "R"
+ ],
+ [
+ "C",
+ "A",
+ "G",
+ "E",
+ "D",
+ "U",
+ "P",
+ null,
+ "R",
+ null,
+ "O",
+ "B",
+ "E",
+ "S",
+ "E"
+ ],
+ [
+ "E",
+ null,
+ "P",
+ null,
+ null,
+ null,
+ "I",
+ null,
+ "M",
+ "A",
+ "C",
+ null,
+ "R",
+ null,
+ "T"
+ ],
+ [
+ "B",
+ "E",
+ "A",
+ "S",
+ "T",
+ "M",
+ "O",
+ "D",
+ "E",
+ null,
+ "K",
+ "N",
+ "I",
+ "F",
+ "E"
+ ],
+ [
+ "A",
+ null,
+ "R",
+ null,
+ "W",
+ null,
+ null,
+ null,
+ "R",
+ null,
+ "B",
+ null,
+ "T",
+ null,
+ "E"
+ ],
+ [
+ "G",
+ "E",
+ "T",
+ "T",
+ "O",
+ null,
+ "S",
+ "A",
+ "T",
+ "U",
+ "R",
+ "N",
+ "I",
+ "A",
+ "N"
+ ],
+ [
+ null,
+ null,
+ null,
+ null,
+ "F",
+ null,
+ "U",
+ null,
+ "A",
+ null,
+ "O",
+ null,
+ null,
+ null,
+ null
+ ],
+ [
+ "R",
+ "A",
+ "P",
+ "T",
+ "O",
+ "R",
+ "P",
+ "E",
+ "N",
+ null,
+ "K",
+ "E",
+ "B",
+ "A",
+ "B"
+ ],
+ [
+ "E",
+ null,
+ "A",
+ null,
+ "U",
+ null,
+ "E",
+ null,
+ null,
+ null,
+ "E",
+ null,
+ "L",
+ null,
+ "A"
+ ],
+ [
+ "D",
+ "O",
+ "N",
+ "O",
+ "R",
+ null,
+ "R",
+ "A",
+ "C",
+ "E",
+ "R",
+ "I",
+ "O",
+ "T",
+ "S"
+ ],
+ [
+ "F",
+ null,
+ "J",
+ null,
+ "T",
+ "A",
+ "B",
+ null,
+ "H",
+ null,
+ null,
+ null,
+ "O",
+ null,
+ "E"
+ ],
+ [
+ "A",
+ "B",
+ "A",
+ "C",
+ "I",
+ null,
+ "I",
+ null,
+ "I",
+ "G",
+ "G",
+ "Y",
+ "P",
+ "O",
+ "P"
+ ],
+ [
+ "C",
+ null,
+ "B",
+ null,
+ "M",
+ "A",
+ "K",
+ "E",
+ "R",
+ null,
+ "A",
+ null,
+ "E",
+ null,
+ "A"
+ ],
+ [
+ "E",
+ "V",
+ "I",
+ "T",
+ "E",
+ null,
+ "E",
+ null,
+ "P",
+ "U",
+ "B",
+ "E",
+ "R",
+ "T",
+ "Y"
+ ]
+ ],
+ "clues" : {
+ "Across:Across" : [
+ {
+ "number" : 1,
+ "clue" : "Humorous quip often delivered by a father",
+ "enumeration" : "7",
+ "cells" : [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ 6,
+ 0
+ ]
+ ]
+ },
+ {
+ "number" : 6,
+ "clue" : "Restful state essential for rejuvenation",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 10,
+ 0
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 14,
+ 0
+ ]
+ ]
+ },
+ {
+ "number" : 9,
+ "clue" : "Commence; initiate",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 6,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 10,
+ 1
+ ]
+ ]
+ },
+ {
+ "number" : 10,
+ "clue" : "Confined behind bars, perhaps",
+ "enumeration" : "7",
+ "cells" : [
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 6,
+ 2
+ ]
+ ]
+ },
+ {
+ "number" : 11,
+ "clue" : "Significantly overweight",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 10,
+ 2
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 14,
+ 2
+ ]
+ ]
+ },
+ {
+ "number" : 12,
+ "clue" : "Popular computer brand, often seen in cafes",
+ "enumeration" : "3",
+ "cells" : [
+ [
+ 8,
+ 3
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 10,
+ 3
+ ]
+ ]
+ },
+ {
+ "number" : 13,
+ "clue" : "Intensity of performance, like an animal",
+ "enumeration" : "9",
+ "cells" : [
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 8,
+ 4
+ ]
+ ]
+ },
+ {
+ "number" : 15,
+ "clue" : "Sharp cutting tool used in the kitchen",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 10,
+ 4
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 12,
+ 4
+ ],
+ [
+ 13,
+ 4
+ ],
+ [
+ 14,
+ 4
+ ]
+ ]
+ },
+ {
+ "number" : 16,
+ "clue" : "Acquire; obtain",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 4,
+ 6
+ ]
+ ]
+ },
+ {
+ "number" : 17,
+ "clue" : "Relating to the sixth planet from the sun ",
+ "enumeration" : "9",
+ "cells" : [
+ [
+ 6,
+ 6
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 10,
+ 6
+ ],
+ [
+ 11,
+ 6
+ ],
+ [
+ 12,
+ 6
+ ],
+ [
+ 13,
+ 6
+ ],
+ [
+ 14,
+ 6
+ ]
+ ]
+ },
+ {
+ "number" : 18,
+ "clue" : "Enclosure for predatory birds",
+ "enumeration" : "9",
+ "cells" : [
+ [
+ 0,
+ 8
+ ],
+ [
+ 1,
+ 8
+ ],
+ [
+ 2,
+ 8
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 8,
+ 8
+ ]
+ ]
+ },
+ {
+ "number" : 20,
+ "clue" : "Skewered and grilled meat dish",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 10,
+ 8
+ ],
+ [
+ 11,
+ 8
+ ],
+ [
+ 12,
+ 8
+ ],
+ [
+ 13,
+ 8
+ ],
+ [
+ 14,
+ 8
+ ]
+ ]
+ },
+ {
+ "number" : 23,
+ "clue" : "One who gives to a cause or charity",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 4,
+ 10
+ ]
+ ]
+ },
+ {
+ "number" : 24,
+ "clue" : "Urban unrest caused by issues of discrimination and inequality",
+ "enumeration" : "9",
+ "cells" : [
+ [
+ 6,
+ 10
+ ],
+ [
+ 7,
+ 10
+ ],
+ [
+ 8,
+ 10
+ ],
+ [
+ 9,
+ 10
+ ],
+ [
+ 10,
+ 10
+ ],
+ [
+ 11,
+ 10
+ ],
+ [
+ 12,
+ 10
+ ],
+ [
+ 13,
+ 10
+ ],
+ [
+ 14,
+ 10
+ ]
+ ]
+ },
+ {
+ "number" : 26,
+ "clue" : "Bill to be settled later",
+ "enumeration" : "3",
+ "cells" : [
+ [
+ 4,
+ 11
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 6,
+ 11
+ ]
+ ]
+ },
+ {
+ "number" : 27,
+ "clue" : "Ancient counting devices with beads",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 0,
+ 12
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 4,
+ 12
+ ]
+ ]
+ },
+ {
+ "number" : 28,
+ "clue" : "Legendary punk rock singer known for 'Lust for Life'",
+ "enumeration" : "7",
+ "cells" : [
+ [
+ 8,
+ 12
+ ],
+ [
+ 9,
+ 12
+ ],
+ [
+ 10,
+ 12
+ ],
+ [
+ 11,
+ 12
+ ],
+ [
+ 12,
+ 12
+ ],
+ [
+ 13,
+ 12
+ ],
+ [
+ 14,
+ 12
+ ]
+ ]
+ },
+ {
+ "number" : 30,
+ "clue" : "One who creates or produces",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 4,
+ 13
+ ],
+ [
+ 5,
+ 13
+ ],
+ [
+ 6,
+ 13
+ ],
+ [
+ 7,
+ 13
+ ],
+ [
+ 8,
+ 13
+ ]
+ ]
+ },
+ {
+ "number" : 31,
+ "clue" : "Online invitation service for events",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 0,
+ 14
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 3,
+ 14
+ ],
+ [
+ 4,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 32,
+ "clue" : "Stage of adolescence marked by physical changes",
+ "enumeration" : "7",
+ "cells" : [
+ [
+ 8,
+ 14
+ ],
+ [
+ 9,
+ 14
+ ],
+ [
+ 10,
+ 14
+ ],
+ [
+ 11,
+ 14
+ ],
+ [
+ 12,
+ 14
+ ],
+ [
+ 13,
+ 14
+ ],
+ [
+ 14,
+ 14
+ ]
+ ]
+ }
+ ],
+ "Down:Down" : [
+ {
+ "number" : 1,
+ "clue" : "Container for rolling bones in tabletop games",
+ "enumeration" : "7",
+ "cells" : [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ]
+ ]
+ },
+ {
+ "number" : 2,
+ "clue" : "Component of a canine anatomy",
+ "enumeration" : "7",
+ "cells" : [
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ]
+ ]
+ },
+ {
+ "number" : 3,
+ "clue" : "Not even; not divisible by two",
+ "enumeration" : "3",
+ "cells" : [
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ]
+ ]
+ },
+ {
+ "number" : 4,
+ "clue" : "Spy or undercover agent",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 6,
+ 0
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 6,
+ 2
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 6,
+ 4
+ ]
+ ]
+ },
+ {
+ "number" : 5,
+ "clue" : "Result of spending time in the sun without protection",
+ "enumeration" : "9",
+ "cells" : [
+ [
+ 8,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 8,
+ 8
+ ]
+ ]
+ },
+ {
+ "number" : 6,
+ "clue" : "Professional who buys and sells securities",
+ "enumeration" : "11",
+ "cells" : [
+ [
+ 10,
+ 0
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 10,
+ 5
+ ],
+ [
+ 10,
+ 6
+ ],
+ [
+ 10,
+ 7
+ ],
+ [
+ 10,
+ 8
+ ],
+ [
+ 10,
+ 9
+ ],
+ [
+ 10,
+ 10
+ ]
+ ]
+ },
+ {
+ "number" : 7,
+ "clue" : "Plural form of 'emeritus', denoting retired status",
+ "enumeration" : "7",
+ "cells" : [
+ [
+ 12,
+ 0
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 12,
+ 4
+ ],
+ [
+ 12,
+ 5
+ ],
+ [
+ 12,
+ 6
+ ]
+ ]
+ },
+ {
+ "number" : 8,
+ "clue" : "Child approaching adolescence",
+ "enumeration" : "7",
+ "cells" : [
+ [
+ 14,
+ 0
+ ],
+ [
+ 14,
+ 1
+ ],
+ [
+ 14,
+ 2
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 14,
+ 4
+ ],
+ [
+ 14,
+ 5
+ ],
+ [
+ 14,
+ 6
+ ]
+ ]
+ },
+ {
+ "number" : 14,
+ "clue" : "Musical rhythm with two beats per measure",
+ "enumeration" : "11",
+ "cells" : [
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 4,
+ 13
+ ],
+ [
+ 4,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 17,
+ "clue" : "High-performance motorcycle",
+ "enumeration" : "9",
+ "cells" : [
+ [
+ 6,
+ 6
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 6,
+ 10
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 6,
+ 12
+ ],
+ [
+ 6,
+ 13
+ ],
+ [
+ 6,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 18,
+ "clue" : "Blush or become visibly embarrassed",
+ "enumeration" : "7",
+ "cells" : [
+ [
+ 0,
+ 8
+ ],
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 19,
+ "clue" : "Type of traditional South Asian clothing",
+ "enumeration" : "7",
+ "cells" : [
+ [
+ 2,
+ 8
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 2,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 21,
+ "clue" : "Embarrassing mistake or error",
+ "enumeration" : "7",
+ "cells" : [
+ [
+ 12,
+ 8
+ ],
+ [
+ 12,
+ 9
+ ],
+ [
+ 12,
+ 10
+ ],
+ [
+ 12,
+ 11
+ ],
+ [
+ 12,
+ 12
+ ],
+ [
+ 12,
+ 13
+ ],
+ [
+ 12,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 22,
+ "clue" : "Fixed salary amount before bonuses or overtime",
+ "enumeration" : "7",
+ "cells" : [
+ [
+ 14,
+ 8
+ ],
+ [
+ 14,
+ 9
+ ],
+ [
+ 14,
+ 10
+ ],
+ [
+ 14,
+ 11
+ ],
+ [
+ 14,
+ 12
+ ],
+ [
+ 14,
+ 13
+ ],
+ [
+ 14,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 25,
+ "clue" : "Short, high-pitched sound made by a small bird",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 8,
+ 10
+ ],
+ [
+ 8,
+ 11
+ ],
+ [
+ 8,
+ 12
+ ],
+ [
+ 8,
+ 13
+ ],
+ [
+ 8,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 29,
+ "clue" : "Casual conversation or idle chatter",
+ "enumeration" : "3",
+ "cells" : [
+ [
+ 10,
+ 12
+ ],
+ [
+ 10,
+ 13
+ ],
+ [
+ 10,
+ 14
+ ]
+ ]
+ }
+ ]
+ }
+}
diff --git a/cwsample2.ipuz b/cwsample2.ipuz
new file mode 100644
index 0000000..921babf
--- /dev/null
+++ b/cwsample2.ipuz
@@ -0,0 +1,1689 @@
+{
+ "kind" : [
+ "http://ipuz.org/crossword#1",
+ "http://ipuz.org/crossword/crypticcrossword#1"
+ ],
+ "version" : "http://ipuz.org/v2",
+ "copyright" : "GW Puzzles",
+ "publisher" : "GW Puzzles",
+ "title" : "Cryptic Crossword",
+ "author" : "GW Puzzles",
+ "editor" : "GW Puzzles",
+ "date" : "2024-04-22",
+ "difficulty" : "Mixed",
+ "block" : "#",
+ "empty" : "0",
+ "dimensions" : {
+ "width" : 15,
+ "height" : 15
+ },
+ "showenumerations" : true,
+ "puzzle" : [
+ [
+ 1,
+ 0,
+ 2,
+ 0,
+ 3,
+ 0,
+ "#",
+ 4,
+ 5,
+ 0,
+ 6,
+ 0,
+ 7,
+ 0,
+ 8
+ ],
+ [
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ "#",
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0
+ ],
+ [
+ 9,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 10,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 11,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0
+ ],
+ [
+ 12,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 13,
+ 0,
+ 0,
+ 14,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ 0,
+ "#",
+ 0,
+ "#",
+ 15,
+ 0,
+ 0,
+ "#",
+ "#",
+ 0,
+ "#",
+ "#",
+ 0,
+ "#",
+ 0
+ ],
+ [
+ 16,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 17,
+ 0,
+ 18,
+ 0,
+ 19,
+ 0,
+ "#",
+ "#",
+ "#"
+ ],
+ [
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 20,
+ "#",
+ 21
+ ],
+ [
+ "#",
+ "#",
+ "#",
+ 22,
+ 0,
+ 23,
+ 0,
+ 0,
+ 0,
+ "#",
+ 24,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ 25,
+ "#",
+ 26,
+ "#",
+ "#",
+ 0,
+ "#",
+ "#",
+ 27,
+ 0,
+ 0,
+ "#",
+ 0,
+ "#",
+ 0
+ ],
+ [
+ 28,
+ 0,
+ 0,
+ 0,
+ 29,
+ 0,
+ 30,
+ 0,
+ 0,
+ "#",
+ 31,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0
+ ],
+ [
+ 32,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 33,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ "#",
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0
+ ],
+ [
+ 34,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 35,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ ],
+ "solution" : [
+ [
+ "H",
+ "A",
+ "M",
+ "L",
+ "I",
+ "N",
+ null,
+ "M",
+ "A",
+ "L",
+ "A",
+ "Y",
+ "A",
+ "N",
+ "S"
+ ],
+ [
+ "A",
+ null,
+ "A",
+ null,
+ "R",
+ null,
+ null,
+ null,
+ "L",
+ null,
+ "C",
+ null,
+ "R",
+ null,
+ "P"
+ ],
+ [
+ "P",
+ "I",
+ "C",
+ "K",
+ "O",
+ "N",
+ null,
+ "C",
+ "E",
+ "N",
+ "T",
+ "A",
+ "U",
+ "R",
+ "I"
+ ],
+ [
+ "P",
+ null,
+ "Y",
+ null,
+ "N",
+ null,
+ "F",
+ null,
+ "S",
+ null,
+ "O",
+ null,
+ "B",
+ null,
+ "T"
+ ],
+ [
+ "E",
+ "A",
+ "G",
+ "E",
+ "R",
+ null,
+ "A",
+ "L",
+ "I",
+ "E",
+ "N",
+ "R",
+ "A",
+ "C",
+ "E"
+ ],
+ [
+ "N",
+ null,
+ "R",
+ null,
+ "I",
+ "N",
+ "K",
+ null,
+ null,
+ "T",
+ null,
+ null,
+ "N",
+ null,
+ "D"
+ ],
+ [
+ "B",
+ "R",
+ "A",
+ "I",
+ "N",
+ null,
+ "E",
+ "L",
+ "E",
+ "C",
+ "T",
+ "S",
+ null,
+ null,
+ null
+ ],
+ [
+ "Y",
+ null,
+ "Y",
+ null,
+ "G",
+ null,
+ "I",
+ null,
+ "S",
+ null,
+ "V",
+ null,
+ "A",
+ null,
+ "N"
+ ],
+ [
+ null,
+ null,
+ null,
+ "T",
+ "S",
+ "K",
+ "T",
+ "S",
+ "K",
+ null,
+ "H",
+ "O",
+ "M",
+ "I",
+ "E"
+ ],
+ [
+ "A",
+ null,
+ "A",
+ null,
+ null,
+ "B",
+ null,
+ null,
+ "I",
+ "O",
+ "U",
+ null,
+ "E",
+ null,
+ "R"
+ ],
+ [
+ "V",
+ "A",
+ "L",
+ "V",
+ "E",
+ "S",
+ "T",
+ "E",
+ "M",
+ null,
+ "S",
+ "I",
+ "X",
+ "O",
+ "F"
+ ],
+ [
+ "A",
+ null,
+ "P",
+ null,
+ "G",
+ null,
+ "O",
+ null,
+ "O",
+ null,
+ "B",
+ null,
+ "C",
+ null,
+ "G"
+ ],
+ [
+ "T",
+ "A",
+ "I",
+ "L",
+ "G",
+ "A",
+ "T",
+ "E",
+ null,
+ "B",
+ "A",
+ "B",
+ "A",
+ "L",
+ "U"
+ ],
+ [
+ "A",
+ null,
+ "N",
+ null,
+ "E",
+ null,
+ "A",
+ null,
+ null,
+ null,
+ "N",
+ null,
+ "R",
+ null,
+ "N"
+ ],
+ [
+ "R",
+ "E",
+ "E",
+ "N",
+ "R",
+ "O",
+ "L",
+ "L",
+ null,
+ "A",
+ "D",
+ "I",
+ "D",
+ "A",
+ "S"
+ ]
+ ],
+ "clues" : {
+ "Across:Across" : [
+ {
+ "number" : 1,
+ "clue" : "Pied Piper's home hides rodents initially",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1,
+ 0
+ ],
+ [
+ 2,
+ 0
+ ],
+ [
+ 3,
+ 0
+ ],
+ [
+ 4,
+ 0
+ ],
+ [
+ 5,
+ 0
+ ]
+ ]
+ },
+ {
+ "number" : 4,
+ "clue" : "Asylum for laymen confused by these people",
+ "enumeration" : "8",
+ "cells" : [
+ [
+ 7,
+ 0
+ ],
+ [
+ 8,
+ 0
+ ],
+ [
+ 9,
+ 0
+ ],
+ [
+ 10,
+ 0
+ ],
+ [
+ 11,
+ 0
+ ],
+ [
+ 12,
+ 0
+ ],
+ [
+ 13,
+ 0
+ ],
+ [
+ 14,
+ 0
+ ]
+ ]
+ },
+ {
+ "number" : 9,
+ "clue" : "Choose to harass",
+ "enumeration" : "4,2",
+ "cells" : [
+ [
+ 0,
+ 2
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 5,
+ 2
+ ]
+ ]
+ },
+ {
+ "number" : 10,
+ "clue" : "One hundred stars within",
+ "enumeration" : "8",
+ "cells" : [
+ [
+ 7,
+ 2
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 14,
+ 2
+ ]
+ ]
+ },
+ {
+ "number" : 12,
+ "clue" : "Enthusiastic German goes around looking",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 0,
+ 4
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 3,
+ 4
+ ],
+ [
+ 4,
+ 4
+ ]
+ ]
+ },
+ {
+ "number" : 13,
+ "clue" : "Out of this world marathon ",
+ "enumeration" : "5,4",
+ "cells" : [
+ [
+ 6,
+ 4
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 8,
+ 4
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 10,
+ 4
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 12,
+ 4
+ ],
+ [
+ 13,
+ 4
+ ],
+ [
+ 14,
+ 4
+ ]
+ ]
+ },
+ {
+ "number" : 15,
+ "clue" : "Dark fluid within pen",
+ "enumeration" : "3",
+ "cells" : [
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 5
+ ],
+ [
+ 6,
+ 5
+ ]
+ ]
+ },
+ {
+ "number" : 16,
+ "clue" : "Mind contained within",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 0,
+ 6
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 4,
+ 6
+ ]
+ ]
+ },
+ {
+ "number" : 17,
+ "clue" : "Puts in the office",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 6,
+ 6
+ ],
+ [
+ 7,
+ 6
+ ],
+ [
+ 8,
+ 6
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 10,
+ 6
+ ],
+ [
+ 11,
+ 6
+ ]
+ ]
+ },
+ {
+ "number" : 22,
+ "clue" : "Tut twice for disapproval",
+ "enumeration" : "3,3",
+ "cells" : [
+ [
+ 3,
+ 8
+ ],
+ [
+ 4,
+ 8
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 6,
+ 8
+ ],
+ [
+ 7,
+ 8
+ ],
+ [
+ 8,
+ 8
+ ]
+ ]
+ },
+ {
+ "number" : 24,
+ "clue" : "Buddy returning home",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 10,
+ 8
+ ],
+ [
+ 11,
+ 8
+ ],
+ [
+ 12,
+ 8
+ ],
+ [
+ 13,
+ 8
+ ],
+ [
+ 14,
+ 8
+ ]
+ ]
+ },
+ {
+ "number" : 27,
+ "clue" : "Debt acknowledgment",
+ "enumeration" : "3",
+ "cells" : [
+ [
+ 8,
+ 9
+ ],
+ [
+ 9,
+ 9
+ ],
+ [
+ 10,
+ 9
+ ]
+ ]
+ },
+ {
+ "number" : 28,
+ "clue" : "Regulating fluid passage",
+ "enumeration" : "5,4",
+ "cells" : [
+ [
+ 0,
+ 10
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 4,
+ 10
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 6,
+ 10
+ ],
+ [
+ 7,
+ 10
+ ],
+ [
+ 8,
+ 10
+ ]
+ ]
+ },
+ {
+ "number" : 31,
+ "clue" : "Two of make a dozen",
+ "enumeration" : "3,2",
+ "cells" : [
+ [
+ 10,
+ 10
+ ],
+ [
+ 11,
+ 10
+ ],
+ [
+ 12,
+ 10
+ ],
+ [
+ 13,
+ 10
+ ],
+ [
+ 14,
+ 10
+ ]
+ ]
+ },
+ {
+ "number" : 32,
+ "clue" : "Follow closely",
+ "enumeration" : "8",
+ "cells" : [
+ [
+ 0,
+ 12
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 5,
+ 12
+ ],
+ [
+ 6,
+ 12
+ ],
+ [
+ 7,
+ 12
+ ]
+ ]
+ },
+ {
+ "number" : 33,
+ "clue" : "Musical tribute to Desi Arnaz's alter ego",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 9,
+ 12
+ ],
+ [
+ 10,
+ 12
+ ],
+ [
+ 11,
+ 12
+ ],
+ [
+ 12,
+ 12
+ ],
+ [
+ 13,
+ 12
+ ],
+ [
+ 14,
+ 12
+ ]
+ ]
+ },
+ {
+ "number" : 34,
+ "clue" : "Register again for classes",
+ "enumeration" : "8",
+ "cells" : [
+ [
+ 0,
+ 14
+ ],
+ [
+ 1,
+ 14
+ ],
+ [
+ 2,
+ 14
+ ],
+ [
+ 3,
+ 14
+ ],
+ [
+ 4,
+ 14
+ ],
+ [
+ 5,
+ 14
+ ],
+ [
+ 6,
+ 14
+ ],
+ [
+ 7,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 35,
+ "clue" : "All day I dream about something",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 9,
+ 14
+ ],
+ [
+ 10,
+ 14
+ ],
+ [
+ 11,
+ 14
+ ],
+ [
+ 12,
+ 14
+ ],
+ [
+ 13,
+ 14
+ ],
+ [
+ 14,
+ 14
+ ]
+ ]
+ }
+ ],
+ "Down:Down" : [
+ {
+ "number" : 1,
+ "clue" : "Occur close to this vicinity",
+ "enumeration" : "6,2",
+ "cells" : [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 1
+ ],
+ [
+ 0,
+ 2
+ ],
+ [
+ 0,
+ 3
+ ],
+ [
+ 0,
+ 4
+ ],
+ [
+ 0,
+ 5
+ ],
+ [
+ 0,
+ 6
+ ],
+ [
+ 0,
+ 7
+ ]
+ ]
+ },
+ {
+ "number" : 2,
+ "clue" : "Singer's shades might leave you puzzled",
+ "enumeration" : "4,4",
+ "cells" : [
+ [
+ 2,
+ 0
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 2,
+ 4
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 2,
+ 6
+ ],
+ [
+ 2,
+ 7
+ ]
+ ]
+ },
+ {
+ "number" : 3,
+ "clue" : "Bands for strong promises",
+ "enumeration" : "4,5",
+ "cells" : [
+ [
+ 4,
+ 0
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 4,
+ 2
+ ],
+ [
+ 4,
+ 3
+ ],
+ [
+ 4,
+ 4
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 4,
+ 6
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 4,
+ 8
+ ]
+ ]
+ },
+ {
+ "number" : 5,
+ "clue" : "Aisle scrambled to find French racing driver",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 8,
+ 0
+ ],
+ [
+ 8,
+ 1
+ ],
+ [
+ 8,
+ 2
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 8,
+ 4
+ ]
+ ]
+ },
+ {
+ "number" : 6,
+ "clue" : "Performance is on",
+ "enumeration" : "3,2",
+ "cells" : [
+ [
+ 10,
+ 0
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 10,
+ 2
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 10,
+ 4
+ ]
+ ]
+ },
+ {
+ "number" : 7,
+ "clue" : "Islander turned right before noon",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 12,
+ 0
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 12,
+ 2
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 12,
+ 4
+ ],
+ [
+ 12,
+ 5
+ ]
+ ]
+ },
+ {
+ "number" : 8,
+ "clue" : "Deliberately upset the redhead",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 14,
+ 0
+ ],
+ [
+ 14,
+ 1
+ ],
+ [
+ 14,
+ 2
+ ],
+ [
+ 14,
+ 3
+ ],
+ [
+ 14,
+ 4
+ ],
+ [
+ 14,
+ 5
+ ]
+ ]
+ },
+ {
+ "number" : 11,
+ "clue" : "Keep busy before the win",
+ "enumeration" : "4,2",
+ "cells" : [
+ [
+ 6,
+ 3
+ ],
+ [
+ 6,
+ 4
+ ],
+ [
+ 6,
+ 5
+ ],
+ [
+ 6,
+ 6
+ ],
+ [
+ 6,
+ 7
+ ],
+ [
+ 6,
+ 8
+ ]
+ ]
+ },
+ {
+ "number" : 14,
+ "clue" : "And so forth, endlessly",
+ "enumeration" : "3",
+ "cells" : [
+ [
+ 9,
+ 4
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 9,
+ 6
+ ]
+ ]
+ },
+ {
+ "number" : 18,
+ "clue" : "Northern folk missing out on summer, perhaps",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 8,
+ 6
+ ],
+ [
+ 8,
+ 7
+ ],
+ [
+ 8,
+ 8
+ ],
+ [
+ 8,
+ 9
+ ],
+ [
+ 8,
+ 10
+ ],
+ [
+ 8,
+ 11
+ ]
+ ]
+ },
+ {
+ "number" : 19,
+ "clue" : "Small screen spouse",
+ "enumeration" : "2,7",
+ "cells" : [
+ [
+ 10,
+ 6
+ ],
+ [
+ 10,
+ 7
+ ],
+ [
+ 10,
+ 8
+ ],
+ [
+ 10,
+ 9
+ ],
+ [
+ 10,
+ 10
+ ],
+ [
+ 10,
+ 11
+ ],
+ [
+ 10,
+ 12
+ ],
+ [
+ 10,
+ 13
+ ],
+ [
+ 10,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 20,
+ "clue" : "Plastic payment from American Express",
+ "enumeration" : "4,4",
+ "cells" : [
+ [
+ 12,
+ 7
+ ],
+ [
+ 12,
+ 8
+ ],
+ [
+ 12,
+ 9
+ ],
+ [
+ 12,
+ 10
+ ],
+ [
+ 12,
+ 11
+ ],
+ [
+ 12,
+ 12
+ ],
+ [
+ 12,
+ 13
+ ],
+ [
+ 12,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 21,
+ "clue" : "Playthings for safe battles",
+ "enumeration" : "4,4",
+ "cells" : [
+ [
+ 14,
+ 7
+ ],
+ [
+ 14,
+ 8
+ ],
+ [
+ 14,
+ 9
+ ],
+ [
+ 14,
+ 10
+ ],
+ [
+ 14,
+ 11
+ ],
+ [
+ 14,
+ 12
+ ],
+ [
+ 14,
+ 13
+ ],
+ [
+ 14,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 23,
+ "clue" : "South Korean broadcasting company",
+ "enumeration" : "3",
+ "cells" : [
+ [
+ 5,
+ 8
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 5,
+ 10
+ ]
+ ]
+ },
+ {
+ "number" : 25,
+ "clue" : "Virtual representation of self",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 0,
+ 9
+ ],
+ [
+ 0,
+ 10
+ ],
+ [
+ 0,
+ 11
+ ],
+ [
+ 0,
+ 12
+ ],
+ [
+ 0,
+ 13
+ ],
+ [
+ 0,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 26,
+ "clue" : "Relating to high mountain regions",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 2,
+ 9
+ ],
+ [
+ 2,
+ 10
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 2,
+ 12
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 2,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 29,
+ "clue" : "Attacks houses on halloween",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 4,
+ 10
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 4,
+ 12
+ ],
+ [
+ 4,
+ 13
+ ],
+ [
+ 4,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 30,
+ "clue" : "Add everything up",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 6,
+ 10
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 6,
+ 12
+ ],
+ [
+ 6,
+ 13
+ ],
+ [
+ 6,
+ 14
+ ]
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/cwsample3.ipuz b/cwsample3.ipuz
new file mode 100644
index 0000000..c662775
--- /dev/null
+++ b/cwsample3.ipuz
@@ -0,0 +1,1512 @@
+{
+ "kind" : [
+ "http://ipuz.org/crossword#1",
+ "http://ipuz.org/crossword/crypticcrossword#1"
+ ],
+ "version" : "http://ipuz.org/v2",
+ "copyright" : "GW Puzzles",
+ "publisher" : "GW Puzzles",
+ "title" : "Cryptic Crossword",
+ "author" : "GW Puzzles",
+ "date" : "2024-04-22",
+ "difficulty" : "Mixed",
+ "block" : "#",
+ "empty" : "0",
+ "dimensions" : {
+ "width" : 15,
+ "height" : 15
+ },
+ "showenumerations" : true,
+ "puzzle" : [
+ [
+ "#",
+ 1,
+ "#",
+ 2,
+ "#",
+ 3,
+ "#",
+ 4,
+ "#",
+ 5,
+ "#",
+ 6,
+ "#",
+ 7,
+ "#"
+ ],
+ [
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 9,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#"
+ ],
+ [
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#"
+ ],
+ [
+ 10,
+ 0,
+ 0,
+ 0,
+ "#",
+ 11,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ "#",
+ 0,
+ "#",
+ "#",
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#"
+ ],
+ [
+ 12,
+ 0,
+ 0,
+ 13,
+ 0,
+ 0,
+ "#",
+ 14,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ "#",
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ "#",
+ "#"
+ ],
+ [
+ 15,
+ 0,
+ 0,
+ 0,
+ 0,
+ 16,
+ 0,
+ "#",
+ 17,
+ 0,
+ 0,
+ 0,
+ 0,
+ 18,
+ 0
+ ],
+ [
+ "#",
+ "#",
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 19,
+ "#",
+ "#",
+ "#",
+ 0,
+ "#",
+ 0,
+ "#"
+ ],
+ [
+ 20,
+ 21,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 22,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ "#",
+ "#",
+ 0,
+ "#"
+ ],
+ [
+ 23,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 24,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#"
+ ],
+ [
+ "#",
+ 25,
+ 0,
+ 0,
+ 0,
+ 0,
+ "#",
+ 26,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ [
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#",
+ 0,
+ "#"
+ ]
+ ],
+ "solution" : [
+ [
+ null,
+ "T",
+ null,
+ "S",
+ null,
+ "O",
+ null,
+ "A",
+ null,
+ "O",
+ null,
+ "O",
+ null,
+ "C",
+ null
+ ],
+ [
+ "L",
+ "U",
+ "C",
+ "K",
+ "Y",
+ "D",
+ "O",
+ "G",
+ null,
+ "B",
+ "E",
+ "N",
+ "C",
+ "H",
+ null
+ ],
+ [
+ null,
+ "B",
+ null,
+ "A",
+ null,
+ "E",
+ null,
+ "R",
+ null,
+ "O",
+ null,
+ "E",
+ null,
+ "O",
+ null
+ ],
+ [
+ "F",
+ "A",
+ "R",
+ "T",
+ null,
+ "S",
+ "C",
+ "E",
+ "N",
+ "E",
+ "S",
+ "H",
+ "O",
+ "P",
+ "S"
+ ],
+ [
+ null,
+ "M",
+ null,
+ null,
+ null,
+ "S",
+ null,
+ "E",
+ null,
+ "R",
+ null,
+ "I",
+ null,
+ "R",
+ null
+ ],
+ [
+ "M",
+ "U",
+ "R",
+ "I",
+ "C",
+ "A",
+ null,
+ "T",
+ "R",
+ "E",
+ "A",
+ "T",
+ "B",
+ "A",
+ "G"
+ ],
+ [
+ null,
+ "T",
+ null,
+ "N",
+ null,
+ null,
+ null,
+ "O",
+ null,
+ "E",
+ null,
+ "K",
+ null,
+ null,
+ null
+ ],
+ [
+ "S",
+ "E",
+ "L",
+ "F",
+ "I",
+ "E",
+ "S",
+ null,
+ "H",
+ "D",
+ "M",
+ "I",
+ "O",
+ "U",
+ "T"
+ ],
+ [
+ null,
+ null,
+ null,
+ "L",
+ null,
+ "X",
+ null,
+ "I",
+ null,
+ null,
+ null,
+ "L",
+ null,
+ "N",
+ null
+ ],
+ [
+ "G",
+ "R",
+ "O",
+ "U",
+ "P",
+ "O",
+ "N",
+ "S",
+ null,
+ "U",
+ "N",
+ "L",
+ "E",
+ "S",
+ "S"
+ ],
+ [
+ null,
+ "O",
+ null,
+ "E",
+ null,
+ "M",
+ null,
+ "E",
+ null,
+ "P",
+ null,
+ null,
+ null,
+ "P",
+ null
+ ],
+ [
+ "A",
+ "B",
+ "A",
+ "N",
+ "D",
+ "O",
+ "N",
+ "E",
+ "E",
+ "S",
+ null,
+ "A",
+ "T",
+ "O",
+ "M"
+ ],
+ [
+ null,
+ "L",
+ null,
+ "C",
+ null,
+ "O",
+ null,
+ "N",
+ null,
+ "I",
+ null,
+ "C",
+ null,
+ "K",
+ null
+ ],
+ [
+ null,
+ "O",
+ "C",
+ "E",
+ "A",
+ "N",
+ null,
+ "O",
+ "N",
+ "E",
+ "L",
+ "I",
+ "T",
+ "E",
+ "R"
+ ],
+ [
+ null,
+ "X",
+ null,
+ "R",
+ null,
+ "S",
+ null,
+ "W",
+ null,
+ "S",
+ null,
+ "D",
+ null,
+ "N",
+ null
+ ]
+ ],
+ "clues" : {
+ "Across:Across" : [
+ {
+ "number" : 8,
+ "clue" : "Fortunate canine",
+ "enumeration" : "5,3",
+ "cells" : [
+ [
+ 0,
+ 1
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 2,
+ 1
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 4,
+ 1
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 6,
+ 1
+ ],
+ [
+ 7,
+ 1
+ ]
+ ]
+ },
+ {
+ "number" : 9,
+ "clue" : "Take a seat at the gym",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 9,
+ 1
+ ],
+ [
+ 10,
+ 1
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 12,
+ 1
+ ],
+ [
+ 13,
+ 1
+ ]
+ ]
+ },
+ {
+ "number" : 10,
+ "clue" : "Noisy escape from rear",
+ "enumeration" : "4",
+ "cells" : [
+ [
+ 0,
+ 3
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 2,
+ 3
+ ],
+ [
+ 3,
+ 3
+ ]
+ ]
+ },
+ {
+ "number" : 11,
+ "clue" : "Displays settings for dramas",
+ "enumeration" : "5,5",
+ "cells" : [
+ [
+ 5,
+ 3
+ ],
+ [
+ 6,
+ 3
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 8,
+ 3
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 10,
+ 3
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 12,
+ 3
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 14,
+ 3
+ ]
+ ]
+ },
+ {
+ "number" : 12,
+ "clue" : "America slang twisted in rum",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 0,
+ 5
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 2,
+ 5
+ ],
+ [
+ 3,
+ 5
+ ],
+ [
+ 4,
+ 5
+ ],
+ [
+ 5,
+ 5
+ ]
+ ]
+ },
+ {
+ "number" : 14,
+ "clue" : "Candy container for goodie exchange",
+ "enumeration" : "5,3",
+ "cells" : [
+ [
+ 7,
+ 5
+ ],
+ [
+ 8,
+ 5
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 10,
+ 5
+ ],
+ [
+ 11,
+ 5
+ ],
+ [
+ 12,
+ 5
+ ],
+ [
+ 13,
+ 5
+ ],
+ [
+ 14,
+ 5
+ ]
+ ]
+ },
+ {
+ "number" : 15,
+ "clue" : "Narcissistic shots left on phone",
+ "enumeration" : "7",
+ "cells" : [
+ [
+ 0,
+ 7
+ ],
+ [
+ 1,
+ 7
+ ],
+ [
+ 2,
+ 7
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 4,
+ 7
+ ],
+ [
+ 5,
+ 7
+ ],
+ [
+ 6,
+ 7
+ ]
+ ]
+ },
+ {
+ "number" : 17,
+ "clue" : "Exit for high-definition connection",
+ "enumeration" : "4,3",
+ "cells" : [
+ [
+ 8,
+ 7
+ ],
+ [
+ 9,
+ 7
+ ],
+ [
+ 10,
+ 7
+ ],
+ [
+ 11,
+ 7
+ ],
+ [
+ 12,
+ 7
+ ],
+ [
+ 13,
+ 7
+ ],
+ [
+ 14,
+ 7
+ ]
+ ]
+ },
+ {
+ "number" : 20,
+ "clue" : "Discounts for gatherings",
+ "enumeration" : "8",
+ "cells" : [
+ [
+ 0,
+ 9
+ ],
+ [
+ 1,
+ 9
+ ],
+ [
+ 2,
+ 9
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 4,
+ 9
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 6,
+ 9
+ ],
+ [
+ 7,
+ 9
+ ]
+ ]
+ },
+ {
+ "number" : 22,
+ "clue" : "Except if no less",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 9,
+ 9
+ ],
+ [
+ 10,
+ 9
+ ],
+ [
+ 11,
+ 9
+ ],
+ [
+ 12,
+ 9
+ ],
+ [
+ 13,
+ 9
+ ],
+ [
+ 14,
+ 9
+ ]
+ ]
+ },
+ {
+ "number" : 23,
+ "clue" : "Those left deserted in need",
+ "enumeration" : "10",
+ "cells" : [
+ [
+ 0,
+ 11
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 2,
+ 11
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 4,
+ 11
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 6,
+ 11
+ ],
+ [
+ 7,
+ 11
+ ],
+ [
+ 8,
+ 11
+ ],
+ [
+ 9,
+ 11
+ ]
+ ]
+ },
+ {
+ "number" : 24,
+ "clue" : "Particle in matter",
+ "enumeration" : "4",
+ "cells" : [
+ [
+ 11,
+ 11
+ ],
+ [
+ 12,
+ 11
+ ],
+ [
+ 13,
+ 11
+ ],
+ [
+ 14,
+ 11
+ ]
+ ]
+ },
+ {
+ "number" : 25,
+ "clue" : "Vast expanse of water",
+ "enumeration" : "5",
+ "cells" : [
+ [
+ 1,
+ 13
+ ],
+ [
+ 2,
+ 13
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 4,
+ 13
+ ],
+ [
+ 5,
+ 13
+ ]
+ ]
+ },
+ {
+ "number" : 26,
+ "clue" : "Bottle size for liquid measure",
+ "enumeration" : "3,5",
+ "cells" : [
+ [
+ 7,
+ 13
+ ],
+ [
+ 8,
+ 13
+ ],
+ [
+ 9,
+ 13
+ ],
+ [
+ 10,
+ 13
+ ],
+ [
+ 11,
+ 13
+ ],
+ [
+ 12,
+ 13
+ ],
+ [
+ 13,
+ 13
+ ],
+ [
+ 14,
+ 13
+ ]
+ ]
+ }
+ ],
+ "Down:Down" : [
+ {
+ "number" : 1,
+ "clue" : "Silence horn instrument in bathroom",
+ "enumeration" : "4,4",
+ "cells" : [
+ [
+ 1,
+ 0
+ ],
+ [
+ 1,
+ 1
+ ],
+ [
+ 1,
+ 2
+ ],
+ [
+ 1,
+ 3
+ ],
+ [
+ 1,
+ 4
+ ],
+ [
+ 1,
+ 5
+ ],
+ [
+ 1,
+ 6
+ ],
+ [
+ 1,
+ 7
+ ]
+ ]
+ },
+ {
+ "number" : 2,
+ "clue" : "Card game at the bar",
+ "enumeration" : "4",
+ "cells" : [
+ [
+ 3,
+ 0
+ ],
+ [
+ 3,
+ 1
+ ],
+ [
+ 3,
+ 2
+ ],
+ [
+ 3,
+ 3
+ ]
+ ]
+ },
+ {
+ "number" : 3,
+ "clue" : "City's ode's initial letter",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 5,
+ 0
+ ],
+ [
+ 5,
+ 1
+ ],
+ [
+ 5,
+ 2
+ ],
+ [
+ 5,
+ 3
+ ],
+ [
+ 5,
+ 4
+ ],
+ [
+ 5,
+ 5
+ ]
+ ]
+ },
+ {
+ "number" : 4,
+ "clue" : "Concur with total chaos",
+ "enumeration" : "5,2",
+ "cells" : [
+ [
+ 7,
+ 0
+ ],
+ [
+ 7,
+ 1
+ ],
+ [
+ 7,
+ 2
+ ],
+ [
+ 7,
+ 3
+ ],
+ [
+ 7,
+ 4
+ ],
+ [
+ 7,
+ 5
+ ],
+ [
+ 7,
+ 6
+ ]
+ ]
+ },
+ {
+ "number" : 5,
+ "clue" : "Wind instrument is back in dense fog",
+ "enumeration" : "4,4",
+ "cells" : [
+ [
+ 9,
+ 0
+ ],
+ [
+ 9,
+ 1
+ ],
+ [
+ 9,
+ 2
+ ],
+ [
+ 9,
+ 3
+ ],
+ [
+ 9,
+ 4
+ ],
+ [
+ 9,
+ 5
+ ],
+ [
+ 9,
+ 6
+ ],
+ [
+ 9,
+ 7
+ ]
+ ]
+ },
+ {
+ "number" : 6,
+ "clue" : "Single strike ends existence",
+ "enumeration" : "3,3,4",
+ "cells" : [
+ [
+ 11,
+ 0
+ ],
+ [
+ 11,
+ 1
+ ],
+ [
+ 11,
+ 2
+ ],
+ [
+ 11,
+ 3
+ ],
+ [
+ 11,
+ 4
+ ],
+ [
+ 11,
+ 5
+ ],
+ [
+ 11,
+ 6
+ ],
+ [
+ 11,
+ 7
+ ],
+ [
+ 11,
+ 8
+ ],
+ [
+ 11,
+ 9
+ ]
+ ]
+ },
+ {
+ "number" : 7,
+ "clue" : "Deepak cooks rice dish",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 13,
+ 0
+ ],
+ [
+ 13,
+ 1
+ ],
+ [
+ 13,
+ 2
+ ],
+ [
+ 13,
+ 3
+ ],
+ [
+ 13,
+ 4
+ ],
+ [
+ 13,
+ 5
+ ]
+ ]
+ },
+ {
+ "number" : 13,
+ "clue" : "Social media star's flu epidemic",
+ "enumeration" : "10",
+ "cells" : [
+ [
+ 3,
+ 5
+ ],
+ [
+ 3,
+ 6
+ ],
+ [
+ 3,
+ 7
+ ],
+ [
+ 3,
+ 8
+ ],
+ [
+ 3,
+ 9
+ ],
+ [
+ 3,
+ 10
+ ],
+ [
+ 3,
+ 11
+ ],
+ [
+ 3,
+ 12
+ ],
+ [
+ 3,
+ 13
+ ],
+ [
+ 3,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 16,
+ "clue" : "Satellites outside Earth",
+ "enumeration" : "3,5",
+ "cells" : [
+ [
+ 5,
+ 7
+ ],
+ [
+ 5,
+ 8
+ ],
+ [
+ 5,
+ 9
+ ],
+ [
+ 5,
+ 10
+ ],
+ [
+ 5,
+ 11
+ ],
+ [
+ 5,
+ 12
+ ],
+ [
+ 5,
+ 13
+ ],
+ [
+ 5,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 18,
+ "clue" : "Silence broken on one",
+ "enumeration" : "8",
+ "cells" : [
+ [
+ 13,
+ 7
+ ],
+ [
+ 13,
+ 8
+ ],
+ [
+ 13,
+ 9
+ ],
+ [
+ 13,
+ 10
+ ],
+ [
+ 13,
+ 11
+ ],
+ [
+ 13,
+ 12
+ ],
+ [
+ 13,
+ 13
+ ],
+ [
+ 13,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 19,
+ "clue" : "Realization of present situation",
+ "enumeration" : "1,3,3",
+ "cells" : [
+ [
+ 7,
+ 8
+ ],
+ [
+ 7,
+ 9
+ ],
+ [
+ 7,
+ 10
+ ],
+ [
+ 7,
+ 11
+ ],
+ [
+ 7,
+ 12
+ ],
+ [
+ 7,
+ 13
+ ],
+ [
+ 7,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 21,
+ "clue" : "Build bricks online",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 1,
+ 9
+ ],
+ [
+ 1,
+ 10
+ ],
+ [
+ 1,
+ 11
+ ],
+ [
+ 1,
+ 12
+ ],
+ [
+ 1,
+ 13
+ ],
+ [
+ 1,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 22,
+ "clue" : "Lifting toddlers",
+ "enumeration" : "6",
+ "cells" : [
+ [
+ 9,
+ 9
+ ],
+ [
+ 9,
+ 10
+ ],
+ [
+ 9,
+ 11
+ ],
+ [
+ 9,
+ 12
+ ],
+ [
+ 9,
+ 13
+ ],
+ [
+ 9,
+ 14
+ ]
+ ]
+ },
+ {
+ "number" : 24,
+ "clue" : "Sour substance with it",
+ "enumeration" : "4",
+ "cells" : [
+ [
+ 11,
+ 11
+ ],
+ [
+ 11,
+ 12
+ ],
+ [
+ 11,
+ 13
+ ],
+ [
+ 11,
+ 14
+ ]
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file