var u,v,w,TAB;
var r = new Array(9);
var s = new Array(9);
var t = new Array(81);
for(u=0;u<9;u++)
{
 r[u] = new Array(9);
 s[u] = new Array(9);
}
for(u=0;u<9;u++)
{
 for(v=0;v<9;v++)
 {
  s[u][v] = new Array();
 }
}
for(u=0;u<9;u++)
{
 for(v=0;v<9;v++)
 {
  for(w=0;w<9;w++)
  {
   s[u][v][w] = w+1;
  }
 }
}

function setpage()
{
 intropuzzle();
}

function resetgrid()
{
 var u,v,w;
 for(u=0;u<9;u++)
 {
  for(v=0;v<9;v++)
  {
   s[u][v] = new Array();
  }
 }
 for(u=0;u<9;u++)
 {
  for(v=0;v<9;v++)
  {
   s[u][v].length = 9;
   for(w=0;w<9;w++)
   {
    s[u][v][w] = w+1;
   }
  }
 }
}

function range(n)
{
   var v = document.puzzle[n].value;
   if((v!=1)&&(v!=2)&&(v!=3)&&(v!=4)&&(v!=5)&&(v!=6)&&(v!=7)&&(v!=8)&&(v!=9))
    {
     document.puzzle[n].value = '';
    }
  var n = 0;
    for(var i=0; i<9; i++)
     {
       for(var j=0; j<9; j++)
        {  
	 if((document.puzzle[n].style.color=='red')&&(document.puzzle[n].value==m[i][j]))
          {document.puzzle[n].style.color = 'blue';}
           n++;
        }
     }
}

function clearall()
{
 var i=0;
 for(i;i<81;i++)
  {
   document.puzzle[i].value = '';
   document.puzzle[i].style.color = 'black';
   document.puzzle[i].readOnly = false;
  }
}

function clearanswers()
{
 var i=0;
 for(i;i<81;i++)
  {
   if(document.puzzle[i].style.color=='blue'||document.puzzle[i].style.color=='gray')
    {
     document.puzzle[i].value = '';
     document.puzzle[i].style.color = 'blue';
    }
  }
}

function intropuzzle()
{
 clearall();
 document.puzzle[1].value = 1;
 document.puzzle[2].value = 8;
 document.puzzle[3].value = 3;
 document.puzzle[5].value = 2;
 document.puzzle[6].value = 6;
 document.puzzle[7].value = 4;
 document.puzzle[9].value = 5;
 document.puzzle[13].value = 8;
 document.puzzle[17].value = 2;
 document.puzzle[22].value = 9;
 document.puzzle[27].value = 1;
 document.puzzle[28].value = 8;
 document.puzzle[34].value = 6;
 document.puzzle[35].value = 3;
 document.puzzle[37].value = 4;
 document.puzzle[38].value = 3;
 document.puzzle[40].value = 6;
 document.puzzle[42].value = 1;
 document.puzzle[43].value = 5;
 document.puzzle[45].value = 2;
 document.puzzle[46].value = 7;
 document.puzzle[52].value = 9;
 document.puzzle[53].value = 8;
 document.puzzle[58].value = 3;
 document.puzzle[63].value = 8;
 document.puzzle[67].value = 7;
 document.puzzle[71].value = 5;
 document.puzzle[73].value = 5;
 document.puzzle[74].value = 4;
 document.puzzle[75].value = 8;
 document.puzzle[77].value = 9;
 document.puzzle[78].value = 7;
 document.puzzle[79].value = 1;
 setblanksblue();
}

function setblanksblue()
{
 var i=0;
 for(i;i<81;i++)
  {
   if(document.puzzle[i].value == '')
    {
     document.puzzle[i].style.color = 'blue';
     document.puzzle[i].readOnly = false;
    }
  }
}

function solve()
{
 resetgrid();
 var u,v,w;
 solve6star();
 var i=0;
 for(i;i<81;i++)
 {
  if(document.puzzle[i].value == '')
  alert("Solver did not find a solution, either because it was an invalid puzzle or it was too advanced. Please contact the webmaster at the above email address.");
  break;
 }
}

//This is the beginning of the solve1star family of functions

function remove(i,j,k)
{
 var g,h,l;
    for(l=0;l<9;l++)
    {
     if(l!=j)
     {
      s[i][l][k-1] = null;//removes any other instances of that number in same row
     }
     if(l!=i)
     {
      s[l][j][k-1] = null;//removes any other instances of that number in same column
     }
    }
//removes any other instances of that number in same box
    if((0<=i)&&(i<=2)&&(0<=j)&&(j<=2))
    {
     for(g=0;g<3;g++)
     {
      for(h=0;h<3;h++)
      {
       if((g!=i)&&(h!=j))
       {
	s[g][h][k-1] = null;
       }
      }
     }
    }
    else if((0<=i)&&(i<=2)&&(3<=j)&&(j<=5))
    {
     for(g=0;g<3;g++)
     {
      for(h=3;h<6;h++)
      {
       if((g!=i)&&(h!=j))
       {
	s[g][h][k-1] = null;
       }
      }
     }
    }
    else if((0<=i)&&(i<=2)&&(6<=j)&&(j<=8))
    {
     for(g=0;g<3;g++)
     {
      for(h=6;h<9;h++)
      {
       if((g!=i)&&(h!=j))
       {
	s[g][h][k-1] = null;
       }
      }
     }
    }
    else if((3<=i)&&(i<=5)&&(0<=j)&&(j<=2))
    {
     for(g=3;g<6;g++)
     {
      for(h=0;h<3;h++)
      {
       if((g!=i)&&(h!=j))
       {
	s[g][h][k-1] = null;
       }
      }
     }
    }
    else if((3<=i)&&(i<=5)&&(3<=j)&&(j<=5))
    {
     for(g=3;g<6;g++)
     {
      for(h=3;h<6;h++)
      {
       if((g!=i)&&(h!=j))
       {
	s[g][h][k-1] = null;
       }
      }
     }
    }
    else if((3<=i)&&(i<=5)&&(6<=j)&&(j<=8))
    {
     for(g=3;g<6;g++)
     {
      for(h=6;h<9;h++)
      {
       if((g!=i)&&(h!=j))
       {
	s[g][h][k-1] = null;
       }
      }
     }
    }
    else if((6<=i)&&(i<=8)&&(0<=j)&&(j<=2))
    {
     for(g=6;g<9;g++)
     {
      for(h=0;h<3;h++)
      {
       if((g!=i)&&(h!=j))
       {
	s[g][h][k-1] = null;
       }
      }
     }
    }
    else if((6<=i)&&(i<=8)&&(3<=j)&&(j<=5))
    {
     for(g=6;g<9;g++)
     {
      for(h=3;h<6;h++)
      {
       if((g!=i)&&(h!=j))
       {
	s[g][h][k-1] = null;
       }
      }
     }
    }
    else if((6<=i)&&(i<=8)&&(6<=j)&&(j<=8))
    {
     for(g=6;g<9;g++)
     {
      for(h=6;h<9;h++)
      {
       if((g!=i)&&(h!=j))
       {
	s[g][h][k-1] = null;
       }
      }
     }
    }
}


function solve1star()
{
 var a,b,c,count,g,h,i,j,k,l,n,u,v,w,x,y,z,nullcount;
 var n = 0;
 for(i=0;i<9;i++)
 {
  for(j=0;j<9;j++)
  {
   if(document.puzzle[n].value == '')
    {r[i][j] = null;}
   else
    {r[i][j] = document.puzzle[n].value;}
   n++;
  }
 }

 for(i=0;i<9;i++)
 {
  for(j=0;j<9;j++)
  {
   if(r[i][j]!=null)//if this cell contains a starting number, do the following
   {
    s[i][j] = r[i][j];//resets that array to the single value
    remove(i,j,r[i][j]);
   }//end of if-null statement
  }
 }//end of for loop enclosing if-null statement
 for(x=0;x<8;x++)
 {
  for(i=0;i<9;i++)//find new singles and reset array to that single value
  {
   for(j=0;j<9;j++)
   {
    if(s[i][j].length==9)
    {
     nullcount = 0;
     for(k=0;k<9;k++)
     {
      if(s[i][j][k]==null)
       nullcount++;
      else
       n = s[i][j][k];
     }
     if(nullcount==8)
     {
      s[i][j] = n;
      remove(i,j,s[i][j]);
     }
    }
   }
  }
 }
 n = 0;
 for(i=0;i<9;i++)
 {
  for(j=0;j<9;j++)
  {
   if((document.puzzle[n].value=='')&&(s[i][j].length!=9))
   {
    document.puzzle[n].style.color = 'blue';
    document.puzzle[n].value = s[i][j];
   }
   n++;
  }
 }
}//end of solve1star

//here begins the solve2star family of functions

function con(i,j)
{
 var a = new Array(1);
 var b = new Array(1);
 var c;// = new Array(2);
 a[0] = i;
 b[0] = j;
 c = a.concat(b);
 return c;
}

function boxsingle(w,x,y,z)
{
 var a,b,c,i,j;
 var nb = new Array(2);
 for(i=0;i<2;i++)
 {
  nb[i] = new Array(9);//set up 2D array for tracking single occurrences in a row or column
 }
 for(b=0;b<2;b++)
 {
  for(c=0;c<9;c++)
  {
   nb[b][c] = 0;
  }
 }
 for(i=w;i<x;i++)
 {
  for(j=y;j<z;j++)
  {
   if(s[i][j].length==9)
   {
    for(k=0;k<9;k++)
    {
     if(s[i][j][k]!=null)
     {
      nb[0][k]++;//count occurrences
      if(nb[0][k]==1)
       nb[1][k] = con(i,j);//track cell with 1st occurrence - concatenate addresses
     }//if
    }//k
   }//if
  }//j
 }//i
 for(a=0;a<9;a++)
 {
  if(nb[0][a]==1)
  {
   s[nb[1][a].slice(0,1)][nb[1][a].slice(1)] = a+1;//separate concatenated address
   remove(nb[1][a].slice(0,1),nb[1][a].slice(1),s[nb[1][a].slice(0,1)][nb[1][a].slice(1)]);
  }
 }
}

function findisingler()
{
 var a,b,c,i,j,k;
 var nb = new Array(2);
 for(i=0;i<2;i++)
 {
  nb[i] = new Array(9);//set up 2D array for tracking single occurrences in a row or column
 }
 var bx = new Array(3);
 for(i=0;i<3;i++)
 {
  bx[i] = new Array(3);//set up 2D array for tracking location of single occurrences in a box
 }
   for(i=0;i<9;i++)
   {
    for(b=0;b<2;b++)
    {
     for(c=0;c<9;c++)
     {
      nb[b][c] = 0;
     }
    }
    for(j=0;j<9;j++)
    {
     if(s[i][j].length==9)
     {
      for(k=0;k<9;k++)
      {
       if(s[i][j][k]!=null)
       {
        nb[0][k]++;//count occurrences
        if(nb[0][k]==1)
         nb[1][k] = j;//track column with 1st occurrence
       }//if
      }//k
     }//if
    }//j
    for(a=0;a<9;a++)
    {
     if(nb[0][a]==1)
     {
      s[i][nb[1][a]] = a+1;//if only 1 occurrence of a #, set to that #
      remove(i,nb[1][a],s[i][nb[1][a]]);
     }
    }
   }//end of i
}

function findisinglec()
{
 var a,b,c,i,j,k;
 var nb = new Array(2);
 for(i=0;i<2;i++)
 {
  nb[i] = new Array(9);//set up 2D array for tracking single occurrences in a row or column
 }
 var bx = new Array(3);
 for(i=0;i<3;i++)
 {
  bx[i] = new Array(3);//set up 2D array for tracking location of single occurrences in a box
 }
   for(j=0;j<9;j++)
   {
    for(b=0;b<2;b++)
    {
     for(c=0;c<9;c++)
     {
      nb[b][c] = 0;
     }
    }
    for(i=0;i<9;i++)
    {
     if(s[i][j].length==9)
     {
      for(k=0;k<9;k++)
      {
       if(s[i][j][k]!=null)
       {
        nb[0][k]++;//count occurrences
        if(nb[0][k]==1)
         nb[1][k] = i;//track row with 1st occurrence
       }//if
      }//k
     }//if
    }//i
    for(a=0;a<9;a++)
    {
     if(nb[0][a]==1)
     {
      s[nb[1][a]][j] = a+1;//if only 1 occurrence of a #, set to that #
      remove(nb[1][a],j,s[nb[1][a]][j]);
     }
    }
   }//j
}

function solve2star()//disguised singles
{
 var a,b,c,g,h,i,j,k,l,n,u,v,w,x,y,z,nullcount;
 var count = 0;
 for(z=0;z<3;z++)
 {
  solve1star();
  for(i=0;i<9;i++)//find new singles and reset array to that single value
  {
   for(j=0;j<9;j++)
   {
    if(s[i][j].length==9)
    {
     nullcount = 0;
     for(k=0;k<9;k++)
     {
      if(s[i][j][k]==null)
       nullcount++;
      else
       n = s[i][j][k];
     }
     if(nullcount==8)
     {
      s[i][j] = n;
      remove(i,j,s[i][j]);//removes all other instances of that number from related row, column & box
     }
    }
   }
  }//end of i
  findisingler();
  findisinglec();
  boxsingle(0,3,0,3);
  boxsingle(0,3,3,6);
  boxsingle(0,3,6,9);
  boxsingle(3,6,0,3);
  boxsingle(3,6,3,6);
  boxsingle(3,6,6,9);
  boxsingle(6,9,0,3);
  boxsingle(6,9,3,6);
  boxsingle(6,9,6,9);
 }//end of z
 n = 0;
 for(i=0;i<9;i++)
 {
  for(j=0;j<9;j++)
  {
   if((document.puzzle[n].value=='')&&(s[i][j].length!=9))
   {
    document.puzzle[n].style.color = 'blue';
    document.puzzle[n].value = s[i][j];
   }
   n++;
  }
 }
}

//Here begins the solve3star family of functions (Chain Exclusion)

function clearfringesr(a,b,c,d,g)//chain exclusion
{
 var j,n;
 for(j=0;j<9;j++)
 {
  if((s[g][j].length==9)&&(j!=a)&&(j!=b))
  {
   for(n=0;n<9;n++)
   {
    if((s[g][j][n]==c)||(s[g][j][n]==d))
    {
     s[g][j][n] = null;
    }
   }
  }
 }
}

function chainxr()
{
 var a,b,c,d,g,k,n,twocount;
 var cx = new Array(3);
 for(i=0;i<3;i++)
 {
  cx[i] = new Array(9);//set up 2D array for chain exclusion
 }
 for(i=0;i<9;i++)
 {
  for(a=0;a<3;a++)
  {
   for(b=0;b<9;b++)
   {
    cx[a][b] = 0;
   }
  }
  for(j=0;j<9;j++)
  {
    for(k=0;k<9;k++)
    {
     if((s[i][j].length==9)&&(s[i][j][k]!=null))
     {
      cx[0][j]++;//increment the jth column by one
      if(cx[0][j]==1)
       cx[1][j] = k+1;//the corresponding cell = # in question, if it's the 1st instance
      else if(cx[0][j]==2)
       cx[2][j] = k+1;//otherwise the 2nd corresponding cell = # in question
     }
    }//end of k
  }//end of j
  for(c=0;c<8;c++)
  {
   for(d=c+1;d<9;d++)
   {
    if((cx[0][c]==2)&&(cx[0][d]==2)&&(cx[1][c]==cx[1][d])&&(cx[2][c]==cx[2][d]))
    {
     clearfringesr(c,d,cx[1][c],cx[2][c],i);
    }
   }
  }
 }//end of "i"
}

function clearfringesc(a,b,c,d,g)
{
 var i,n;
 for(i=0;i<9;i++)
 {
  if((s[i][g].length==9)&&(i!=a)&&(i!=b))
  {
   for(n=0;n<9;n++)
   {
    if((s[i][g][n]==c)||(s[i][g][n]==d))
    {
     s[i][g][n] = null;
    }
   }
  }
 }
}

function chainxc()
{
 var a,b,c,d,g,k,n,twocount;
 var cx = new Array(3);
 for(i=0;i<3;i++)
 {
  cx[i] = new Array(9);//set up 2D array for chain exclusion
 }
 for(j=0;j<9;j++)
 {
  for(a=0;a<3;a++)
  {
   for(b=0;b<9;b++)
   {
    cx[a][b] = 0;
   }
  }
  for(i=0;i<9;i++)
  {
    for(k=0;k<9;k++)
    {
     if((s[i][j].length==9)&&(s[i][j][k]!=null))
     {
      cx[0][i]++;//increment the kth element by one
      if(cx[0][i]==1)
       cx[1][i] = k+1;//the corresponding cell = column #, if it's the 1st instance...
      else if(cx[0][i]==2)
       cx[2][i] = k+1;//otherwise the 2nd corresponding cell = column #
     }
    }//end of k
  }//end of i
  for(c=0;c<8;c++)
  {
   for(d=c+1;d<9;d++)
   {
    if((cx[0][c]==2)&&(cx[0][d]==2)&&(cx[1][c]==cx[1][d])&&(cx[2][c]==cx[2][d]))
    {
     clearfringesc(c,d,cx[1][c],cx[2][c],j);
    }
   }
  }
 }//end of "j"
}

function clearfringesbx(a,b,c,d,r,t,w,x,y,z)
{
 var i,j;
// alert("a="+a+"; b="+b+"; c="+c+"; d="+d+" r="+r+"; t="+t+"; w="+w+"; x="+x+"; y="+y+"; z="+z);
 for(i=w;i<x;i++)
 {
  for(j=y;j<z;j++)
  {
   if(((i==a)&&(j==b))||((i==c)&&(j==d)))
   {
    continue;
   }
   else
   {
    s[i][j][r] = null;
    s[i][j][t] = null;
   }
  }
 }
}

function chainxbx(w,x,y,z)//Chain Exclusion
{
 var a,b,c,d,g,i,j,k;
 track = new Array(5);
 var cx = new Array(9);
 for(i=0;i<9;i++)
 {
  cx[i] = new Array(9);//set up matrix for tracking locations
 }
 for(i=0;i<9;i++)
 {
  for(j=0;j<9;j++)
  {
   cx[i][j] = new Array(3);//set up 3D array
  }
 }
 for(i=0;i<9;i++)
 {
  for(j=0;j<9;j++)
  {
   for(k=0;k<3;k++)
   {
    cx[i][j][k] = 0;
   }
  }
 }
  for(i=w;i<x;i++)
  {
   for(j=y;j<z;j++)
   {
    for(k=0;k<9;k++)
    {
     if((s[i][j].length==9)&&(s[i][j][k]!=null))
     {
      cx[i][j][0]++;//increment address by one
      if(cx[i][j][0]==1)
      {
       cx[i][j][1] = k;//the corresponding cell = # in question, if it's the 1st instance
      }
      else if(cx[i][j][0]==2)
      {
       cx[i][j][2] = k;//otherwise the 2nd corresponding cell = # in question
      }
     }
    }//end of k
   }//end of j
  }//end of i
 twocount = 0;
 for(a=w;a<x;a++)
 {
  for(b=y;b<z;b++)
  {
   for(c=a;c<x;c++)
   {
    for(d=b;d<z;d++)
    {
     if((a==c)&&(b==d))
      continue;
     else if((cx[a][b][0]==2)&&(cx[c][d][0]==2)&&(cx[a][b][1]==cx[c][d][1])&&(cx[a][b][2]==cx[c][d][2]))
     {
      clearfringesbx(a,b,c,d,cx[a][b][1],cx[a][b][2],w,x,y,z);
     }
    }
   }
  }
 }
}

function solve3star()//Chain Exclusion
{
 var i,j,n;
 for(z=0;z<3;z++)
 {
  solve2star();
  chainxr();
  chainxc();
  chainxbx(0,3,0,3);
  chainxbx(0,3,3,6);
  chainxbx(0,3,6,9);
  chainxbx(3,6,0,3);
  chainxbx(3,6,3,6);
  chainxbx(3,6,6,9);
  chainxbx(6,9,0,3);
  chainxbx(6,9,3,6);
  chainxbx(6,9,6,9);
 }//end of z
 n = 0;
 for(i=0;i<9;i++)
 {
  for(j=0;j<9;j++)
  {
   if((document.puzzle[n].value=='')&&(s[i][j].length!=9))
   {
    document.puzzle[n].style.color = 'blue';
    document.puzzle[n].value = s[i][j];
   }
   n++;
  }
 }
}

//here begins the solve4star family of functions (Pile Exclusion)

function clearstragglersr(a,b,c,d,g)
{
 var n;
 if((s[g][c].length==9)&&(s[g][d].length==9))
 {
  for(n=0;n<9;n++)
  {
   if((s[g][c][n]!=a)&&(s[g][c][n]!=b))
    s[g][c][n] = null;
  }
 }
 if((s[g][c].length==9)&&(s[g][d].length==9))
 {
  for(n=0;n<9;n++)
  {
   if((s[g][d][n]!=a)&&(s[g][d][n]!=b))
    s[g][d][n] = null;
  }
 }
}

function pilexr()
{
 var a,b,c,d,g,k,n,twocount;
 var px = new Array(3);
 for(i=0;i<3;i++)
 {
  px[i] = new Array(9);//set up 2D array for Pile Exclusion
 }
 for(i=0;i<9;i++)
 {
  for(a=0;a<3;a++)
  {
   for(b=0;b<9;b++)
   {
    px[a][b] = 0;
   }
  }
  for(g=1;g<10;g++)
  {
   for(j=0;j<9;j++)
   {
    for(k=0;k<9;k++)
    {
     if((s[i][j].length==9)&&(s[i][j][k]==g))
     {
      px[0][k]++;//increment the kth element by one
      if(px[0][k]==1)
       px[1][k] = j;//the corresponding cell = column #, if it's the 1st instance...
      else if(px[0][k]==2)
       px[2][k] = j;//otherwise the 2nd corresponding cell = column #
     }
    }//end of k
   }//end of j
  }//end of g
  for(c=0;c<8;c++)
  {
   for(d=c+1;d<9;d++)
   {
    if((px[0][c]==2)&&(px[0][d]==2)&&(px[1][c]==px[1][d])&&(px[2][c]==px[2][d]))
    {
     clearstragglersr(c+1,d+1,px[1][c],px[2][c],i);
    }
   }
  }
 }//end of "i"
}

function clearstragglersc(a,b,c,d,g)
{
 var n;
 if((s[c][g].length==9)&&(s[d][g].length==9))
 {
  for(n=0;n<9;n++)
  {
   if((s[c][g][n]!=a)&&(s[c][g][n]!=b))
    s[c][g][n] = null;
  }
 }
 if((s[c][g].length==9)&&(s[d][g].length==9))
 {
  for(n=0;n<9;n++)
  {
   if((s[d][g][n]!=a)&&(s[d][g][n]!=b))
    s[d][g][n] = null;
  }
 }
}

function pilexc()
{
 var a,b,c,d,g,k,n,twocount;
 var px = new Array(3);
 for(i=0;i<3;i++)
 {
  px[i] = new Array(9);//set up 2D array for Pile Exclusion
 }
 for(j=0;j<9;j++)
 {
  for(a=0;a<3;a++)
  {
   for(b=0;b<9;b++)
   {
    px[a][b] = 0;
   }
  }
  for(g=1;g<10;g++)
  {
   for(i=0;i<9;i++)
   {
    for(k=0;k<9;k++)
    {
     if((s[i][j].length==9)&&(s[i][j][k]==g))
     {
      px[0][k]++;//increment the kth element by one
      if(px[0][k]==1)
       px[1][k] = i;//the corresponding cell = column #, if it's the 1st instance...
      else if(px[0][k]==2)
       px[2][k] = i;//otherwise the 2nd corresponding cell = column #
     }
    }//end of k
   }//end of i
  }//end of g
  for(c=0;c<8;c++)
  {
   for(d=c+1;d<9;d++)
   {
    if((px[0][c]==2)&&(px[0][d]==2)&&(px[1][c]==px[1][d])&&(px[2][c]==px[2][d]))
    {
     clearstragglersc(c+1,d+1,px[1][c],px[2][c],j);
    }
   }
  }
 }//end of "j"
}

function clearstragglersbx(a,b,c,d,g,f)
{
 var n;
 if((s[c][d].length==9)&&(s[g][f].length==9))
 {
  for(n=0;n<9;n++)
  {
   if((s[c][d][n]!=a)&&(s[c][d][n]!=b))
    s[c][d][n] = null;
  }
  for(n=0;n<9;n++)
  {
   if((s[g][f][n]!=a)&&(s[g][f][n]!=b))
    s[g][f][n] = null;
  }
 }
}

function pilexbx(w,x,y,z)//Pile Exclusion
{
 var c,g,i,j,k,a1,a2,b1,b2,c1,c2,d1,d2,e1,e2,n,twocount;
 var px = new Array(5);
 for(i=0;i<5;i++)
 {
  px[i] = new Array(9);//set up 2D matrix for tracking locations
 }
 for(i=0;i<5;i++)
 {
  for(j=0;j<9;j++)
  {
   px[i][j] = 0;
  }
 }
 for(g=1;g<10;g++)
 {
  for(i=w;i<x;i++)
  {
   for(j=y;j<z;j++)
   {
    for(k=0;k<9;k++)
    {
     if((s[i][j].length==9)&&(s[i][j][k]==g))
     {
      px[0][k]++;//increment the kth element by one
      if(px[0][k]==1)
      {
       px[1][k] = i;//the corresponding cell = column #, if it's the 1st instance...
       px[2][k] = j;
      }
      else if(px[0][k]>1)
      {
       px[3][k] = i;//otherwise the 2nd corresponding cell = column #
       px[4][k] = j;
      }
     }
    }//end of k
   }//end of j
  }//end of i
 }//end of g
 for(i=0;i<8;i++)
 {
  for(j=i+1;j<9;j++)
  {
   if((px[0][i]==2)&&(px[0][j]==2)&&(px[1][i]==px[1][j])&&(px[2][i]==px[2][j])&&(px[3][i]==px[3][j])&&(px[4][i]==px[4][j]))
   {
    clearstragglersbx(i+1,j+1,px[1][i],px[2][i],px[3][i],px[4][i]);
   }
  }
 }
}

function solve4star()//Pile Exclusion
{
 var i,j,n;
 for(z=0;z<3;z++)
 {
  solve3star();
  pilexr();
  pilexc();
  pilexbx(0,3,0,3);
  pilexbx(0,3,3,6);
  pilexbx(0,3,6,9);
  pilexbx(3,6,0,3);
  pilexbx(3,6,3,6);
  pilexbx(3,6,6,9);
  pilexbx(6,9,0,3);
  pilexbx(6,9,3,6);
  pilexbx(6,9,6,9);
 }//end of z
 n = 0;
 for(i=0;i<9;i++)
 {
  for(j=0;j<9;j++)
  {
   if((document.puzzle[n].value=='')&&(s[i][j].length!=9))
   {
    document.puzzle[n].style.color = 'blue';
    document.puzzle[n].value = s[i][j];
   }
   n++;
  }
 }
}

//here begins the solve5star family of functions (Thrifty Box and X-wing)

function tidybox(a,b,c,d)//thrifty box
{
 var i,j;
 if(d<3)
 {
  for(i=0;i<3;i++)
  {
   for(j=a;j<b;j++)
   {
    if((s[i][j].length==9)&&(i!=d))
    {
     s[i][j][c-1]=null;
    }
   }
  }
 }
 else if((d>2)&&(d<6))
 {
  for(i=3;i<6;i++)
  {
   for(j=a;j<b;j++)
   {
    if((s[i][j].length==9)&&(i!=d))
    {
     s[i][j][c-1]=null;
    }
   }
  }
 }
 else if(d>5)
 {
  for(i=6;i<9;i++)
  {
   for(j=a;j<b;j++)
   {
    if((s[i][j].length==9)&&(i!=d))
    {
     s[i][j][c-1]=null;
    }
   }
  }
 }
}

function tidybox2(a,b,c,d)//thrifty box
{
 var i,j;
 if(d<3)
 {
  for(i=a;i<b;i++)
  {
   for(j=0;j<3;j++)
   {
    if((s[i][j].length==9)&&(j!=d))
    {
     s[i][j][c-1]=null;
    }
   }
  }
 }
 else if((d>2)&&(d<6))
 {
  for(i=a;i<b;i++)
  {
   for(j=3;j<6;j++)
   {
    if((s[i][j].length==9)&&(j!=d))
    {
     s[i][j][c-1]=null;
    }
   }
  }
 }
 else if(d>5)
 {
  for(i=a;i<b;i++)
  {
   for(j=6;j<9;j++)
   {
    if((s[i][j].length==9)&&(j!=d))
    {
     s[i][j][c-1]=null;
    }
   }
  }
 }
}

function solve5star()//Thrifty Box
{
 var a,b,c,g,i,j,k,n,y,z,fst,scd,thd,count,nullcount;
 for(z=0;z<3;z++)
 {
  solve4star();
  var nb = new Array(2);
  for(i=0;i<2;i++)
  {
   nb[i] = new Array(9);//set up 2D array for tracking single occurrences in a row or column
  }
 for(g=1;g<10;g++)
 {
  for(i=0;i<9;i++)
  {
   for(b=0;b<2;b++)
   {
    for(c=0;c<9;c++)
    {
     nb[b][c] = 0;
    }
   }  
   fst = 0;
   scd = 0;
   thd = 0;
   for(j=0;j<9;j++)
   {
    if((s[i][j].length==1)&&(s[i][j]==g))
    {
     nb[0][g-1]++;
     if(j<3)
      fst++;
     else if((j>2)&&(j<6))
      scd++;
     else if(j>5)
      thd++;
    }
    else if((s[i][j].length==9)&&(s[i][j][g-1]==g))
    {
     nb[0][g-1]++;
     if(j<3)
      fst++;
     else if((j>2)&&(j<6))
      scd++;
     else if(j>5)
      thd++;
    }
   }//end of j
   if((fst>0)&&(scd==0)&&(thd==0))
   {
    tidybox(0,3,g,i);
   }
   else if((fst==0)&&(scd>0)&&(thd==0))
   {
    tidybox(3,6,g,i);
   }
   else if((fst==0)&&(scd==0)&&(thd>0))
   {
    tidybox(6,9,g,i);
   }
  }//end of i
 }//end of g

 for(g=1;g<10;g++)
 {
  for(j=0;j<9;j++)
  {
   for(b=0;b<2;b++)
   {
    for(c=0;c<9;c++)
    {
     nb[b][c] = 0;
    }
   }  
   fst = 0;
   scd = 0;
   thd = 0;
   for(i=0;i<9;i++)
   {
    if((s[i][j].length==1)&&(s[i][j]==g))
    {
     nb[0][g-1]++;
     if(i<3)
      fst++;
     else if((i>2)&&(i<6))
      scd++;
     else if(i>5)
      thd++;
    }
    else if((s[i][j].length==9)&&(s[i][j][g-1]==g))
    {
     nb[0][g-1]++;
     if(i<3)
      fst++;
     else if((i>2)&&(i<6))
      scd++;
     else if(i>5)
      thd++;
    }
   }//end of i
   if((fst>0)&&(scd==0)&&(thd==0))
   {
    tidybox2(0,3,g,j);
   }
   else if((fst==0)&&(scd>0)&&(thd==0))
   {
    tidybox2(3,6,g,j);
   }
   else if((fst==0)&&(scd==0)&&(thd>0))
   {
    tidybox2(6,9,g,j);
   }
  }//end of j
 }//end of g
 }//end of z

 n = 0;
 for(i=0;i<9;i++)
 {
  for(j=0;j<9;j++)
  {
   if((document.puzzle[n].value=='')&&(s[i][j].length!=9))
   {
    document.puzzle[n].style.color = 'blue';
    document.puzzle[n].value = s[i][j];
   }
   n++;
  }
 }
}//end of solve5star

//here begins the 6-star family of functions

function xwingclear(a,c,e,f,z)// r,c,c,r,#
{
 var i;
 for(i=0;i<9;i++)
 {
  if((i!=a)&&(i!=f))
  {
   s[i][c][z-1] = null;
   s[i][e][z-1] = null;
  }
 }
}

function xwing(a,b,c,d,e,f,g,h)//row,row,row,row,col,col,col,col
{
 var i,j,k,l,m,n,o,p,x,y,z;
 var count;
 for(z=1;z<10;z++)
 {
  count = 0;
  for(i=a;i<a+3;i++)
  {
   for(j=e;j<e+3;j++)
   {
    if(s[i][j]==z)
     count++;
   }
  }
  for(k=b;k<b+3;k++)
  {
   for(l=f;l<f+3;l++)
   {
    if(s[k][l]==z)
     count++;
   }
  }
  for(m=c;m<c+3;m++)
  {
   for(n=g;n<g+3;n++)
   {
    if(s[m][n]==z)
     count++;
   }
  }
  for(o=d;o<d+3;o++)
  {
   for(p=h;p<h+3;p++)
   {
    if(s[o][p]==z)
     count++;
   }
  }
  if(count==0)
  {
   for(i=a;i<a+3;i++)
   {
    for(m=c;m<c+3;m++)
    {
     count = 0;
     for(x=0;x<9;x++)
     {
      if((s[i][x]==z)||(s[m][x]==z))
       count++;
     }
     if(count==0)
     {
      for(j=e;j<e+3;j++)
      {
       for(l=f;l<f+3;l++)
       {
        count = 0;
        for(x=0;x<9;x++)
        {
         if(((s[i][x][z-1]==z)&&(x!=j)&&(x!=l))||((s[m][x][z-1]==z)&&(x!=j)&&(x!=l)))
          count++;
        }
	k = i;
	n = j;
	o = m;
	p = l;
        if((count==0)&&(s[i][j][z-1]==z)&&(s[k][l][z-1]==z)&&(s[m][n][z-1]==z)&&(s[o][p][z-1]==z))
        {
         xwingclear(i,j,l,m,z);
        }//end of if
       }//end of fors
      }
     }//end of if
    }//end of fors
   }
  }//end of if
 }//end of z
}

function xwing90clear(a,c,e,f,z)// c,r,r,c,#
{
 var j;
 for(j=0;j<9;j++)
 {
  if((j!=a)&&(j!=f))
  {
   s[c][j][z-1] = null;
   s[e][j][z-1] = null;
  }
 }
}

function xwing90(a,b,c,d,e,f,g,h)//row,row,row,row,col,col,col,col
{
 var i,j,k,l,m,n,o,p,x,y,z;
 var count;
 for(z=1;z<10;z++)
 {
  count = 0;
  for(i=a;i<a+3;i++)
  {
   for(j=e;j<e+3;j++)
   {
    if(s[i][j]==z)
     count++;
   }
  }
  for(k=b;k<b+3;k++)
  {
   for(l=f;l<f+3;l++)
   {
    if(s[k][l]==z)
     count++;
   }
  }
  for(m=c;m<c+3;m++)
  {
   for(n=g;n<g+3;n++)
   {
    if(s[m][n]==z)
     count++;
   }
  }
  for(o=d;o<d+3;o++)
  {
   for(p=h;p<h+3;p++)
   {
    if(s[o][p]==z)
     count++;
   }
  }
  if(count==0)
  {
   for(i=e;i<e+3;i++)
   {
    for(m=f;m<f+3;m++)
    {
     count = 0;
     for(x=0;x<9;x++)
     {
      if((s[x][i]==z)||(s[x][m]==z))
       count++;
     }
     if(count==0)
     {
      for(j=a;j<a+3;j++)
      {
       for(l=c;l<c+3;l++)
       {
        count = 0;
        for(x=0;x<9;x++)
        {
         if(((s[x][i][z-1]==z)&&(x!=j)&&(x!=l))||((s[x][m][z-1]==z)&&(x!=j)&&(x!=l)))
          count++;
        }
	k = i;
	n = j;
	o = m;
	p = l;
        if((count==0)&&(s[j][i][z-1]==z)&&(s[l][k][z-1]==z)&&(s[n][m][z-1]==z)&&(s[p][o][z-1]==z))
        {
         xwing90clear(i,j,l,m,z);
        }//end of if
       }//end of fors
      }
     }//end of if
    }//end of fors
   }
  }//end of if
 }//end of z
}

function solve6star()//X-wing
{
 var z;
 for(z=0;z<2;z++)
 {
  solve5star();
  xwing(0,0,3,3,0,3,0,3);//NW,N,W,C
  xwing(0,0,3,3,0,6,0,6);//NW,NE,W,E
  xwing(0,0,3,3,3,6,3,6);//N,NE,C,E
  xwing(0,0,6,6,0,3,0,3);//NW,N,SW,S
  xwing(0,0,6,6,0,6,0,6);//NW,NE,SW,SE
  xwing(0,0,6,6,3,6,3,6);//N,NE,S,SE
  xwing(3,3,6,6,0,3,0,3);//W,C,SW,S
  xwing(3,3,6,6,0,6,0,6);//W,E,SW,SE
  xwing(3,3,6,6,3,6,3,6);//C,E,S,SE
  xwing90(0,0,3,3,0,3,0,3);//NW,N,W,C
  xwing90(0,0,3,3,0,6,0,6);//NW,NE,W,E
  xwing90(0,0,3,3,3,6,3,6);//N,NE,C,E
  xwing90(0,0,6,6,0,3,0,3);//NW,N,SW,S
  xwing90(0,0,6,6,0,6,0,6);//NW,NE,SW,SE
  xwing90(0,0,6,6,3,6,3,6);//N,NE,S,SE
  xwing90(3,3,6,6,0,3,0,3);//W,C,SW,S
  xwing90(3,3,6,6,0,6,0,6);//W,E,SW,SE
  xwing90(3,3,6,6,3,6,3,6);//C,E,S,SE
 }
 n = 0;
 for(i=0;i<9;i++)
 {
  for(j=0;j<9;j++)
  {
   if((document.puzzle[n].value=='')&&(s[i][j].length!=9))
   {
    document.puzzle[n].style.color = 'blue';
    document.puzzle[n].value = s[i][j];
   }
   n++;
  }
 }
}