/*
 *  File:    ZigZag2.cpp
 *  Author:  S Harry White
 *  Created: 2012-12-19
 *  Updated: 2020-05-19
 *    Added howMany.
 *  Updated: 2022-02-07
 *    Tidy code.
 *  Updated: 2023-01-17
 *    Change to compile with g++ for macOS.
 */

/*
 *  Makes zigzag2 magic squares of odd and doubly even order>=7.
 *
 *  Method I: Double borders are repeatedly added to a center 7x7, 8x8, or 9x9.
 *
 *  Method II: For doubly even orders, also makes squares starting with a 4x4 magic square
 *  or a singly-even bordered magic square and replacing each number by a 2x2 sub-square.
 *  Repeats this process until the required order is reached.
 */

//#include <ctype.h>
#include <curses.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
//#include <sys/types.h>
#include <time.h>
#include <unistd.h>

typedef signed char Sbyte; const bool F=false, T=true; const int startSize=25;
int **xSquare=NULL, **bSquare=NULL, *tSideOa=NULL, *tSideOb=NULL, *tSideIc=NULL, *tSideId=NULL,
    *rSideOe=NULL, *rSideOf=NULL, *rSideIg=NULL, *rSideIh=NULL, allocatedSize, biggestValue;
//==================================================== store ==================================================

void freeSquare(int*** square, const int size) {
//   ----------
  if (*square!=NULL) { for (int i=0; i<size; i++) free((*square)[i]); free(*square); *square=NULL; }
} // freeSquare

void freeSquares() {
//   -----------
  freeSquare(&xSquare, allocatedSize); freeSquare(&bSquare, allocatedSize);
  free(tSideOa); free(tSideOb); free(tSideIc); free(tSideId);
  free(rSideOe); free(rSideOf); free(rSideIg); free(rSideIh);
  tSideOa=NULL; tSideOb=NULL; tSideIc=NULL; tSideId=NULL;
  rSideOe=NULL; rSideOf=NULL; rSideIg=NULL; rSideIh=NULL; allocatedSize=0;
} // freeSquares

bool allocateSquare(int*** square, const int size) {
//   --------------
  bool ok; *square=(int**) malloc(size*sizeof(int*)); ok=(*square!=NULL);
  if (ok) { int numAllocated=size;
    for(int i=0; i<size; i++) {
      int *p=(int*) malloc(size*sizeof(int)); (*square)[i]=p; if (p==NULL) { numAllocated=i; ok=F; break; }
    } if (!ok) freeSquare(square, numAllocated);
  }
  return ok;
} // allocateSquare 

bool allocateSquares(int size) {
//   ---------------
  bool ok=T; if (size<startSize) size=startSize;
  if (size>allocatedSize) { freeSquares();
    if ((ok=allocateSquare(&xSquare, size))) {
      if ((ok=allocateSquare(&bSquare, size))) {
        allocatedSize=size; const int ssize=(size+1)/2;
        tSideOa=(int*) malloc(ssize*sizeof(int)); tSideOb=(int*) malloc(ssize*sizeof(int));
        tSideIc=(int*) malloc(ssize*sizeof(int)); tSideId=(int*) malloc(ssize*sizeof(int));
        rSideOe=(int*) malloc(ssize*sizeof(int)); rSideOf=(int*) malloc(ssize*sizeof(int));
        rSideIg=(int*) malloc(ssize*sizeof(int)); rSideIh=(int*) malloc(ssize*sizeof(int));
        ok=(tSideOa!=NULL)&&(tSideOb!=NULL)&&(tSideIc!=NULL)&&(tSideId!=NULL)&&
          (rSideOe!=NULL)&&(rSideOf!=NULL)&&(rSideIg!=NULL)&&(rSideIh!=NULL);
        if (!ok) freeSquares();
      } else { freeSquare(&xSquare, size); allocatedSize=0; }}
}
  return ok;
} //allocateSquares
//=================================================== input ======================================================

void clear_line(int c) { while (c!='\n') c=getchar(); }
//   ----------

bool getY() {
//   ----
  int c;  do { c=getchar(); } while ((c==' ')|(c=='\t')|(c=='\n')); clear_line(c);  return (c=='Y')|(c=='y');
} // getY

bool getYorOrder(int *n) {
//   -----------
  bool result=F; int c; *n=-1; do { c=getchar(); } while ((c==' ')|(c=='\t')|(c=='\n') );
  if ((c=='Y')|(c=='y') ) result=T;
  else if ( (c!='N')&(c!='n') )
    if ( ('0'<=c)&(c<='9') ) { int i=c-'0'; while ( ('0'<=(c=getchar()))&&(c<='9') ) i=i*10+c-'0';  *n=i; result=T; }  
  clear_line(c); return result;
} // getYorOrder

int getSize() { int n=0; scanf("%d", &n); clear_line(getchar()); return n; }
//  -------
//===================================================== output ========================================================

const int bufSize=1024;
bool openDir() {
//   -------
  int sub=0; char buf[bufSize], msg[bufSize+50];
  const char *baseName="./ZigZag2"; strcpy(buf, baseName);
  do {
    if (mkdir(buf, 0775)==0) break;
    if (errno!=EEXIST) { snprintf(msg, bufSize+50, "Can't make folder %s", buf); perror(msg); return F; }
    snprintf(buf, bufSize, "%s_%d", baseName, ++sub);
  } while (T);
  if (chdir(buf)!=0) { snprintf(msg, bufSize+50, "Can't open folder %s", buf); perror(msg); return F; }
  printf("Output files are in folder %s\n\n", buf); return T;
} // openDir

FILE *open_File(const int n) {
//    ---------
  char buf[bufSize]; FILE *wfp=NULL; snprintf(buf, bufSize, "./Order%d.txt", n);
  if ((wfp=fopen(buf, "a"))==NULL) {
    char msg[bufSize+50]; snprintf(msg, bufSize+50, "\a\nCan't open for write %s", buf); perror(msg);
  } return wfp; 
} // open_File

int fieldWidth(const int n) { if (n==1) return 1; int i=n*n, width=1; while ((i=i/10)!=0) ++width; return width; }
//  ----------

typedef bool (*t_fprintFW)(FILE *fp, const int i);

bool fprintFW1(FILE *fp, const int i) { return fprintf(fp, "%1d",  i)>0; }
bool fprintFW2(FILE *fp, const int i) { return fprintf(fp, "%2d",  i)>0; }
bool fprintFW3(FILE *fp, const int i) { return fprintf(fp, "%3d",  i)>0; }
bool fprintFW4(FILE *fp, const int i) { return fprintf(fp, "%4d",  i)>0; }
bool fprintFW5(FILE *fp, const int i) { return fprintf(fp, "%5d",  i)>0; }
bool fprintFW6(FILE *fp, const int i) { return fprintf(fp, "%6d",  i)>0; }
bool fprintFW7(FILE *fp, const int i) { return fprintf(fp, "%7d",  i)>0; }
bool fprintFW8(FILE *fp, const int i) { return fprintf(fp, "%8d",  i)>0; }
bool fprintFW9(FILE *fp, const int i) { return fprintf(fp, "%9d",  i)>0; }
bool fprintFWa(FILE *fp, const int i) { return fprintf(fp, "%10d", i)>0; }

static t_fprintFW fprintFW[]={ NULL,
  fprintFW1, fprintFW2, fprintFW3, fprintFW4, fprintFW5, fprintFW6, fprintFW7, fprintFW8, fprintFW9, fprintFWa
};
const int maxFieldWidth=10;

bool printSquare(int **x, const int n, FILE *wfp) {
//   -----------
  const int fw0=fieldWidth(n), fw=fw0+1; if (fw>maxFieldWidth) return F;
  for (int i=0; i<n; i++) { if (!fprintFW[fw0](wfp, x[i][0])) return F;
    for (int j=1; j<n; j++) if (!fprintFW[fw](wfp, x[i][j])) return F; if (fputc('\n', wfp)==EOF) return F;
  }
  return fputc('\n', wfp)!=EOF;
} // printSquare

//void peekSquare(int **x, const int n) {
////   ----------
//  for (int i=0; i<n; i++) {
//    printf("%d", x[i][0]); for (int j=1; j<n; j++) printf(" %d", x[i][j]); putchar('\n');
//  } putchar('\n');
//} // peekSquare
//================================================= check ====================================================

bool isCorrect(int **x, const int n) {
//   ---------
  const int nn=n*n, nnp1=nn+1; if (biggestValue!=(nn/2)) return F;
  const int chkSum=n%2 ? n*(nnp1/2) : n/2*nnp1; int sumX, sumY, sumXY=0, sumYX=0;
  for (int i=0; i<n; i++) {
    sumX=0; sumY=0; for (int j=0; j<n; j++) { sumX+=x[i][j]; sumY+=x[j][i]; }
    if ((sumX!=chkSum)|(sumY!=chkSum)) { return F; } sumXY+=x[i][n-i-1]; sumYX+=x[i][i];
  }
  return ((sumXY==chkSum)&(sumYX==chkSum));
} // isCorrect

bool isZigZag2(int **x, const int n) {
//   ---------
  const int nn=n*n, nnp1=nn+1, magicSum=n%2 ? n*(nnp1/2) : n/2*nnp1, nm1=n-1; int waysZig=0;
  bool zigL=T, zigR=T, zigU=T, zigD=T;
  for (int c=0; c<n; ++c) { // zig left ?
    int sum=0; const int j=c==0 ? nm1 : c+nm1-n; for (int r=0; r<n; r+=2) sum+=x[r][c];
    for (int r=1; r<n; r+=2) sum+=x[r][j]; if (sum!=magicSum) { zigL=F; break; }
  } if (zigL) ++waysZig;
  for (int c=0; c<n; ++c) { // zig right ?
    int sum=0; const int j=c==nm1 ? 0 : c+1; for (int r=0; r<n; r+=2) sum+=x[r][c];
    for (int r=1; r<n; r+=2) sum+=x[r][j]; if (sum!=magicSum) { zigR=F; break; }
  } if (zigR) ++waysZig;
  for (int r=0; r<n; ++r) { // zig up ?
    int sum=0; const int i=r==0 ? nm1 : r+nm1-n; for (int c=0; c<n; c+=2) sum+=x[r][c];
    for (int c=1; c<n; c+=2) sum+=x[i][c]; if (sum!=magicSum) { zigU=F; break; }
  } if (zigU) ++waysZig;
  for (int r=0; r<n; ++r) { // zig down ?
    int sum=0; const int i=r==nm1 ? 0 : r+1; for (int c=0; c<n; c+=2) sum+=x[r][c];
    for (int c=1; c<n; c+=2) sum+=x[i][c]; if (sum!=magicSum) { zigD=F; break; }
  }
  if (zigD) ++waysZig; return waysZig==4;
} // isZigZag2
//================================================== make ===================================================

void seed_rand() { srand((unsigned int)time(NULL)); }
//   ---------
int random_(const int x) { return rand()%x; }
//  -------

typedef void (*t_Turn)(const int, const int, const int);
void no_Turn   (const int n, const int i, const int j) { xSquare[i][j]    =bSquare[i][j]; };
void rotate_180(const int n, const int i, const int j) { xSquare[n-i][n-j]=bSquare[i][j]; };
void rotate_Y  (const int n, const int i, const int j) { xSquare[i][n-j]  =bSquare[i][j]; };
void rotate_X  (const int n, const int i, const int j) { xSquare[n-i][j]  =bSquare[i][j]; };
static t_Turn turnCell[]={ no_Turn, rotate_180, rotate_Y, rotate_X };

void Turn(const int o, const int n) {
//   ----
  const int numRotations=4; int r, c; const int nmo=n-o, npo=n+o, k=random_(numRotations);
  if (nmo<9) { /* turn all 7, 8, 9 */ for (r=o; r<=n; r++) for (c=o; c<=n; c++) turnCell[k](npo, r, c); }
  else { // turn only 2 border rows and columns
    const int p=o+1, m=n-1; for (r=o; r<=n; r+=nmo) for (c=o; c<=n; ++c) turnCell[k](npo, r, c);
    for (c=o; c<=n; c+=nmo) for (r=p; r<n; ++r) turnCell[k](npo, r, c);
    for (r=p; r<=m; r+=(nmo-2)) for (c=p; c<=m; ++c) turnCell[k](npo, r, c);
    for (c=p; c<=m; c+=(nmo-2)) for (r=p; r<m; ++r) turnCell[k](npo, r, c);
  }
} // Turn

void complement(const int o, const int n) {
//   ----------
  if (random_(2)) { for (int r=o; r<=n; ++r) for (int c=o; c<=n; ++c) bSquare[r][c]=-bSquare[r][c]; }
} // complement

void makeActual(int **x, const int n) {
//   ----------
  const int nn=n*n;
  if ((n%2)==0) {
    const int pPlus=nn/2, mPlus=pPlus+1;
    for (int i=0; i<n; i++) for (int j=0; j<n; j++) x[i][j]+=x[i][j]>0 ? pPlus : mPlus;
  } else { const int midc=(nn+1)/2; for (int i=0; i<n; i++) for (int j=0; j<n; j++) x[i][j]+=midc; }
} // makeActual

const int num9x9=68;
Sbyte code9x9[num9x9][9*9]={
{ -40,-30,28,-18,-19,23,-8,25,39,-25,37,-4,-36,8,32,10,-33,11,13,-27,
  -39,-16,26,19,31,24,-31,-1,-37,-7,36,9,-28,2,29,-3,7,16,30,1,0,-5,
  -23,-12,-14,12,22,5,-17,4,-38,-15,33,-6,-20,20,-10,15,27,-24,35,-11,
  -32,14,-22,6,17,-21,34,3,-29,-2,40,21,-9,18,-34,-13,-35,-26,38 },
{ -39,-31,27,-16,-20,22,-7,25,39,-21,37,-6,-36,7,32,8,-33,12,15,-27,
  -40,-13,26,16,31,24,-32,-3,-37,-5,36,4,-28,-1,29,5,9,17,30,-4,0,-2,
  -24,-11,-15,11,23,1,-18,-17,-38,3,33,2,-25,20,-8,14,28,-22,35,-12,
  -30,13,-23,10,18,6,34,-10,-29,-19,40,21,-9,19,-34,-14,-35,-26,38 },
{ -38,-30,27,-18,-21,23,-7,25,39,-22,37,-8,-36,9,33,10,-34,11,15,-27,
  -40,-16,26,21,31,22,-32,-3,-37,-5,36,1,-29,2,30,5,8,18,29,4,0,-20,
  -23,-2,-14,12,24,6,-17,-13,-39,-1,32,-4,-25,19,-6,16,28,-9,34,-26,
  -31,13,-24,7,17,3,35,-11,-28,-12,40,20,-10,14,-33,-15,-35,-19,38 },
{ -37,-30,27,-19,-17,23,-12,26,39,-26,37,-5,-35,9,32,10,-34,12,16,-27,
  -40,-16,25,21,31,22,-32,1,-38,-3,36,-2,-28,8,30,-4,5,18,29,7,0,-15,
  -20,-10,-14,11,24,2,-18,-6,-39,4,33,-11,-24,19,-7,15,28,-21,34,-13,
  -31,14,-23,6,17,-1,35,-22,-29,3,40,20,-9,13,-36,-8,-33,-25,38 },
{ -36,-32,29,-15,-18,22,-14,25,39,-25,37,-4,-37,8,33,10,-33,11,12,-31,
  -40,-5,26,17,31,19,-29,-2,-38,5,36,-8,-26,1,28,4,7,18,30,-11,0,-6,
  -17,-1,-20,13,23,6,-19,3,-39,2,35,-24,-23,21,-10,16,27,-21,34,-16,
  -28,14,-22,-7,20,-3,32,-13,-30,9,40,24,-9,15,-35,-12,-34,-27,38 },
{ -35,-29,28,-17,-19,21,-13,25,39,-25,37,-5,-37,9,32,10,-32,11,16,-27,
  -40,-15,26,20,31,22,-33,-1,-38,6,36,-2,-28,4,30,-7,1,15,29,2,0,-20,
  -16,3,-14,12,24,5,-18,-4,-39,-21,33,8,-22,18,-9,17,27,-11,34,-24,
  -30,14,-23,-6,19,-3,35,7,-31,-12,40,23,-8,13,-34,-10,-36,-26,38 },
{ -34,-30,28,-19,-18,24,-15,25,39,-24,37,-5,-36,8,32,10,-33,11,15,-27,
  -40,-14,26,18,31,23,-32,-2,-38,-4,36,-8,-28,9,30,5,-1,16,29,1,0,-7,
  -12,-10,-16,12,22,2,-17,3,-39,-23,34,6,-20,20,-11,19,27,-26,33,-13,
  -29,14,-21,7,17,-3,35,4,-31,-22,40,21,-6,13,-35,-9,-37,-25,38 },
{ -33,-26,36,-24,28,24,1,26,-32,-21,40,-12,-38,8,16,12,-18,13,35,-25,
  -40,-20,-28,22,2,23,31,-10,-37,3,39,9,32,-8,-34,6,30,10,-27,11,0,
  -14,-36,-7,33,14,-22,4,34,-4,-39,-11,27,-3,-1,20,-6,18,-29,-15,38,
  -23,-2,17,19,5,-35,-13,-9,7,25,-16,-31,21,37,15,29,-17,-5,-19,-30 },
{ -32,-25,36,-23,33,20,-6,28,-31,-17,40,-12,-36,8,24,10,-28,11,27,-22,
  -40,-21,-35,17,19,26,29,-9,-37,1,39,4,25,-2,-27,6,30,7,-26,13,0,-5,
  -38,-15,34,12,-24,9,31,-8,-39,3,32,-16,5,18,-7,15,-33,-14,38,-19,
  -3,14,21,2,-34,-4,-10,-11,23,-1,-30,22,37,16,35,-18,-13,-20,-29 },
{ -31,-25,34,-24,32,23,-5,26,-30,-14,40,-12,-35,5,28,9,-33,12,25,-22,
  -40,-21,-32,14,20,29,27,-13,-38,1,39,-1,22,6,-23,7,31,10,-27,13,0,
  -3,-37,-20,33,11,-26,3,30,2,-39,-7,35,-9,4,18,-4,15,-36,-15,38,-18,
  -2,16,24,8,-34,-6,-11,-8,21,-10,-29,19,37,17,36,-19,-16,-17,-28 },
{ -30,-37,8,-16,37,26,14,27,-29,-25,-11,-3,30,6,3,10,-22,12,29,-33,
  -20,-12,-31,21,-9,24,31,-7,7,-17,-26,9,2,4,17,11,34,22,-34,-8,0,-10,
  -38,-4,38,13,-32,5,32,-1,35,-15,-35,-2,-5,23,18,20,-39,-19,39,-24,
  -13,19,36,15,-36,-14,-40,1,40,-21,-28,25,28,16,33,-18,-6,-23,-27 },
{ -29,-35,8,-19,31,26,18,28,-28,-24,-12,-13,35,11,-1,12,-22,14,30,-33,
  -20,-9,-25,17,-14,25,29,-4,7,2,-30,9,3,-17,20,10,34,21,-34,-10,0,
  -5,-36,-6,36,13,-32,6,32,-2,38,4,-38,-21,-8,23,19,16,-39,-23,39,-16,
  -11,15,37,5,-37,-18,-40,1,40,-3,-27,24,27,22,33,-15,-7,-31,-26 },
{ -28,-33,1,-19,30,25,24,27,-27,-32,-13,-3,33,10,4,12,-24,13,29,-30,
  -20,-8,-23,18,-17,20,31,3,11,-5,-31,-14,-2,7,22,9,35,19,-35,-6,0,
  8,-37,-21,37,14,-34,6,34,5,38,-7,-38,-18,-10,21,26,16,-39,-22,39,
  -15,-16,15,36,2,-36,-1,-40,-12,40,-4,-26,23,28,17,32,-29,-9,-11,-25 },
{ -27,-34,-5,-15,32,24,26,25,-26,-29,-14,-2,30,9,7,10,-23,12,28,-31,
  -20,-4,-21,16,-22,19,35,1,17,-8,-32,11,-6,-3,21,-1,36,20,-33,-13,
  0,-10,-36,3,33,13,-37,4,37,8,38,-9,-38,-16,-12,22,31,14,-40,-19,39,
  -17,-18,15,34,6,-35,-28,-39,2,40,5,-25,23,27,18,29,-11,-7,-30,-24 },
{ -26,-37,-3,-11,30,22,24,26,-25,-30,-15,-2,34,9,10,11,-29,12,31,-28,
  -20,-9,-27,17,-13,20,29,2,18,-7,-33,5,-8,6,23,-6,33,19,-32,-10,0,
  -16,-38,7,37,13,-39,1,35,-17,38,4,-34,-1,-14,21,28,14,-35,-4,39,-31,
  -18,15,36,8,-36,3,-40,-21,40,-5,-24,25,27,16,32,-19,-12,-22,-23 },
{ -25,-33,-6,-13,32,21,23,25,-24,-28,-16,-3,36,7,12,11,-32,13,28,-31,
  -20,-8,-26,19,-12,20,30,-1,17,2,-34,-9,-10,3,27,5,31,18,-29,-5,0,
  -19,-36,6,34,14,-38,8,35,4,38,1,-35,-27,-11,22,29,16,-39,-17,39,-21,
  -18,15,37,-7,-37,-2,-40,-15,40,9,-23,24,26,10,33,-4,-14,-30,-22 },
{ -24,-30,11,-19,37,21,-1,28,-23,-27,-40,-11,23,10,31,12,-14,16,30,
  -29,-39,-17,-34,22,14,24,29,-4,20,4,7,-3,-32,-6,5,9,36,15,-33,-7,
  0,-10,-36,2,33,13,-15,1,8,-5,38,3,-31,-12,-20,19,34,17,-35,-8,39,
  -28,-18,18,35,6,-38,-2,-37,-9,40,-13,-22,25,27,26,32,-25,-16,-26,-21 },
{ -23,-31,9,-19,32,22,4,28,-22,-26,-40,-11,27,11,31,12,-18,14,26,-29,
  -39,-17,-35,21,18,25,30,-5,19,1,5,2,-32,10,8,-8,33,13,-33,-1,0,-3,
  -36,-9,36,15,-14,3,6,-6,38,-10,-30,-2,-15,23,34,20,-34,-27,39,-16,
  -24,16,35,7,-38,-7,-37,-12,40,-4,-21,24,29,17,37,-13,-25,-28,-20 },
{ -22,-33,13,-16,31,20,-1,29,-21,-26,-40,-8,22,7,36,9,-18,18,27,-31,
  -39,-14,-29,19,11,26,30,-11,28,2,3,1,-36,-9,5,17,32,15,-32,4,0,-7,
  -34,-12,34,14,-23,8,12,-3,38,6,-27,-25,-17,24,37,10,-35,-4,39,-30,
  -24,23,35,-2,-37,-5,-38,-6,40,-10,-20,25,21,16,33,-28,-15,-13,-19 },
{ -21,-30,10,-22,33,25,-2,27,-20,-26,-40,-5,31,8,34,11,-25,12,21,-29,
  -39,-16,-36,22,26,23,28,-6,17,-3,1,2,-34,3,16,4,30,15,-32,6,0,-8,
  -35,-13,37,13,-12,-1,5,7,38,-10,-31,-9,-11,20,32,18,-33,-24,39,-14,
  -27,19,35,9,-37,-17,-38,-4,40,-7,-19,24,29,14,36,-15,-28,-23,-18 },
{ -20,-29,12,-22,30,25,-3,26,-19,-26,-40,-8,32,7,36,13,-28,14,17,-27,
  -39,-16,-34,20,29,23,27,2,18,-5,-1,3,-36,11,19,-11,33,10,-32,1,0,
  -9,-35,-2,34,9,-13,5,6,-4,38,-14,-31,4,-12,22,31,16,-33,-15,39,-23,
  -25,15,35,8,-37,-6,-38,-10,40,-7,-18,24,28,21,37,-21,-30,-24,-17 },
{ -19,-29,8,-23,37,24,-8,28,-18,-22,-40,-11,34,7,36,11,-30,15,20,-28,
  -39,-14,-34,19,27,23,26,-6,14,4,-3,5,-36,10,25,-13,31,17,-31,3,0,
  -21,-32,1,32,12,-9,-2,6,-5,38,-1,-35,-4,-15,18,33,21,-33,-12,39,-27,
  -24,16,35,9,-37,-7,-38,-20,40,2,-17,22,29,13,30,-10,-26,-25,-16 },
{ -18,-27,8,-24,33,25,-6,26,-17,-23,-40,-8,35,7,37,11,-32,13,18,-26,
  -39,-19,-33,22,30,23,24,-10,15,2,-5,3,-37,-4,27,9,28,12,-30,10,0,
  -20,-34,-2,36,14,-9,1,6,-3,38,-11,-35,-1,-12,20,32,16,-31,-14,39,
  -22,-28,19,34,5,-36,-7,-38,4,40,-21,-16,21,29,17,31,-13,-29,-25,-15 },
{ -17,-29,-2,-26,33,25,2,30,-16,-25,-40,-6,37,8,36,11,-33,12,27,-28,
  -39,-13,-32,18,24,23,20,-4,15,-1,-7,-5,-36,4,28,6,26,14,-24,3,0,-9,
  -34,-8,32,13,-10,-3,7,9,38,-20,-35,1,-21,21,34,17,-30,-11,39,-27,
  -22,16,35,10,-37,-12,-38,5,40,-19,-15,22,31,19,29,-23,-31,-18,-14 },
{ -16,-29,-8,-23,32,25,7,27,-15,-26,-40,-6,37,8,36,11,-33,13,31,-28,
  -39,-22,-31,24,20,26,19,-5,17,3,-9,2,-36,4,28,-4,18,12,-17,10,0,-21,
  -34,-1,33,15,-12,6,9,1,38,-20,-35,-2,-19,22,34,21,-30,-18,39,-25,
  -24,16,35,-3,-37,-11,-38,5,40,-7,-14,23,30,14,29,-10,-32,-27,-13 },
{ -15,-29,-18,-27,33,27,14,29,-14,-22,-40,-2,37,7,36,8,-33,9,30,-28,
  -39,-23,-31,19,16,32,24,-3,22,3,-11,1,-36,-6,25,5,17,13,-8,18,0,-21,
  -35,-10,26,10,-17,-5,11,-7,38,-4,-32,6,-19,21,34,20,-30,-16,39,-25,
  -24,15,35,4,-37,-1,-38,2,40,-20,-13,23,31,12,28,-9,-34,-26,-12 },
{ -14,-28,-18,-27,33,24,12,31,-13,-25,-40,-2,37,6,38,8,-35,13,32,-26,
  -39,-24,-32,22,16,28,23,-7,21,5,-10,4,-37,-3,26,1,10,9,-6,14,0,-4,
  -34,-19,30,15,-15,-5,11,-9,35,-8,-31,7,-16,20,36,19,-30,-22,39,-17,
  -29,17,34,2,-38,-1,-36,3,40,-21,-12,25,27,18,29,-20,-33,-23,-11 },
{ -13,-30,-27,-26,33,25,19,31,-12,-21,-40,-8,37,5,36,11,-33,13,30,-25,
  -39,-24,-31,20,8,29,32,-9,23,1,-15,2,-36,-1,28,7,10,9,6,12,0,-4,-34,
  -17,18,14,-18,4,15,-5,38,-7,-35,-6,-16,22,34,17,-29,-19,39,-20,-28,
  16,35,3,-37,-2,-38,-3,40,-14,-11,24,26,21,27,-22,-32,-23,-10 },
{ -12,-27,-32,-26,33,23,22,30,-11,-22,-40,-8,37,8,36,10,-33,12,31,-25,
  -39,-24,-28,20,4,29,32,-7,25,-2,-17,1,-36,9,28,-1,5,6,11,15,0,-6,
  -34,-15,18,13,-20,7,17,-4,38,-3,-35,-13,-14,19,34,21,-29,-19,39,-21,
  -30,16,35,3,-37,-5,-38,-16,40,2,-10,27,26,14,24,-18,-31,-23,-9 },
{ -11,-28,-35,-27,33,25,23,30,-10,-20,-40,-5,36,6,37,7,-33,12,32,-26,
  -39,-22,-25,20,1,28,31,-6,29,-4,-19,-2,-37,10,27,2,3,9,13,14,0,-7,
  -32,-16,16,11,-23,5,19,-12,38,-3,-34,-1,-15,21,35,18,-30,-21,39,-18,
  -29,15,34,4,-36,8,-38,-14,40,-13,-9,24,26,17,22,-17,-31,-24,-8 },
{ -10,-28,-34,-27,26,24,27,31,-9,-18,-40,-14,37,8,36,11,-33,13,33,-26,
  -39,-20,-22,16,-4,30,32,-6,29,1,-21,5,-36,-3,28,3,-2,9,19,17,0,-1,
  -32,-25,15,10,-24,6,21,-15,38,4,-35,-5,-13,22,34,18,-29,-23,39,-17,
  -31,14,35,7,-37,2,-38,-12,40,-11,-8,23,20,12,25,-16,-30,-19,-7 },
{ -9,-28,-35,-26,24,25,28,29,-8,-20,-40,-3,36,5,37,7,-33,11,32,-25,
  -39,-24,-19,19,-5,30,31,-4,34,-11,-23,9,-38,2,27,4,-2,15,22,13,0,
  -12,-32,-16,12,10,-27,8,23,-1,38,1,-34,-18,-14,18,35,21,-31,-17,39,
  -22,-29,14,33,6,-36,-13,-37,-10,40,3,-7,20,17,16,26,-15,-30,-21,-6 },
{ -8,-31,-34,-24,17,26,32,29,-7,-22,-40,-2,37,5,36,6,-33,13,31,-26,
  -39,-23,-10,22,-12,27,30,-4,33,-9,-25,4,-36,8,28,1,-3,16,24,10,0,
  -11,-32,-15,11,12,-28,2,25,-16,38,-1,-35,3,-14,20,34,18,-30,-18,39,
  -20,-29,14,35,9,-37,7,-38,-13,40,-17,-6,21,15,19,23,-19,-27,-21,-5 },
{ -7,-31,-34,-18,15,24,32,25,-6,-22,-40,-11,36,7,37,12,-33,14,30,-25,
  -39,-20,-10,22,-12,23,31,-9,35,4,-27,10,-37,3,29,-8,-3,16,28,1,0,
  -16,-30,-1,5,13,-28,-2,26,2,38,-21,-36,8,-15,19,34,17,-32,-13,39,
  -23,-26,18,33,9,-35,-19,-38,6,40,-14,-5,21,11,20,27,-17,-29,-24,-4 },
{ -6,-27,-34,-26,13,25,32,28,-5,-20,-40,-15,37,4,36,15,-33,16,31,-25,
  -39,-22,-2,23,-16,24,26,-11,35,1,-29,3,-36,5,30,2,-9,9,29,11,0,-13,
  -32,-7,12,14,-28,6,27,7,38,-19,-37,-8,-12,21,34,18,-31,-18,39,-21,
  -30,17,33,8,-35,-14,-38,-1,40,-10,-4,22,10,19,20,-17,-23,-24,-3 },
{ -5,-28,-34,-23,11,25,32,26,-4,-24,-40,-14,37,7,35,15,-32,16,28,-27,
  -39,-20,5,23,-21,24,27,-13,36,10,-31,1,-36,-6,31,8,-1,12,30,6,0,-11,
  -33,-7,4,17,-29,13,29,-10,38,-12,-38,-8,-19,21,34,18,-30,-22,40,-17,
  -25,20,33,-9,-35,2,-37,3,39,-16,-3,22,9,19,14,-15,-18,-26,-2 },
{ -4,-28,1,-26,14,25,-8,29,-3,-18,40,-14,-36,4,33,7,-37,21,30,-27,-40,
  -24,-33,24,35,27,8,-15,-38,15,39,5,-32,-7,31,2,-19,10,34,12,0,-13,
  -34,-9,19,16,-30,9,32,3,-39,-11,37,-17,-5,22,-21,20,13,-20,36,-22,
  -23,17,28,-10,-35,-12,38,11,-31,-6,-2,23,26,18,6,-16,-29,-25,-1 },
{ -3,-27,3,-24,8,22,-6,29,-2,-17,40,-14,-37,4,33,12,-36,15,32,-26,-40,
  -21,-34,21,36,26,6,-16,-38,7,39,-7,-31,11,30,5,-23,9,35,10,0,-4,-35,
  -15,23,13,-30,-9,31,14,-39,-10,38,-8,-5,19,-25,18,24,-19,34,-18,-28,
  20,28,16,-33,-11,37,-13,-32,-12,-1,25,27,17,2,-20,-29,-22,1 },
{ -2,-27,3,-26,4,26,-4,27,-1,-20,40,-18,-38,10,34,13,-36,15,23,-25,
  -40,-22,-24,22,36,25,5,-14,-37,9,39,-10,-33,7,31,8,-19,11,30,12,0,
  -15,-35,-8,24,16,-31,14,33,-6,-39,-13,37,-11,-3,20,-28,17,29,-16,
  32,-21,-30,18,28,-5,-34,6,38,-7,-32,-12,1,21,35,19,-9,-17,-29,-23,2 },
{ -1,-34,-5,-25,7,27,-2,32,1,-20,40,-14,-38,10,34,11,-36,13,25,-28,
  -40,-19,-26,21,36,26,5,-11,-37,-6,39,8,-33,-3,31,12,-22,19,35,9,0,
  -15,-35,-13,22,15,-27,14,29,-10,-39,-12,37,-7,-4,20,-23,17,28,-16,
  30,-21,-31,16,24,6,-30,-8,38,4,-32,-18,2,23,33,18,-9,-17,-29,-24,3 },
{ 1,-30,-1,-21,-8,23,6,28,2,-22,40,-17,-38,11,34,13,-36,15,29,-29,-40,
  -19,-18,22,36,26,-7,-5,-37,7,39,-4,-33,-12,31,14,-24,18,35,5,0,-20,
  -35,-3,24,10,-28,12,30,-15,-39,9,37,-16,-9,20,-27,16,32,-11,27,-25,
  -23,17,25,-2,-31,8,38,-10,-32,-13,3,21,33,19,-6,-14,-34,-26,4 },
{ 2,-26,8,-25,-11,22,-2,29,3,-18,40,-16,-38,1,34,12,-36,21,15,-24,-40,
  -23,-7,20,36,27,-4,-17,-37,-6,39,17,-33,11,31,-5,-28,6,35,10,0,-3,
  -30,-13,23,16,-31,9,33,-10,-39,-14,37,-1,7,18,-35,24,30,-20,25,-22,
  -27,19,28,13,-34,-8,38,-9,-32,-15,4,26,32,14,-12,-19,-29,-21,5 },
{ 3,-31,1,-26,-18,27,10,30,4,-17,40,-15,-38,7,34,11,-36,14,21,-24,-40,
  -23,-4,22,36,25,-13,-16,-37,8,39,16,-33,-6,31,-2,-28,9,35,13,0,-8,
  -35,-14,28,15,-27,12,29,-11,-39,-7,37,-9,-1,20,-29,19,32,-20,23,-19,
  -25,18,24,-5,-30,-12,38,2,-32,-3,5,26,33,17,-10,-21,-34,-22,6 },
{ 4,-29,3,-28,-24,25,12,32,5,-15,40,-13,-38,-2,34,13,-36,17,14,-25,
  -40,-23,8,18,36,30,-18,-14,-37,27,39,-6,-33,-8,31,1,-26,9,35,20,0,
  -10,-35,-19,26,10,-27,-9,29,11,-39,-1,37,-11,2,22,-31,15,28,-16,21,
  -21,-20,19,24,-5,-30,-3,38,-4,-32,-7,6,23,33,16,-12,-17,-34,-22,7 },
{ 5,-26,10,-24,-25,15,4,35,6,-15,40,-13,-38,-9,34,11,-36,26,-6,-23,
  -40,-22,14,22,36,23,-4,-14,-37,-3,39,13,-33,9,31,-5,-27,1,33,18,0,
  -2,-30,-17,24,2,-28,17,30,3,-39,-12,37,-10,21,20,-35,16,29,-16,19,
  -20,-34,27,25,-1,-31,-7,38,-8,-32,-11,7,28,32,12,-18,-19,-29,-21,8 },
{ 6,-26,10,-25,-28,19,5,32,7,-17,40,-12,-38,3,34,11,-36,15,-1,-22,-40,
  -21,18,20,36,23,-13,-14,-37,26,39,-10,-33,2,31,-4,-29,1,35,21,0,-6,
  -34,-16,28,4,-27,-11,29,14,-39,-5,37,-2,16,22,-35,12,33,-15,17,-19,
  -31,27,24,-3,-30,-7,38,-8,-32,-9,8,25,30,13,-23,-18,-24,-20,9 },
{ 7,-28,11,-27,-31,25,5,30,8,-17,40,-13,-38,-4,34,14,-36,20,16,-25,
  -40,-23,12,21,36,27,-24,-15,-37,24,39,-3,-33,-8,31,2,-30,-1,35,26,
  0,-9,-22,-16,17,13,-26,-6,28,4,-39,1,37,-12,-2,22,-35,18,33,-19,15,
  -21,-11,19,23,-5,-29,3,38,-7,-32,-10,9,32,29,6,-14,-18,-34,-20,10 },
{ 8,-27,7,-26,-30,24,6,29,9,-16,40,-11,-38,-9,34,16,-36,20,-3,-22,-40,
  -21,21,15,36,28,-14,-15,-37,18,39,3,-33,-5,31,-1,-34,-2,35,30,0,-10,
  -24,-18,23,14,-25,-8,27,4,-39,-4,37,-6,19,25,-35,12,32,-17,13,-20,
  -29,17,22,1,-28,2,38,-7,-32,-13,10,26,33,5,-23,-12,-31,-19,11 },
{ 9,-27,13,-26,-33,23,1,30,10,-15,40,-12,-37,5,35,7,-38,15,-14,-23,
  -40,-21,27,18,37,26,-10,-13,-36,-3,39,14,-34,3,31,-1,-31,2,33,22,
  0,-7,-22,-17,20,4,-25,17,28,-8,-39,-4,36,-9,25,16,-35,19,34,-16,8,
  -19,-32,24,21,-2,-30,-11,38,-6,-29,-5,11,32,29,6,-28,-18,-24,-20,12 },
{ 10,-27,7,-25,-34,24,6,28,11,-18,40,-13,-38,2,34,14,-36,15,-14,-24,
  -40,-22,30,19,36,27,-12,-8,-37,-2,39,8,-33,3,31,-1,-31,1,35,26,0,
  -11,-21,-16,17,4,-23,18,25,-6,-39,-7,37,-9,23,21,-35,16,32,-17,9,
  -20,-29,22,20,-3,-26,-4,38,-10,-32,-5,12,29,33,5,-28,-15,-30,-19,13 },
{ 11,-31,8,-26,-34,28,3,29,12,-15,40,-10,-38,4,34,5,-36,16,-18,-24,
  -40,-23,30,20,36,27,-8,-12,-37,25,39,-3,-33,-1,31,-9,-28,15,35,18,
  0,-14,-16,-19,9,1,-22,-4,24,6,-39,2,37,-5,22,17,-35,21,33,-21,7,-17,
  -27,26,19,-11,-25,-7,38,-6,-32,-2,13,23,32,10,-29,-13,-30,-20,14 },
{ 12,-29,7,-27,-31,26,-1,30,13,-16,40,-12,-38,-4,34,11,-36,21,-20,-25,
  -40,-23,27,19,36,29,-3,-14,-37,2,39,10,-33,4,31,-2,-30,6,35,25,0,
  -13,-6,-18,1,8,-21,17,23,-9,-39,-5,37,-11,24,20,-35,16,32,-17,5,-19,
  -26,22,18,-7,-24,3,38,-10,-32,-8,14,28,33,9,-28,-15,-34,-22,15 },
{ 13,-26,7,-25,-31,21,-3,30,14,-15,40,-13,-38,-10,34,18,-36,20,-27,
  -24,-40,-22,29,19,36,27,2,-14,-37,8,39,9,-33,5,31,-8,-29,-1,35,24,
  0,-6,-2,-17,-4,6,-20,1,22,10,-39,-12,37,-5,28,25,-35,12,32,-18,3,
  -19,-28,23,17,4,-23,-9,38,-11,-32,-7,15,26,33,11,-30,-16,-34,-21,16 },
{ 14,-35,2,-22,-30,27,-1,30,15,-18,40,-13,-38,3,34,7,-36,21,-21,-27,
  -40,-26,28,24,36,29,-3,-15,-37,9,39,5,-33,8,31,-7,-28,11,35,20,0,
  -17,-2,-14,-5,10,-16,12,18,-12,-39,-6,37,-4,19,25,-29,6,33,-11,1,
  -20,-24,23,13,-8,-19,4,38,-9,-32,-10,16,26,32,22,-31,-23,-34,-25,17 },
{ 15,-29,-2,-27,-26,27,-3,29,16,-19,40,-16,-38,5,34,10,-36,20,-28,-25,
  -40,-24,24,21,36,28,8,-18,-37,4,39,7,-33,13,31,-6,-30,3,35,22,0,-11,
  2,-14,-7,12,-12,11,14,-8,-39,-10,37,-5,26,19,-23,23,33,-20,-1,-22,
  -35,25,9,1,-15,-4,38,-13,-32,-9,17,32,30,6,-31,-17,-34,-21,18 },
{ 16,-29,2,-28,-31,28,-4,29,17,-20,40,-19,-38,8,34,9,-36,22,-25,-24,
  -40,-23,30,20,36,27,-1,-14,-37,5,39,7,-33,4,31,-2,-30,3,33,25,0,-11,
  6,-17,-9,11,-13,13,15,-10,-39,-6,37,-8,21,24,-27,12,35,-15,-3,-21,
  -26,23,10,1,-16,-5,38,-7,-32,-12,18,26,32,14,-34,-22,-35,-18,19 },
{ 17,-28,6,-27,-30,26,-11,29,18,-19,40,-8,-38,5,34,10,-36,12,-22,-26,
  -40,-25,32,23,36,28,-6,-18,-37,4,39,7,-33,-1,31,8,-29,2,35,21,0,-10,
  14,-13,-20,13,-14,1,16,-3,-39,-7,37,-4,15,25,-31,22,33,-24,-5,-23,
  -12,24,11,3,-17,-9,38,-2,-32,-16,19,27,30,9,-35,-15,-34,-21,20 },
{ 18,-26,24,-25,-34,22,-27,29,19,-16,40,-12,-38,8,34,9,-36,11,-22,-24,
  -40,-21,30,32,36,13,-4,-13,-37,3,39,-1,-33,1,31,10,-31,-5,35,25,0,
  -17,26,-3,-30,6,-15,4,17,2,-39,-2,37,-10,15,27,-35,7,33,-14,-7,-20,
  -6,23,12,5,-18,-9,38,-8,-32,-11,20,28,16,14,-29,-23,-28,-19,21 },
{ 19,-26,23,-25,-35,24,-27,27,20,-21,40,-8,-38,6,34,10,-36,13,-22,-24,
  -40,-23,28,18,36,29,-2,-7,-37,5,39,3,-33,2,31,-3,-34,-1,33,32,0,-14,
  30,-17,-29,11,-12,8,14,-16,-39,1,37,-4,16,25,-31,4,35,-10,-9,-19,
  -11,17,9,-5,-15,7,38,-13,-32,-6,21,26,15,12,-28,-18,-30,-20,22 },
{ 20,-26,16,-25,-30,24,-27,27,21,-18,40,-14,-38,8,34,10,-36,14,-23,
  -24,-40,-22,32,17,36,29,-5,-12,-37,5,39,1,-33,2,31,4,-34,-4,35,25,
  0,-6,30,-15,-31,11,-10,6,12,-7,-39,-9,37,-1,15,26,-29,13,33,-19,-11,
  -20,-8,19,7,3,-13,-2,38,-3,-32,-17,22,28,18,9,-35,-16,-28,-21,23 },
{ 21,-28,11,-27,-30,26,-24,29,22,-16,40,-14,-38,7,34,10,-36,13,-25,
  -26,-40,-22,32,20,36,28,-3,-15,-37,12,39,5,-33,-4,31,2,-34,9,35,16,
  0,-8,30,-17,-31,6,-6,4,8,-1,-39,1,37,-10,15,18,-23,19,33,-18,-13,
  -19,-12,25,3,-2,-9,-11,38,-7,-32,-5,23,27,17,14,-35,-20,-29,-21,24 },
{ 22,-28,7,-27,-30,26,-22,29,23,-18,40,-16,-38,6,34,11,-36,17,-25,-26,
  -40,-23,32,21,36,28,-3,-12,-37,5,39,9,-33,-4,31,2,-34,8,35,12,0,-7,
  30,-13,-31,14,-2,10,4,-6,-39,-10,37,-8,13,19,-17,20,33,-19,-15,-20,
  -14,16,-1,1,-5,-9,38,3,-32,-11,24,27,15,18,-35,-21,-29,-24,25 },
{ 23,-27,-6,-26,-30,21,-11,32,24,-16,40,-14,-38,7,34,8,-36,15,-28,-25,
  -40,-23,29,20,36,28,3,-15,-37,17,39,-4,-33,-2,31,4,-31,6,33,14,0,
  -1,27,-19,-29,12,5,-13,-3,9,-39,1,37,-9,11,16,-5,22,35,-18,-17,-20,
  -24,19,-8,10,2,-12,38,-7,-32,-10,25,30,18,13,-34,-22,-35,-21,26 },
{ 24,-28,-1,-24,-30,23,-18,29,25,-22,40,-13,-38,7,34,13,-36,15,-21,
  -27,-40,-23,32,22,36,28,-7,-11,-37,4,39,8,-33,-2,31,1,-34,14,35,10,
  0,-8,30,-16,-31,16,6,12,-4,2,-39,-20,37,-10,5,20,-5,18,33,-12,-19,
  -26,-14,17,-9,-3,3,-17,38,9,-32,-6,26,21,11,19,-35,-25,-29,-15,27 },
{ 25,-28,-5,-25,-30,24,-16,29,26,-26,40,-10,-38,11,34,12,-36,13,-24,
  -27,-40,-18,32,22,36,23,-4,-9,-37,-2,39,2,-33,5,31,4,-34,14,35,8,
  0,-15,30,-7,-31,17,10,15,-8,-1,-39,-20,37,-11,6,20,1,16,33,-14,-21,
  -22,-19,18,-13,-3,7,-12,38,3,-32,-6,27,21,9,19,-35,-17,-29,-23,28 },
{ 26,-28,-8,-21,-31,24,-14,25,27,-22,40,-15,-38,10,34,12,-36,15,-27,
  -26,-40,-19,32,22,36,23,-1,-11,-37,9,39,2,-33,4,31,-4,-35,13,35,3,
  0,-10,30,-6,-30,16,14,1,-12,-5,-39,-3,37,-9,8,20,7,18,33,-20,-23,
  -18,-25,17,-17,5,11,-7,38,-13,-32,-2,28,21,6,19,-34,-16,-29,-24,29 },
{ 27,-27,-18,-22,-29,23,-8,26,28,-15,40,-10,-38,4,34,9,-36,12,-21,-26,
  -40,-16,24,17,36,25,1,-12,-37,-3,39,2,-33,10,31,3,-34,11,33,7,0,-7,
  32,-11,-31,13,21,5,-19,-4,-39,-5,37,-9,-1,20,19,16,35,-13,-25,-23,
  -28,14,-24,8,18,-2,38,-14,-32,-6,29,22,6,15,-30,-20,-35,-17,30 },
{ 28,-29,-19,-18,-31,23,-7,24,29,-15,40,-13,-37,7,27,10,-30,11,-23,
  -25,-40,-16,32,20,34,21,-3,-10,-38,1,39,6,-26,5,25,-2,-34,17,36,4,
  0,-17,33,-4,-35,12,26,3,-24,-8,-39,-9,37,2,-1,18,15,14,35,-12,-27,
  -20,-22,13,-28,9,22,-5,38,-6,-32,-11,30,19,8,16,-36,-14,-33,-21,31 }
};

const int num8x8=40;
Sbyte code8x8[num8x8][8*8]={
{ -32,-28,2,6,31,27,-1,-5,-22,-18,12,16,21,17,-11,-15,-6,-2,28,32,5,1,
  -27,-31,-16,-12,18,22,15,11,-17,-21,24,20,-10,-14,-23,-19,9,13,30,26,
  -4,-8,-29,-25,3,7,14,10,-20,-24,-13,-9,19,23,8,4,-26,-30,-7,-3,25,29 },
{ -31,13,23,-5,29,-15,-21,7,28,-10,-20,2,-26,12,18,-4,-2,20,10,-28,4,-18,
  -12,26,5,-23,-13,31,-7,21,15,-29,32,-14,-24,6,-30,16,22,-8,-27,9,19,
  -1,25,-11,-17,3,1,-19,-9,27,-3,17,11,-25,-6,24,14,-32,8,-22,-16,30 },
{ -30,-14,-8,-24,16,32,22,6,29,13,7,23,-15,-31,-21,-5,-3,-19,-25,-9,17,
  1,11,27,4,20,26,10,-18,-2,-12,-28,25,9,3,19,-11,-27,-17,-1,-26,-10,-4,
  -20,12,28,18,2,8,24,30,14,-22,-6,-16,-32,-7,-23,-29,-13,21,5,15,31 },
{ -29,-23,-7,-13,21,31,15,5,7,13,29,23,-15,-5,-21,-31,3,9,25,19,-11,-1,
  -17,-27,-25,-19,-3,-9,17,27,11,1,-4,-10,-26,-20,12,2,18,28,26,20,4,10,
  -18,-28,-12,-2,30,24,8,14,-22,-32,-16,-6,-8,-14,-30,-24,16,6,22,32 },
{ -28,10,26,-12,20,-2,-18,4,31,-13,-29,15,-23,5,21,-7,-5,23,7,-21,13,-31,
  -15,29,2,-20,-4,18,-10,28,12,-26,27,-9,-25,11,-19,1,17,-3,-32,14,30,
  -16,24,-6,-22,8,6,-24,-8,22,-14,32,16,-30,-1,19,3,-17,9,-27,-11,25 },
{ -27,-17,19,25,-1,-11,9,3,1,11,-9,-3,27,17,-19,-25,5,15,-13,-7,31,21,
  -23,-29,-31,-21,23,29,-5,-15,13,7,-6,-16,14,8,-32,-22,24,30,32,22,-24,
  -30,6,16,-14,-8,28,18,-20,-26,2,12,-10,-4,-2,-12,10,4,-28,-18,20,26 },
{ -26,-30,8,4,25,29,-7,-3,-20,-24,14,10,19,23,-13,-9,-4,-8,30,26,3,7,-29,
  -25,-10,-14,24,20,9,13,-23,-19,18,22,-16,-12,-17,-21,15,11,28,32,-6,
  -2,-27,-31,5,1,12,16,-22,-18,-11,-15,21,17,2,6,-32,-28,-1,-5,31,27 },
{ -25,26,30,-29,-8,7,3,-4,27,-28,-32,31,6,-5,-1,2,17,-18,-22,21,16,-15,
  -11,12,-19,20,24,-23,-14,13,9,-10,11,-12,-16,15,22,-21,-17,18,-9,10,
  14,-13,-24,23,19,-20,-3,4,8,-7,-30,29,25,-26,1,-2,-6,5,32,-31,-27,28 },
{ -24,6,22,-8,32,-14,-30,16,23,-5,-21,7,-31,13,29,-15,19,-1,-17,3,-27,
  9,25,-11,-20,2,18,-4,28,-10,-26,12,-9,27,11,-25,1,-19,-3,17,10,-28,-12,
  26,-2,20,4,-18,14,-32,-16,30,-6,24,8,-22,-13,31,15,-29,5,-23,-7,21 },
{ -23,-7,21,5,-29,-13,31,15,24,8,-22,-6,30,14,-32,-16,20,4,-18,-2,26,10,
  -28,-12,-19,-3,17,1,-25,-9,27,11,-10,-26,12,28,-4,-20,2,18,9,25,-11,
  -27,3,19,-1,-17,13,29,-15,-31,7,23,-5,-21,-14,-30,16,32,-8,-24,6,22 },
{ -22,8,30,-16,24,-6,-32,14,21,-7,-29,15,-23,5,31,-13,-11,25,3,-17,9,-27,
  -1,19,12,-26,-4,18,-10,28,2,-20,17,-3,-25,11,-19,1,27,-9,-18,4,26,-12,
  20,-2,-28,10,16,-30,-8,22,-14,32,6,-24,-15,29,7,-21,13,-31,-5,23 },
{ -21,-5,23,7,-31,-15,29,13,22,6,-24,-8,32,16,-30,-14,18,2,-20,-4,28,12,
  -26,-10,-17,-1,19,3,-27,-11,25,9,-12,-28,10,26,-2,-18,4,20,11,27,-9,
  -25,1,17,-3,-19,15,31,-13,-29,5,21,-7,-23,-16,-32,14,30,-6,-22,8,24 },
{ -20,-24,14,10,19,23,-13,-9,-4,-8,30,26,3,7,-29,-25,-26,-30,8,4,25,29,
  -7,-3,-10,-14,24,20,9,13,-23,-19,18,22,-16,-12,-17,-21,15,11,2,6,-32,
  -28,-1,-5,31,27,28,32,-6,-2,-27,-31,5,1,12,16,-22,-18,-11,-15,21,17 },
{ -19,-9,-25,-3,27,1,17,11,9,19,3,25,-1,-27,-11,-17,13,23,7,29,-5,-31,
  -15,-21,-23,-13,-29,-7,31,5,21,15,-14,-24,-8,-30,6,32,16,22,24,14,30,
  8,-32,-6,-22,-16,20,10,26,4,-28,-2,-18,-12,-10,-20,-4,-26,2,28,12,18 },
{ -18,-2,-12,-28,4,20,26,10,16,32,22,6,-30,-14,-8,-24,12,28,18,2,-26,-10,
  -4,-20,-22,-6,-16,-32,8,24,30,14,-15,-31,-21,-5,29,13,7,23,17,1,11,27,
  -3,-19,-25,-9,21,5,15,31,-7,-23,-29,-13,-11,-27,-17,-1,25,9,3,19 },
{ -17,19,25,-27,3,-1,-11,9,22,-24,-30,32,-8,6,16,-14,18,-20,-26,28,-4,
  2,12,-10,-21,23,29,-31,7,-5,-15,13,-16,14,8,-6,30,-32,-22,24,11,-9,-3,
  1,-25,27,17,-19,15,-13,-7,5,-29,31,21,-23,-12,10,4,-2,26,-28,-18,20 },
{ -16,-26,4,22,-1,-23,13,27,-5,-19,9,31,-12,-30,8,18,-18,-8,30,12,-31,
  -9,19,5,-27,-13,23,1,-22,-4,26,16,10,32,-6,-20,7,17,-11,-29,3,21,-15,
  -25,14,28,-2,-24,24,2,-28,-14,25,15,-21,-3,29,11,-17,-7,20,6,-32,-10 },
{ -15,4,-17,30,23,-28,9,-6,21,-26,11,-8,-13,2,-19,32,3,-16,29,-18,-27,
  24,-5,10,-25,22,-7,12,1,-14,31,-20,14,-1,20,-31,-22,25,-12,7,-24,27,
  -10,5,16,-3,18,-29,-2,13,-32,19,26,-21,8,-11,28,-23,6,-9,-4,15,-30,17 },
{ -14,-21,15,24,-3,-28,2,25,1,26,-4,-27,16,23,-13,-22,22,13,-23,-16,27,
  4,-26,-1,-25,-2,28,3,-24,-15,21,14,12,19,-9,-18,5,30,-8,-31,-7,-32,6,
  29,-10,-17,11,20,-20,-11,17,10,-29,-6,32,7,31,8,-30,-5,18,9,-19,-12 },
{ -13,2,-19,32,21,-26,11,-8,23,-28,9,-6,-15,4,-17,30,1,-14,31,-20,-25,
  22,-7,12,-27,24,-5,10,3,-16,29,-18,16,-3,18,-29,-24,27,-10,5,-22,25,
  -12,7,14,-1,20,-31,-4,15,-30,17,28,-23,6,-9,26,-21,8,-11,-2,13,-32,19 },
{ -12,-30,8,18,-5,-19,9,31,25,15,-21,-3,24,2,-28,-14,-22,-4,26,16,-27,
  -13,23,1,7,17,-11,-29,10,32,-6,-20,14,28,-2,-24,3,21,-15,-25,-31,-9,
  19,5,-18,-8,30,12,20,6,-32,-10,29,11,-17,-7,-1,-23,13,27,-16,-26,4,22 },
{ -11,8,-21,26,19,-32,13,-2,17,-30,15,-4,-9,6,-23,28,7,-12,25,-22,-31,
  20,-1,14,-29,18,-3,16,5,-10,27,-24,10,-5,24,-27,-18,29,-16,3,-20,31,
  -14,1,12,-7,22,-25,-6,9,-28,23,30,-17,4,-15,32,-19,2,-13,-8,11,-26,21 },
{ -10,-32,6,20,-7,-17,11,29,27,13,-23,-1,22,4,-26,-16,-24,-2,28,14,-25,
  -15,21,3,5,19,-9,-31,12,30,-8,-18,16,26,-4,-22,1,23,-13,-27,-29,-11,
  17,7,-20,-6,32,10,18,8,-30,-12,31,9,-19,-5,-3,-21,15,25,-14,-28,2,24 },
{ -9,6,-23,28,17,-30,15,-4,19,-32,13,-2,-11,8,-21,26,5,-10,27,-24,-29,
  18,-3,16,-31,20,-1,14,7,-12,25,-22,12,-7,22,-25,-20,31,-14,1,-18,29,
  -16,3,10,-5,24,-27,-8,11,-26,21,32,-19,2,-13,30,-17,4,-15,-6,9,-28,23 },
{ -8,-19,32,11,-26,-13,2,21,30,9,-6,-17,4,23,-28,-15,5,18,-29,-10,27,16,
  -3,-24,-31,-12,7,20,-1,-22,25,14,12,31,-20,-7,22,1,-14,-25,-18,-5,10,
  29,-16,-27,24,3,-9,-30,17,6,-23,-4,15,28,19,8,-11,-32,13,26,-21,-2 },
{ -7,-32,-10,-17,6,29,11,20,12,19,5,30,-9,-18,-8,-31,1,26,16,23,-4,-27,
  -13,-22,-14,-21,-3,-28,15,24,2,25,31,8,18,9,-30,-5,-19,-12,-20,-11,-29,
  -6,17,10,32,7,-25,-2,-24,-15,28,3,21,14,22,13,27,4,-23,-16,-26,-1 },
{ -6,-29,-11,-20,7,32,10,17,9,18,8,31,-12,-19,-5,-30,4,27,13,22,-1,-26,
  -16,-23,-15,-24,-2,-25,14,21,3,28,30,5,19,12,-31,-8,-18,-9,-17,-10,-32,
  -7,20,11,29,6,-28,-3,-21,-14,25,2,24,15,23,16,26,1,-22,-13,-27,-4 },
{ -5,-18,29,10,-27,-16,3,24,31,12,-7,-20,1,22,-25,-14,8,19,-32,-11,26,
  13,-2,-21,-30,-9,6,17,-4,-23,28,15,9,30,-17,-6,23,4,-15,-28,-19,-8,11,
  32,-13,-26,21,2,-12,-31,20,7,-22,-1,14,25,18,5,-10,-29,16,27,-24,-3 },
{ 1,-14,31,-20,-25,22,-7,12,26,-21,8,-11,-2,13,-32,19,-4,15,-30,17,28,
  -23,6,-9,-27,24,-5,10,3,-16,29,-18,-13,2,-19,32,21,-26,11,-8,-22,25,
  -12,7,14,-1,20,-31,16,-3,18,-29,-24,27,-10,5,23,-28,9,-6,-15,4,-17,30 },
{ 2,-28,-14,24,15,-21,-3,25,-19,9,31,-5,-30,8,18,-12,32,-6,-20,10,17,-11,
  -29,7,-13,23,1,-27,-4,26,16,-22,-8,30,12,-18,-9,19,5,-31,21,-15,-25,
  3,28,-2,-24,14,-26,4,22,-16,-23,13,27,-1,11,-17,-7,29,6,-32,-10,20 },
{ 3,-16,29,-18,-27,24,-5,10,28,-23,6,-9,-4,15,-30,17,-2,13,-32,19,26,-21,
  8,-11,-25,22,-7,12,1,-14,31,-20,-15,4,-17,30,23,-28,9,-6,-24,27,-10,
  5,16,-3,18,-29,14,-1,20,-31,-22,25,-12,7,21,-26,11,-8,-13,2,-19,32 },
{ 4,-26,-16,22,13,-23,-1,27,-17,11,29,-7,-32,6,20,-10,30,-8,-18,12,19,
  -9,-31,5,-15,21,3,-25,-2,28,14,-24,-6,32,10,-20,-11,17,7,-29,23,-13,
  -27,1,26,-4,-22,16,-28,2,24,-14,-21,15,25,-3,9,-19,-5,31,8,-30,-12,18 },
{ 5,-10,27,-24,-29,18,-3,16,30,-17,4,-15,-6,9,-28,23,-8,11,-26,21,32,-19,
  2,-13,-31,20,-1,14,7,-12,25,-22,-9,6,-23,28,17,-30,15,-4,-18,29,-16,
  3,10,-5,24,-27,12,-7,22,-25,-20,31,-14,1,19,-32,13,-2,-11,8,-21,26 },
{ 6,-32,-10,20,11,-17,-7,29,-23,13,27,-1,-26,4,22,-16,28,-2,-24,14,21,
  -15,-25,3,-9,19,5,-31,-8,30,12,-18,-4,26,16,-22,-13,23,1,-27,17,-11,
  -29,7,32,-6,-20,10,-30,8,18,-12,-19,9,31,-5,15,-21,-3,25,2,-28,-14,24 },
{ 7,-12,25,-22,-31,20,-1,14,32,-19,2,-13,-8,11,-26,21,-6,9,-28,23,30,-17,
  4,-15,-29,18,-3,16,5,-10,27,-24,-11,8,-21,26,19,-32,13,-2,-20,31,-14,
  1,12,-7,22,-25,10,-5,24,-27,-18,29,-16,3,17,-30,15,-4,-9,6,-23,28 },
{ 8,-30,-12,18,9,-19,-5,31,-21,15,25,-3,-28,2,24,-14,26,-4,-22,16,23,-13,
  -27,1,-11,17,7,-29,-6,32,10,-20,-2,28,14,-24,-15,21,3,-25,19,-9,-31,
  5,30,-8,-18,12,-32,6,20,-10,-17,11,29,-7,13,-23,-1,27,4,-26,-16,22 },
{ 9,-19,8,-30,-12,18,-5,31,4,-26,13,-23,-1,27,-16,22,-15,21,-2,28,14,-24,
  3,-25,-6,32,-11,17,7,-29,10,-20,-17,11,-32,6,20,-10,29,-7,-28,2,-21,
  15,25,-3,24,-14,23,-13,26,-4,-22,16,-27,1,30,-8,19,-9,-31,5,-18,12 },
{ 10,-29,-6,17,7,-20,-11,32,-5,18,9,-30,-12,31,8,-19,24,-3,-28,15,25,-14,
  -21,2,-27,16,23,-4,-22,1,26,-13,-16,27,4,-23,-1,22,13,-26,3,-24,-15,
  28,14,-25,-2,21,-18,5,30,-9,-31,12,19,-8,29,-10,-17,6,20,-7,-32,11 },
{ 13,-23,4,-26,-16,22,-1,27,8,-30,9,-19,-5,31,-12,18,-11,17,-6,32,10,-20,
  7,-29,-2,28,-15,21,3,-25,14,-24,-21,15,-28,2,24,-14,25,-3,-32,6,-17,
  11,29,-7,20,-10,19,-9,30,-8,-18,12,-31,5,26,-4,23,-13,-27,1,-22,16 },
{ 14,-24,3,-25,-15,21,-2,28,7,-29,10,-20,-6,32,-11,17,-12,18,-5,31,9,-19,
  8,-30,-1,27,-16,22,4,-26,13,-23,-22,16,-27,1,23,-13,26,-4,-31,5,-18,
  12,30,-8,19,-9,20,-10,29,-7,-17,11,-32,6,25,-3,24,-14,-28,2,-21,15 }
};

const int num7x7=23;
Sbyte code7x7[num7x7][7*7]={
{ -24,-21,11,5,23,16,-10,-12,-2,19,22,-14,-20,7,-1,3,8,-17,4,14,-11,-9,-18,-13,
  0,13,18,9,15,6,-4,17,-8,-23,-3,21,20,-6,-22,1,2,-16,10,12,-15,-5,-19,-7,24 },
{ -23,-22,2,5,14,17,7,-17,-3,-11,-12,6,15,22,10,11,4,9,-8,-20,-6,1,18,-13,0,13,
  -18,-1,20,-10,8,-9,-4,19,-24,16,-15,24,12,-19,3,-21,-7,21,-14,-5,-2,-16,23 },
{ -22,-21,-15,16,23,5,14,-13,4,-9,-10,1,6,21,17,-1,20,8,-18,-7,-19,24,2,12,0,
  -12,-2,-24,19,13,18,-8,-20,-5,-17,-11,-6,-3,10,11,-4,3,-14,9,-23,-16,15,7,22 },
{ -21,-17,14,-6,20,23,-13,9,10,7,-18,-1,8,-15,-4,-3,11,22,5,-19,-12,-24,-2,16,
  0,-16,2,24,12,19,-5,-22,-11,3,4,15,-8,-23,18,17,-10,-9,13,1,-20,6,-14,-7,21 },
{ -20,-23,-17,16,23,7,14,-11,-8,19,-2,-3,10,-5,13,15,12,-24,-4,9,-21,6,18,-22,
  0,22,-18,-6,21,-9,4,24,-12,-15,-13,5,-10,3,2,-19,8,11,-14,17,1,-16,-7,-1,20 },
{ -19,-22,-5,8,13,14,11,-14,-21,15,24,9,-3,-10,7,4,17,16,-1,-20,-23,12,18,-6,
  0,6,-18,-12,23,20,1,-16,-17,-4,-7,2,3,-9,-24,-15,21,22,-11,-2,-13,-8,5,10,19 },
{ -18,-9,11,-8,23,17,-16,5,6,7,-2,1,-4,-13,-11,21,20,-24,12,3,-21,-14,-10,-22,
  0,22,10,14,13,-7,-12,24,-20,-17,19,9,4,15,2,-23,-6,-1,16,-5,-19,8,-15,-3,18 },
{ -17,-20,-7,16,23,4,1,-15,-3,14,24,10,-21,-9,5,2,19,8,-11,-10,-13,6,-18,-12,
  0,12,18,-6,13,22,11,-8,-19,-14,-5,9,21,-2,-24,-22,3,15,-1,-4,-23,-16,7,20,17 },
{ -16,-24,12,23,13,1,-9,-6,7,-17,-22,3,15,20,-10,-3,11,-14,4,17,-5,-18,8,19,0,
  18,-8,-19,10,21,-11,-23,-4,2,5,24,-15,-2,22,-21,-7,-1,16,6,-12,14,-13,-20,9 },
{ -15,-23,-14,19,24,4,5,-11,8,1,-22,-10,14,20,-6,13,7,-9,-19,-4,18,-12,16,12,
  0,17,-16,-17,6,-1,9,-20,3,21,-18,23,-24,-13,22,-7,2,-3,15,11,-2,10,-8,-21,-5 },
{ -14,-24,-15,23,19,1,10,-7,-2,8,22,15,-20,-16,3,4,12,5,6,-9,-21,-17,-18,11,0,
  -11,18,17,21,13,-6,-5,-12,-8,-3,24,20,-19,-22,-4,2,-1,-10,7,9,-23,-13,16,14 },
{ -13,-22,-11,8,19,14,5,-9,-21,2,24,22,-3,-15,1,4,23,16,-7,-20,-17,-6,18,12,0,
  -12,-18,6,17,20,7,-16,-23,-4,-1,15,3,-14,-24,-10,21,9,-5,-2,-19,-8,11,10,13 },
{ -12,-9,21,24,-13,-15,4,-3,-8,-23,-2,7,10,19,11,1,-20,16,14,-17,-5,22,18,6,0,
  -6,-18,-22,5,-7,-14,-16,20,23,-11,-19,-10,17,2,-1,8,3,-4,15,13,-24,-21,9,12 },
{ -11,-22,-13,18,22,4,2,-12,-19,-15,24,6,-5,21,-10,13,17,-9,16,-4,-23,20,14,7,
  0,-7,-14,-20,23,-6,-16,9,-17,-3,10,-8,5,8,-24,1,19,-1,-2,15,12,-18,-21,3,11 },
{ -10,-24,-15,18,24,6,1,-16,-2,-3,21,12,-19,7,-5,-12,20,9,-8,3,-7,22,-17,-11,
  0,11,17,-22,16,23,8,-9,-20,-14,-4,-6,19,14,-21,-23,2,15,-1,13,-13,-18,4,5,10 },
{ -9,-23,-2,22,17,1,-6,2,-18,4,21,-11,-3,5,-17,11,24,-7,12,-4,-19,-16,15,10,0,
  19,-15,-13,20,-1,-12,-22,-24,23,16,14,3,-14,-21,-8,18,8,6,13,-10,7,-5,-20,9 },
{ -8,-24,-2,13,14,11,-4,-19,-3,-17,18,16,-15,20,-20,-16,23,-1,7,17,-10,9,-12,-5,
  0,5,12,-9,24,21,-7,1,-23,-22,6,10,15,22,-18,-21,3,-11,4,19,-14,-13,2,-6,8 },
{ -7,-21,-20,-2,20,23,7,-11,-1,-8,24,10,-23,9,19,-17,-14,22,-10,-5,5,-4,-12,-6,
  0,6,12,4,-9,21,16,-22,8,1,-15,15,13,14,-24,-16,11,-13,-3,17,18,2,-18,-19,3 },
{ -6,-24,-9,3,13,21,2,-12,-4,-23,-14,24,18,11,-15,-1,20,-11,-10,12,5,-7,22,15,
  0,-5,-22,-3,23,16,10,1,-20,-17,-13,19,-18,8,14,-19,4,-8,-2,9,-21,7,17,-16,6 },
{ -5,-18,-16,20,16,-2,5,7,1,-13,23,-7,-24,13,11,22,-11,-21,-12,-1,12,-22,-10,17,
  0,24,10,-19,-9,2,19,-20,4,18,-14,15,9,-4,-23,-17,14,6,3,-6,8,21,-8,-15,-3 },
{ -4,-19,-12,2,18,17,-2,-16,23,-8,-24,8,1,16,15,-10,-14,4,-21,6,20,5,-22,13,0,
  -11,22,-7,-20,10,14,7,21,-17,-15,11,-1,-5,24,3,-23,-9,9,19,12,-13,-18,-6,-3 },
{ -3,-19,-14,6,15,13,2,-13,23,-6,-24,7,1,12,17,-18,-16,10,-21,8,20,4,-22,-5,0,
  5,22,-4,-17,18,16,-7,21,-11,-20,9,-1,11,24,-12,-23,-8,3,19,14,-9,-15,-10,-2 },
{ -2,-23,-10,8,11,15,1,-13,21,-12,-24,12,3,13,17,-16,-20,6,-19,10,22,4,-18,5,
  0,-5,18,-4,-17,19,16,-8,23,-11,-22,9,-3,7,24,-7,-21,-9,2,20,14,-6,-15,-14,-1 }
};

void putCenter9x9(int **b, const int o, const int n) {
//   ------------
  const Sbyte *code=code9x9[random_(num9x9)]; int i=0;
  for (int r=o; r<=n; ++r) for (int c=o; c<=n; ++c) b[r][c]=code[i++]; complement(o, n); Turn(o, n);
} // putCenter9x9

void putCenter8x8(int **b, const int o, const int n) {
//   ------------
  const Sbyte *code=code8x8[random_(num8x8)]; int i=0;
  for (int r=o; r<=n; ++r) for (int c=o; c<=n; ++c) b[r][c]=code[i++]; complement(o, n); Turn(o, n);
} // putCenter8x8

void putCenter7x7(int **b, const int o, const int n) {
//   ------------
  const Sbyte *code=code7x7[random_(num7x7)]; int i=0;
  for (int r=o; r<=n; ++r) for (int c=o; c<=n; ++c) b[r][c]=code[i++]; complement(o, n); Turn(o, n);
} // putCenter7x7

void putEvenBorders(int **b, const int o, const int n) {
//   --------------
  const int m=n-1, p=o+1, upb=o+n, half=(n-o)/2-1; int i=0, v, length;
  length=half; for (int c=p+1; c<m; c+=2) {
    i=random_(length); v=tSideOa[i]; b[o][c]=v; b[m][c]=-v;
    for (int j=i; j<length; ++j) tSideOa[j]=tSideOa[j+1]; --length;
  }
  length=half; for (int c=p+2; c<m; c+=2) {
    i=random_(length); v=tSideOb[i]; b[o][c]=v; b[m][c]=-v;
    for (int j=i; j<length; ++j) tSideOb[j]=tSideOb[j+1]; --length;
  }
  length=half; for (int c=p+1; c<m; c+=2) {
    i=random_(length); v=tSideIc[i]; b[p][c]=v; b[n][c]=-v;
    for (int j=i; j<length; ++j) tSideIc[j]=tSideIc[j+1]; --length;
  }
  length=half; for (int c=p+2; c<m; c+=2) {
    i=random_(length); v=tSideId[i]; b[p][c]=v; b[n][c]=-v;
    for (int j=i; j<length; ++j) tSideId[j]=tSideId[j+1]; --length;
  }
  length=half; for (int r=p+1; r<m; r+=2) {
    i=random_(length); v=rSideOe[i]; b[r][n]=v; b[r][p]=-v;
    for (int j=i; j<length; ++j) rSideOe[j]=rSideOe[j+1]; --length;
  }
  length=half; for (int r=p+2; r<m; r+=2) {
    i=random_(length); v=rSideOf[i]; b[r][n]=v; b[r][p]=-v;
    for (int j=i; j<length; ++j) rSideOf[j]=rSideOf[j+1]; --length;
  }
  length=half; for (int r=p+1; r<m; r+=2) {
    i=random_(length); v=rSideIg[i]; b[r][m]=v; b[r][o]=-v;
    for (int j=i; j<length; ++j) rSideIg[j]=rSideIg[j+1]; --length;
  }
  length=half; for (int r=p+2; r<m; r+=2) {
    i=random_(length); v=rSideIh[i]; b[r][m]=v; b[r][o]=-v;
    for (int j=i; j<length; ++j) rSideIh[j]=rSideIh[j+1]; --length;
  }
  Turn(o, n);
} // putEvenBorders

void putOddBorders(int **b, const int o, const int n) {
//   -------------
  const int m=n-1, p=o+1, upb=o+n, half=(n-o)/2; int i=0, v, length;
  length=half-1; for (int c=p+1; c<m; c+=2) {
    i=random_(length); v=tSideOa[i]; b[o][c]=v; b[n][c]=-v;
    for (int j=i; j<length; ++j) tSideOa[j]=tSideOa[j+1]; --length;
  }
  length=half; for (int c=p; c<n; c+=2) {
    i=random_(length); v=tSideOb[i]; b[o][c]=v; b[n][c]=-v;
    for (int j=i; j<length; ++j) tSideOb[j]=tSideOb[j+1]; --length;
  }
  length=half+1; for (int c=o; c<=n; c+=2) {
    i=random_(length); v=tSideIc[i]; b[p][c]=v; b[m][c]=-v;
    for (int j=i; j<length; ++j) tSideIc[j]=tSideIc[j+1]; --length;
  }
  length=half-2; for (int c=p+2; c<m; c+=2) {
    i=random_(length); v=tSideId[i]; b[p][c]=v; b[m][c]=-v;
    for (int j=i; j<length; ++j) tSideId[j]=tSideId[j+1]; --length;
  }
  length=half-1; for (int r=p+1; r<m; r+=2) {
    i=random_(length); v=rSideOe[i]; b[r][n]=v; b[r][o]=-v;
    for (int j=i; j<length; ++j) rSideOe[j]=rSideOe[j+1]; --length;
  }
  length=half-2; for (int r=p+2; r<m; r+=2) {
    i=random_(length); v=rSideOf[i]; b[r][n]=v; b[r][o]=-v;
    for (int j=i; j<length; ++j) rSideOf[j]=rSideOf[j+1]; --length;
  }
  length=half-1; for (int r=p+1; r<m; r+=2) {
    i=random_(length); v=rSideIg[i]; b[r][m]=v; b[r][p]=-v;
    for (int j=i; j<length; ++j) rSideIg[j]=rSideIg[j+1]; --length;
  }
  length=half-2; for (int r=p+2; r<m; r+=2) {
    i=random_(length); v=rSideIh[i]; b[r][m]=v; b[r][p]=-v;
    for (int j=i; j<length; ++j) rSideIh[j]=rSideIh[j+1]; --length;
  }
  Turn(o, n);
} // putOddBorders

void makeOdd9(int **b, const int size) {
//   --------
  int v=41, /* (9*9+1)/2; */ o=(size-9)/2, n=o+8; putCenter9x9(b, o, n); 
  for (int i=13; i<=size; i+=4) {
    int ca=0, cb=0, cc=0, cd=0, ce=0, cf=0, cg=0, ch=0, k;
    o=(size-i)/2;  n=o+i-1; const int j=(i-9)/4, p=o+1, m=n-1;
    int *ta=tSideOa, *tb=tSideOb, *tc=tSideIc, *td=tSideId, *re=rSideOe, *rf=rSideOf, *rg=rSideIg, *rh=rSideIh;
    b[n][n]=-v; b[o][n]=v++; b[p][m]=-v; b[m][m]=v++; // SE NE
    b[n][o]=-v; b[o][o]=v++; b[p][p]=-v; b[m][p]=v++; // SW NW
    re[ce++]=-v++; td[cd++]=v++; rg[cg++]=v++; rg[cg++]=v++; re[ce++]=-v++;
    if (j==1) { td[cd++]=v++; td[cd++]=v++; }
    else if (j&1) { td[cd++]=v++; tc[cc++]=v++; td[cd++]=v++; }
    else { td[cd++]=v++; td[cd++]=v++; tc[cc++]=v++; } tc[cc++]=v++; if (j!=2) tc[cc++]=v++; k=j/2;
    if (j&1) { // 1 3 5 ...
      if (j==3) {
        tb[cb++]=v++; tb[cb++]=-v++; tb[cb++]=-v++; tc[cc++]=v++;  tb[cb++]=v++; tb[cb++]=v++; tb[cb++]=-v++;
      } else {
        tb[cb++]=v++; tc[cc++]=v++; tb[cb++]=-v++; tb[cb++]=-v++; tb[cb++]=v++; tb[cb++]=-v++; tb[cb++]=v++;
      }
    } else { // 2 4 6 ...
      if (j==2) { tb[cb++]=v++; tb[cb++]=-v++; tc[cc++]=v++; tb[cb++]=-v++; tb[cb++]=v++; }
      else { tc[cc++]=v++; ++k; }
    }
    while (k--) { tb[cb++]=v++; tb[cb++]=-v++; tb[cb++]=-v++; tb[cb++]=v++; } td[cd++]=-v++;
    if (j>1) { td[cd++]=-v++;
      if (j==2) { tc[cc++]=v++; td[cd++]=v++; }
      else { td[cd++]=-v++;
        if (j==3) { td[cd++]=v++; td[cd++]=v++; }
        else if (j==4) { td[cd++]=v++; td[cd++]=-v++; td[cd++]=v++; td[cd++]=v++; }
        else {
          td[cd++]=v++; td[cd++]=v++; td[cd++]=-v++; td[cd++]=-v++;
          if (j>5) { td[cd++]=v++; td[cd++]=-v++; } td[cd++]=v++; td[cd++]=v++;
          if (j>6) {
            td[cd++]=-v++; k=(j&1) ? (j-7)/2 : (j-8)/2; int l=(j&1) ? k : k+1;
            while (k--) { td[cd++]=v++; td[cd++]=-v++; } while (l--) { td[cd++]=-v++; td[cd++]=v++; } td[cd++]=v++;
          }
        }
      }
    }
    if (j&1) { rh[ch++]=v++; rh[ch++]=-v++; rh[ch++]=-v++; rh[ch++]=v++;
      if (j==1) { ta[ca++]=v++; ta[ca++]=-v++; } else { rh[ch++]=v++; rh[ch++]=-v++; k=j-1; }
    } else {
      rh[ch++]=v++; rh[ch++]=-v++; rh[ch++]=v++; rh[ch++]=-v++; rh[ch++]=-v++; ta[ca++]=v++; rh[ch++]=v++; k=j-2; 
    }
    if (j!=1) { while (k--) ta[ca++]=v++; k=j-2; while (k--) tc[cc++]=v++; }
    k=j; while (k--) { re[ce++]=-v++; rg[cg++]=v++; }
    if (j<10) {
      switch (j) {
        case 1: ta[ca++]=-v++; ta[ca++]=v++; break; case 2: ta[ca++]=-v++; ta[ca++]=v++; break;
        case 3: tc[cc++]=-v++; ta[ca++]=v++; rh[ch++]=-v++; rh[ch++]=v++; ta[ca++]=-v++; break;
        case 4: rh[ch++]=v++; rh[ch++]=-v++; ta[ca++]=v++; tc[cc++]=-v++;
                rh[ch++]=-v++; rh[ch++]=v++; ta[ca++]=-v++; break;
        case 5: rh[ch++]=-v++; rh[ch++]=v++; ta[ca++]=v++; rh[ch++]=v++; rh[ch++]=-v++; tc[cc++]=-v++;
                rh[ch++]=-v++; rh[ch++]=v++; ta[ca++]=-v++; ta[ca++]=v++; break;
        case 6: rh[ch++]=v++; rh[ch++]=-v++; ta[ca++]=v++; rh[ch++]=-v++; rh[ch++]=v++; rh[ch++]=v++;
                rh[ch++]=-v++; rh[ch++]=-v++; rh[ch++]=v++; tc[cc++]=-v++; ta[ca++]=-v++; ta[ca++]=v++; break;
        case 7: ta[ca++]=v++; rh[ch++]=-v++; rh[ch++]=v++; k=2;
                while (k--) { rh[ch++]=v++; rh[ch++]=-v++; rh[ch++]=-v++; rh[ch++]=v++;  }
                tc[cc++]=-v++; ta[ca++]=-v++; ta[ca++]=v++; break;
        case 8: ta[ca++]=v++; k=3;
                while (k--) { rh[ch++]=v++; rh[ch++]=-v++; rh[ch++]=-v++; rh[ch++]=v++; }
                ta[ca++]=-v++; ta[ca++]=v++; tc[cc++]=-v++; break;
        case 9: ta[ca++]=v++; rh[ch++]=-v++; rh[ch++]=v++; k=3;
                while (k--) { rh[ch++]=v++; rh[ch++]=-v++; rh[ch++]=-v++; rh[ch++]=v++;  }
                ta[ca++]=v++; ta[ca++]=-v++; tc[cc++]=-v++; break;
        default: printf("Program error: makeOdd9 j %d\n", j);
      }
    } else { int a, b; bool boo=(j&2)!=0; ta[ca++]=v++; 
      if (j&1) { a=boo ? (j-11)/4 : (j-9)/4; b=boo ? (j-a+1)/3-1 : (j-a)/3; rh[ch++]=-v++; rh[ch++]=v++; }
      else { a=boo ? (j-10)/4 : (j-12)/4; b=boo ? (j-a-1)/3+1 : (j-a)/3; boo=!boo; }
      while (b--) { rh[ch++]=v++; rh[ch++]=-v++; rh[ch++]=-v++; rh[ch++]=v++; }
      if (boo) { rh[ch++]=v++; rh[ch++]=-v++; } ta[ca++]=v++; if (boo) { rh[ch++]=-v++; rh[ch++]=v++; }
      while (a--) { rh[ch++]=v++; rh[ch++]=-v++; rh[ch++]=-v++; rh[ch++]=v++; } ta[ca++]=-v++;
    }
    if (j<10) {
      if (j&1) { // 1 3 5 7 9
        if (j==3) { rf[cf++]=v++; rf[cf++]=-v++; ta[ca++]=v++; rf[cf++]=-v++; rf[cf++]=v++; }
        else { k=(j-1)/2;  while (k--) { rf[cf++]=v++; rf[cf++]=-v++; rf[cf++]=-v++; rf[cf++]=v++; }}
        rf[cf++]=v++; rf[cf++]=-v++; tc[cc++]=v++; rf[cf++]=-v++; rf[cf++]=v++;
      } else { // 2 4 6 8
        if (j==2) {
          rf[cf++]=v++; rf[cf++]=-v++; rf[cf++]=-v++; ta[ca++]=v++; rf[cf++]=v++; rf[cf++]=v++; rf[cf++]=-v++; }
        else if (j==4) { rf[cf++]=v++; rf[cf++]=-v++; ta[ca++]=v++; rf[cf++]=-v++; rf[cf++]=v++; }
        else { k=j/2-1; while (k--) { rf[cf++]=v++; rf[cf++]=-v++; rf[cf++]=-v++; rf[cf++]=v++; }}
        if (j!=2) { rf[cf++]=v++; rf[cf++]=-v++; rf[cf++]=v++; rf[cf++]=-v++; rf[cf++]=-v++; tc[cc++]=v++; rf[cf++]=v++; }
      }
    } else {
      int a, b;
      if (j&1) { b=(j&2) ? (j-11)/4 : (j-13)/4+1; a=(j&2) ? (j-b+1)/3 : (j-b)/3+1; }
      else     { b=(j&2) ? (j-10)/4 : (j-12)/4+1, a=(j&2) ? (j-b-1)/3 : (j-b+1)/3; }
      while (b--) { rf[cf++]=v++; rf[cf++]=-v++; rf[cf++]=-v++; rf[cf++]=v++;  }
      if (j&2) { rf[cf++]=v++; rf[cf++]=-v++; } tc[cc++]=-v++; if (j&2) { rf[cf++]=-v++; rf[cf++]=v++; }
      while (a--) { rf[cf++]=v++; rf[cf++]=-v++; rf[cf++]=-v++; rf[cf++]=v++;  }
      if (j&1) { rf[cf++]=v++; rf[cf++]=-v++; tc[cc++]=v++; rf[cf++]=-v++; rf[cf++]=v++; }
      else { rf[cf++]=v++; rf[cf++]=-v++; rf[cf++]=v++; rf[cf++]=-v++; rf[cf++]=-v++; tc[cc++]=v++; rf[cf++]=v++; }
    }
    tc[cc++]=-v++; if (j==2) tc[cc++]=v++; else tc[cc++]=-v++; tc[cc++]=-v++;
    if (j>3) {
      tc[cc++]=-v++; k=j-2; while (k--) ta[ca++]=-v++; k=j-3; while (k--) tc[cc++]=-v++; ta[ca++]=-v++; ta[ca++]=-v++;
    } else {
      if (j>1) { if (j==2) tc[cc++]=-v++; ta[ca++]=-v++; tc[cc++]=-v++; ta[ca++]=-v++; if (j==3) ta[ca++]=-v++; }
    }
    k=j+1; while (k--) { re[ce++]=v++; rg[cg++]=-v++; } ta[ca++]=-v++; putOddBorders(b, o, n);
  } // for (i=13; ...
  biggestValue=v-1; //peekSquare(bSquare,size);
}  // makeOdd9

void makeEven8(int **b, const int size) {
//   ---------
  int v=33, /* 32.5; (8*8+1)/2; */ o=(size-8)/2, n=o+7; putCenter8x8(b, o, n); 
  for (int i=12; i<=size; i+=4) { int ca=0, cb=0, cc=0, cd=0, ce=0, cf=0, cg=0, ch=0, k;
    o=(size-i)/2;  n=o+i-1; const int j=(i-8)/4, p=o+1, m=n-1;
    int *ta=tSideOa, *tb=tSideOb, *tc=tSideIc, *td=tSideId, *re=rSideOe, *rf=rSideOf, *rg=rSideIg, *rh=rSideIh;
    b[o][o]=-v; b[m][o]=v++; b[p][n]=-v; b[n][n]=v++; // NW SE
    b[n][p]=-v; b[p][p]=v++; b[m][m]=-v; b[o][m]=v++; // NW SE
    b[o][n]=-v; b[m][n]=v++; b[p][o]=-v; b[n][o]=v++; // NE SW
    b[n][m]=-v; b[p][m]=v++; b[m][p]=-v; b[o][p]=v++; // NE SW
    if (j&1) {
      ta[ca++]=v++; ta[ca++]=-v++; ta[ca++]=v++; tb[cb++]=v++; ta[ca++]=-v++; tb[cb++]=-v++; tb[cb++]=v++; tb[cb++]=-v++;
      tc[cc++]=v++; td[cd++]=v++; tc[cc++]=-v++; td[cd++]=-v++; tc[cc++]=-v++; tc[cc++]=v++; td[cd++]=-v++; td[cd++]=v++;
      re[ce++]=v++; re[ce++]=-v++; re[ce++]=-v++; re[ce++]=v++; rf[cf++]=v++; rf[cf++]=-v++; rf[cf++]=-v++; rf[cf++]=v++;
      rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=-v++; rg[cg++]=v++; rh[ch++]=v++; rh[ch++]=-v++; rh[ch++]=-v++; rh[ch++]=v++;
    } else {
      k=3; while (k--) { ta[ca++]=v++; ta[ca++]=-v++; tb[cb++]=v++; tb[cb++]=-v++; }
      tc[cc++]=v++; tc[cc++]=-v++; tc[cc++]=-v++; tc[cc++]=v++; tc[cc++]=v++; tc[cc++]=-v++; td[cd++]=v++; td[cd++]=-v++;
      td[cd++]=-v++; td[cd++]=v++; td[cd++]=v++; td[cd++]=-v++; k=2;
      while (k--) {
        re[ce++]=v++; re[ce++]=-v++; rf[cf++]=v++; rf[cf++]=-v++; rg[cg++]=v++; rg[cg++]=-v++; rh[ch++]=v++; rh[ch++]=-v++;
      }
      re[ce++]=-v++; rf[cf++]=-v++; re[ce++]=v++; rf[cf++]=v++; rg[cg++]=-v++; rh[ch++]=-v++; rg[cg++]=v++; rh[ch++]=v++;
    }
    k=(j&1) ? j/2 : j/2-1;
    while (k--) {
      ta[ca++]=v++; ta[ca++]=-v++; ta[ca++]=-v++; ta[ca++]=v++; tb[cb++]=v++; tb[cb++]=-v++; tb[cb++]=-v++; tb[cb++]=v++;
      tc[cc++]=v++; tc[cc++]=-v++; tc[cc++]=-v++; tc[cc++]=v++; td[cd++]=v++; td[cd++]=-v++; td[cd++]=-v++; td[cd++]=v++;
      re[ce++]=v++; re[ce++]=-v++; re[ce++]=-v++; re[ce++]=v++; rf[cf++]=v++; rf[cf++]=-v++; rf[cf++]=-v++; rf[cf++]=v++;
      rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=-v++; rg[cg++]=v++; rh[ch++]=v++; rh[ch++]=-v++; rh[ch++]=-v++; rh[ch++]=v++;
    }
    putEvenBorders(b, o, n);
  } // for (i=12; ...
  biggestValue=v-1; //peekSquare(bSquare,size);
}  // makeEven8

void makeOdd7(int **b, const int size) {
//   --------
  int v=25, /* (7*7+1)/2; */ o=(size-7)/2, n=o+6; putCenter7x7(b, o, n); 
  for (int i=11; i<=size; i+=4) { int ca=0, cb=0, cc=0, cd=0, ce=0, cf=0, cg=0, ch=0, k;
    o=(size-i)/2;  n=o+i-1; const int j=(i-7)/4, p=o+1, m=n-1;
    int *ta=tSideOa, *tb=tSideOb, *tc=tSideIc, *td=tSideId, *re=rSideOe, *rf=rSideOf, *rg=rSideIg, *rh=rSideIh;
    b[m][m]=-v; b[p][m]=v++; /* SE NE */ rf[cf++]=-v++; b[m][p]=-v; b[p][p]=v++; // SW NW
    rh[ch++]=v++; rh[ch++]=v++; rf[cf++]=-v++; if (j>1) { ta[ca++]=-v++; ta[ca++]=v++; }
    if (j&1) { /* 1 3 5 7 ... */ rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=-v++; rg[cg++]=v++;
      if (j&2) { /* 3 7 11 */ k=j/4+1;
        while (k--) { rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=-v++; rg[cg++]=v++; } k=j/4; td[cd++]=v++;
        while (k--) { rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=-v++; rg[cg++]=v++; }
      } else { /* 1 5 9 13 */ k=j/4; while (k--) { rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=-v++; rg[cg++]=v++; }
        if (j==1) {tb[cb++]=v++; tb[cb++]=v++; tb[cb++]=v++; } k=j/4-1;
        if (k>=0) { rg[cg++]=v++; rg[cg++]=-v++; td[cd++]=v++; rg[cg++]=-v++; rg[cg++]=v++;
          while (k--) { rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=-v++; rg[cg++]=v++; }
        }
      }
    } else { // 2 4 6
      if (j&2) { // 2 6 10
        if (j==2) {
          rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=-v++; tb[cb++]=v++;
          rg[cg++]=v++; td[cd++]=v++; tb[cb++]=v++; tb[cb++]=v++; re[ce++]=v++; tb[cb++]=v++;
          re[ce++]=-v++; re[ce++]=-v++; re[ce++]=v++; re[ce++]=-v++; re[ce++]=v++;
        } else {
          k=j/4+1; while (k--) { rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=-v++; rg[cg++]=v++; }
          rg[cg++]=-v++; rg[cg++]=v++; rg[cg++]=v++; td[cd++]=v++; rg[cg++]=-v++; rg[cg++]=-v++; rg[cg++]=v++;
          k=j/4-1; while (k--) { rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=-v++; rg[cg++]=v++; }
        }
      } else { // 4 8 12
        k=j/4; while (k--) { rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=-v++; rg[cg++]=v++; }
        rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=-v++; td[cd++]=v++; rg[cg++]=v++;
        k=j/4-1; while (k--) { rg[cg++]=v++; rg[cg++]=-v++; rg[cg++]=-v++; rg[cg++]=v++; }
      }
    }
    if (j>2) {  k=j-2; while (k--) td[cd++]=v++; k=j+1; while (k--) tb[cb++]=v++; }
    if (j&1) { // 1 3 5 7 
      if (j&2) { // 3 7 11
        k=j/4; while (k--) { re[ce++]=v++; re[ce++]=-v++; re[ce++]=-v++; re[ce++]=v++; } tb[cb++]=v++;
        k=j/4+2; while (k--) { re[ce++]=v++; re[ce++]=-v++; re[ce++]=-v++; re[ce++]=v++; }
      } else { /* 1 5 9 13 */ k=j/4-1;
        if (k>=0) {
          while (k--) { re[ce++]=v++; re[ce++]=-v++; re[ce++]=-v++; re[ce++]=v++; }
          re[ce++]=v++; re[ce++]=-v++; tb[cb++]=v++; re[ce++]=-v++; re[ce++]=v++;
        }
         k=j/4+1; while (k--) { re[ce++]=v++; re[ce++]=-v++; re[ce++]=-v++; re[ce++]=v++; }
      }
    } else { // 2 4 6 8
      if (j&2) { // 2 6 10
        if (j>2) {
          k=j/4-1; while (k--) { re[ce++]=v++; re[ce++]=-v++; re[ce++]=-v++; re[ce++]=v++; }
          re[ce++]=-v++; re[ce++]=v++; re[ce++]=v++; tb[cb++]=v++; re[ce++]=-v++; re[ce++]=-v++; re[ce++]=v++;
          k=j/4+1; while (k--) { re[ce++]=v++; re[ce++]=-v++; re[ce++]=-v++; re[ce++]=v++; }
        }
      } else { // 4 8 12
        k=j/4-1; while (k--) { re[ce++]=v++; re[ce++]=-v++; re[ce++]=-v++; re[ce++]=v++; }
        re[ce++]=v++; tb[cb++]=v++; re[ce++]=-v++; re[ce++]=-v++; re[ce++]=v++; re[ce++]=-v++; re[ce++]=v++;
        k=j/4; while (k--) { re[ce++]=v++; re[ce++]=-v++; re[ce++]=-v++; re[ce++]=v++; }
      }
    }
    k=j-1; while (k--) { rf[cf++]=-v++; rh[ch++]=v++; }
    if (j&1) { // 1 3 5
      k=j/2; while (k--) {  tc[cc++]=v++; tc[cc++]=-v++; tc[cc++]=-v++; tc[cc++]=v++; }
      tc[cc++]=v++; tc[cc++]=-v++; tc[cc++]=v++; tc[cc++]=-v++; tc[cc++]=-v++; ta[ca++]=-v++; tc[cc++]=v++;
    } else { // 2 4 6
      k=j/2+1; while (k--) { tc[cc++]=v++; tc[cc++]=-v++; tc[cc++]=-v++; tc[cc++]=v++; } ta[ca++]=-v++;
    }
    td[cd++]=v++; k=j+1; while (k--) td[cd++]=-v++; k=j-1; while (k--) tb[cb++]=-v++;
    ta[ca++]=v++; tb[cb++]=-v++; ta[ca++]=v++; tb[cb++]=-v++;
    if (j>2) {
      ta[ca++]=-v++; k=j/2-1; while (k--) { ta[ca++]=-v++; ta[ca++]=v++; }
      k=(j-3)/2; while (k--) { ta[ca++]=v++; ta[ca++]=-v++; } ta[ca++]=v++;
    }
    k=j; while (k--) { rf[cf++]=v++; rh[ch++]=-v++; } b[o][n]=-v; b[n][n]=v++; // NE SE
    ta[ca++]=v++; b[o][o]=-v; b[n][o]=v++; /* NW SW */ putOddBorders(b, o, n);
  } // for (i=11; ...
  biggestValue=v-1; // peekSquare(bSquare,size);
}  // makeOdd7

const int num4x4ap=48; // associative or pandiagonal
//int code4x4ass[]={
//0x07bda6e5, 0x07be95d6, 0x07dbc6e3, 0x07de93b6, 0x07ebc5d3, 0x07eda3b5, 0x0b7d6ae9, 0x0b7e59da, 
//0x0bde537a, 0x0bed6379, 0x0d7e39bc, 0x0dbe357c, 0x16acb7f4, 0x16af84c7, 0x16cad7f2, 0x16cf82a7, 
//0x16fad4c2, 0x16fcb2a4, 0x1a6c7bf8, 0x1a6f48cb, 0x1acf426b, 0x1afc7268, 0x1c6f28ad, 0x1caf246d, 
//0x25c9e7f1, 0x25cf8197, 0x25f9e4c1, 0x25fcb194, 0x29cf415b, 0x29fc7158, 0x2c5f189e, 0x2c9f145e, 
//0x34d8f6e0, 0x34de9086, 0x34e8f5d0, 0x34eda085, 0x38de504a, 0x38ed6049, 0x3d4e098f, 0x3d8e054f, 
//0x43f9e2a1, 0x43fad192, 0x49af213d, 0x4a9f123e, 0x52e8f3b0, 0x52ebc083, 0x58be302c, 0x5b8e032f
//};

int code4x4pan[]={
0x079bc26f, 0x079da46f, 0x07abc15f, 0x07ae945f, 0x07cda13f, 0x07ce923f, 0x0b5d68af, 0x0b6e589f, 
0x0bcd613f, 0x0bce523f, 0x0d6e389f, 0x0dae345f, 0x168ad37e, 0x168cb57e, 0x16bad04e, 0x16bf854e, 
0x16dcb02e, 0x16df832e, 0x1a4c79be, 0x1a7f498e, 0x1adc702e, 0x1adf432e, 0x1c7f298e, 0x1cbf254e, 
0x258cb67d, 0x25bf864d, 0x25ecb01d, 0x25ef831d, 0x294c7abd, 0x297f4a8d, 0x29ec701d, 0x29ef431d, 
0x2c7f1a8d, 0x2cbf164d, 0x349da76c, 0x34ae975c, 0x34fda10c, 0x34fe920c, 0x385d6bac, 0x386e5b9c, 
0x38fd610c, 0x38fe520c, 0x3d6e0b9c, 0x3dae075c, 0x43df862b, 0x43ef851b, 0x52ce973a, 0x52fe940a
};

const int num4x4=712; // 880-168 diagonals not complement paired
int code4x4[]={
0x02f7e1ca,0x02fbe1c6,0x02fce17a,0x02fce1b6,0x03c7d2eb,0x03c7e1db,0x03cbd2e7,0x03cbe1d7,
0x03cde17b,0x03cde1b7,0x03ced27b,0x03ced2b7,0x03dcf17a,0x03dcf1b6,0x03dfc26b,0x03dfc2a7,
0x03ecf279,0x03ecf2b5,0x03efc15b,0x03efc197,0x03fde269,0x03fde2a5,0x03fed15a,0x03fed196,
0x04f7d29c,0x04f9d27c,0x04f9d2e5,0x04fed295,0x05a6e1dc,0x05a7b4ed,0x05a7e1bd,0x05abe17d,
0x05abe1d7,0x05adb4e7,0x05ade16c,0x05ade1b7,0x05aeb47d,0x05aeb4d7,0x05baf17c,0x05baf1d6,
0x05bfa46d,0x05bfa4c7,0x05eaf479,0x05eaf4d3,0x05efa13d,0x05efa197,0x05fbe469,0x05fbe4c3,
0x05feb13c,0x05feb196,0x0697b4de,0x0697d2be,0x069bd27e,0x069bd2e7,0x069db47e,0x069db4e7,
0x069eb4d7,0x069ed2b7,0x06b9f27c,0x06b9f2e5,0x06bf945e,0x06bf94c7,0x06d7c18e,0x06d8e37c,
0x06d8e3f4,0x06d9f47a,0x06d9f4e3,0x06dac15e,0x06df923e,0x06df92a7,0x06fac3d4,0x06fbd45a,
0x06fbd4c3,0x06fdb23c,0x06fdb2a5,0x06fdc3a4,0x078dc36e,0x079ad3f6,0x079bc26f,0x079cb5f6,
0x079da46f,0x079fc24d,0x07a9e3f5,0x07abc15f,0x07acb6f5,0x07ae945f,0x07b9e26d,0x07bad15e,
0x07bda6e5,0x07be95d6,0x07c9e5f3,0x07cad6f3,0x07cda13f,0x07ce923f,0x07cfa12e,0x07d9e46b,
0x07dbc6e3,0x07dcb13e,0x07de93b6,0x07ead45b,0x07ebc5d3,0x07ecb23d,0x07eda3b5,0x087de16c,
0x096b78ed,0x096be17d,0x096d78eb,0x096de17b,0x096e78bd,0x096e78db,0x097f68ad,0x097f68cb,
0x097fc24d,0x09ef524d,0x09ef613d,0x09ef615b,0x09fe713c,0x09fe715a,0x0a5b78de,0x0a5bd27e,
0x0a5d78be,0x0a5d78eb,0x0a5dc36e,0x0a5e78db,0x0a5ed27b,0x0a7f589e,0x0a7f58cb,0x0adf436c,
0x0adf523e,0x0adf526b,0x0afd723c,0x0afd7269,0x0b5c79fa,0x0b5d68af,0x0b6c7af9,0x0b6e589f,
0x0b7d6ae9,0x0b7e59da,0x0bcd613f,0x0bce523f,0x0bcf612e,0x0bdc713e,0x0bde537a,0x0bec723d,
0x0bed6379,0x0c3d78be,0x0c3db47e,0x0c3e78bd,0x0c3eb47d,0x0c7f389e,0x0c7f38ad,0x0c7fa12e,
0x0cbf345e,0x0cbf346d,0x0cbf612e,0x0d6e389f,0x0d6f498e,0x0d7e39bc,0x0dae345f,0x0daf436c,
0x0dbe357c,0x0e9f524d,0x12cde06b,0x12cde0a7,0x12ced37a,0x12ced3b6,0x12d6c3fa,0x12d6f0ca,
0x12d7f0ab,0x12dac3f6,0x12daf07b,0x12daf0c6,0x12dcf06a,0x12dcf0a6,0x12dfc36a,0x12dfc3a6,
0x12ecf378,0x12ecf3b4,0x12efc04b,0x12efc087,0x12fde368,0x12fde3a4,0x12fed04a,0x12fed086,
0x13cdf269,0x13cdf2a5,0x13cfd04b,0x13cfd087,0x13e4d2f9,0x13e8d2f5,0x13efd249,0x13efd285,
0x14abe06d,0x14abe0c7,0x14aeb57c,0x14aeb5d6,0x14b6a5fc,0x14b6f0ac,0x14baf06c,0x14baf0c6,
0x14bca5f6,0x14bcf0a6,0x14bdf2a5,0x14bfa56c,0x14bfa5c6,0x14bfd087,0x14eaf578,0x14eaf5d2,
0x14efa02d,0x14efa087,0x14f7b08d,0x14fbe568,0x14fbe5c2,0x14fcb03d,0x14fe923d,0x14feb02c,
0x14feb086,0x15e6c38d,0x15e8c36d,0x15e8c3f4,0x15efc384,0x168ad37e,0x168bc2e7,0x168cb57e,
0x168da4e7,0x168ed35c,0x1697b4af,0x169ab47f,0x16a7c08f,0x16a8f37c,0x16abc04f,0x16acb7f4,
0x16af84c7,0x16b8f2e4,0x16bad04e,0x16bda7e4,0x16bf854e,0x16c7a08f,0x16c8f57a,0x16cad7f2,
0x16cda02f,0x16cf82a7,0x16d7928f,0x16d8f4e2,0x16dbc7e2,0x16dc923f,0x16dcb02e,0x16df832e,
0x16fad4c2,0x16fbc54a,0x16fcb2a4,0x16fda32c,0x178ac36f,0x178ac3f6,0x178ca56f,0x178ca5f6,
0x178fa5c6,0x178fc3a6,0x17a8e36d,0x17a8e3f4,0x17a9f46b,0x17a9f4e3,0x17adb02f,0x17ae854f,
0x17ae85d6,0x17c8e56b,0x17c8e5f2,0x17ce832f,0x17ce83b6,0x17eab4d3,0x17eac54b,0x17eac5d2,
0x17eca32d,0x17eca3b4,0x17edb4a3,0x186e79bc,0x186e79da,0x186ed35c,0x187a69fc,0x187af06c,
0x187c69fa,0x187cf06a,0x187df269,0x187f69ac,0x187f69ca,0x187fd04b,0x18ef602d,0x18ef604b,
0x18fb704d,0x18fc703d,0x18fe435c,0x18fe523d,0x18fe702c,0x18fe704a,0x196af07b,0x1a4c79be,
0x1a4d68eb,0x1a6bc04f,0x1a6c7bf8,0x1a6f48cb,0x1a7d6be8,0x1a7db02f,0x1a7e389f,0x1a7f498e,
0x1acb604f,0x1acd602f,0x1acf426b,0x1adb524f,0x1adc523f,0x1adc702e,0x1ade347b,0x1adf432e,
0x1afc7268,0x1afd632c,0x1b4c69af,0x1b4c69fa,0x1b4f69ca,0x1b4fc36a,0x1b6e498f,0x1b6e49da,
0x1bce432f,0x1bce437a,0x1bec632d,0x1bec6378,0x1c6da02f,0x1c6f28ad,0x1c7f298e,0x1cad602f,
0x1caf246d,0x1cbf254e,0x1d2f69ac,0x1d2fa56c,0x1d6e298f,0x1d6e29bc,0x1dae254f,0x1dae257c,
0x1dae347b,0x1e3f5a8d,0x1e3f964d,0x1e5f4b8c,0x20d7e1ca,0x20dbe1c6,0x20dce17a,0x20dce1b6,
0x20fce378,0x20fce3b4,0x20fec15a,0x20fec196,0x21cde379,0x21cde3b5,0x21ced05b,0x21ced097,
0x21dcf378,0x21dcf3b4,0x21dfc04b,0x21dfc087,0x21e5c3f9,0x21e5f0c9,0x21e9c3f5,0x21e9f0c5,
0x21ebf4c3,0x21ecf059,0x21ecf095,0x21efb087,0x21efc359,0x21efc395,0x21f6b5da,0x21f7e08b,
0x21f9e06b,0x21fda46b,0x21fde049,0x21fde085,0x21fed358,0x21fed394,0x249bd0c7,0x249db67c,
0x24b596fc,0x24b5a7ec,0x24b785ce,0x24b9f0c5,0x24bcf095,0x24bf965c,0x24d9f678,0x24d9f6e1,
0x24df901e,0x24df9087,0x24fbd658,0x24fbd6c1,0x24fdb01c,0x24fdb085,0x258bc1d7,0x258cb67d,
0x25b7a48f,0x25b8f1d4,0x25b9a46f,0x25bf864d,0x25c7908f,0x25c8f679,0x25c9e7f1,0x25ce901f,
0x25cf8197,0x25e8f4d1,0x25ebc7d1,0x25ecb01d,0x25ef831d,0x25efa10c,0x25f9e4c1,0x25fbc649,
0x25fcb194,0x25fe931c,0x269bf45a,0x269bf4c3,0x269fb01e,0x269fb087,0x26d8b4f3,0x26dfb41a,
0x26dfb483,0x2789c3f5,0x278c965f,0x278ce3b4,0x278ec196,0x278fc395,0x2798d3f4,0x279d864f,
0x27c8d65b,0x27c8d6f1,0x27cd831f,0x27cd83b5,0x27cda10e,0x27cf830e,0x27d9c64b,0x27d9c6e1,
0x27dc931e,0x27dc93b4,0x285d7abc,0x28795afc,0x28796bec,0x287b49ce,0x287bf45a,0x287cf059,
0x287f5a9c,0x287fb01e,0x28df501e,0x28df504b,0x28f9706b,0x28fd346b,0x28fd701c,0x28fd7049,
0x28fe701b,0x294c7abd,0x296c38bf,0x297f4a8d,0x29cb504f,0x29ce501f,0x29cf415b,0x29ec701d,
0x29ef431d,0x29ef610c,0x29fc7158,0x29fe531c,0x2b4c5a9f,0x2b4ce378,0x2b4ec15a,0x2b4fc359,
0x2b5d4a8f,0x2bcd431f,0x2bcd4379,0x2bcd610e,0x2bcf430e,0x2bdc531e,0x2bdc5378,0x2c5e901f,
0x2c5f189e,0x2c7da10e,0x2c7f1a8d,0x2c9e501f,0x2c9f145e,0x2cbd610e,0x2cbe341f,0x2cbf164d,
0x2d4e189f,0x2d6f3c8b,0x2d6fa51b,0x2d7e1b9c,0x2d8e145f,0x2dbe175c,0x2e1f5a9c,0x2e1f965c,
0x30cde269,0x30cde2a5,0x30ced15a,0x30ced196,0x30dcf268,0x30dcf2a4,0x30dfc14a,0x30dfc186,
0x30e7a4cb,0x30ecb57a,0x30ecf158,0x30ecf194,0x30efc249,0x30efc285,0x30f4d2e8,0x30f4e1d8,
0x30f5b4e9,0x30f8d2e4,0x30f8e1d4,0x30fae5d2,0x30fde148,0x30fde184,0x30fea196,0x30feb459,
0x30fed248,0x30fed284,0x31c4d2f9,0x31c8d2f5,0x31cfd249,0x31cfd285,0x32d596eb,0x32d9f6e1,
0x32de965b,0x32df9087,0x349ad0c6,0x349da76c,0x34a9e0c5,0x34ae975c,0x34d6819e,0x34d8f6e0,
0x34d9e768,0x34de9086,0x34df810e,0x34e582ad,0x34e8f5d0,0x34ead758,0x34eda085,0x34ef820d,
0x34f9e5c0,0x34fad6c0,0x34fc921d,0x34fda10c,0x34fe920c,0x358ac1d6,0x358ca76d,0x358db0a7,
0x35a8e1d4,0x35a9f6e1,0x35ade184,0x35ae874d,0x35af9087,0x35c8e769,0x35c8e7f0,0x35ce810f,
0x35ce8196,0x35eac749,0x35eac7d0,0x35eca10d,0x35eca194,0x35edb629,0x35edb6a1,0x35ef940b,
0x3689c2e5,0x368c975e,0x3698d2e4,0x369d874e,0x369ed284,0x36c8d75a,0x36c8d7f0,0x36cd820f,
0x36cd82a5,0x36d9c74a,0x36d9c7e0,0x36dc920e,0x36dc92a4,0x378ae5d2,0x378ea196,0x37c9a5e2,
0x37cea50b,0x37cea592,0x385a7cdb,0x385d6bac,0x386e5b9c,0x38796dea,0x387d29ae,0x38da415e,
0x38de504a,0x38df410e,0x38e9426d,0x38ed6049,0x38ef420d,0x38fa7059,0x38fc521d,0x38fd610c,
0x38fd7029,0x38fe520c,0x394c6bad,0x396de148,0x396e4b8d,0x39ce410f,0x39ce415a,0x39ec257a,
0x39ec610d,0x39ec6158,0x39ef610a,0x3a4c5b9e,0x3a5d4b8e,0x3a5e189f,0x3a5ed248,0x3acd420f,
0x3acd4269,0x3adc520e,0x3adc5268,0x3ade165b,0x3c1f5a8d,0x3c1f964d,0x3c5f098e,0x3c6f0a8d,
0x3c7e2d9a,0x3c7eb40a,0x3c9f054e,0x3caf064d,0x3d2e189f,0x3d2eb459,0x3d4e098f,0x3d4f810e,
0x3d6e0b9c,0x3d8e054f,0x3d8f410e,0x3dae075c,0x3daf250e,0x3e4f820d,0x3e5f940b,0x3e8f420d,
0x40f9d678,0x40fd923c,0x41e2c3f8,0x41e3a5f9,0x41e3c7d9,0x41e7839d,0x41e9f0a3,0x41eaf093,
0x41efa539,0x41efc328,0x41fbe083,0x41feb538,0x42d396fa,0x42d9f0a3,0x42daf093,0x42df963a,
0x42f583ac,0x42fac758,0x42fbd083,0x42fdb638,0x42fe831c,0x43d8f1b2,0x43df862b,0x43dfc209,
0x43e8f2b1,0x43ef851b,0x43f9e2a1,0x43fad192,0x43fda629,0x43fe951a,0x45af872c,0x479f860d,
0x48bf301e,0x48bf302d,0x497ed318,0x49ad302f,0x49ae301f,0x49af213d,0x4a5fc328,0x4a9d302f,
0x4a9e301f,0x4a9f123e,0x4b8d213f,0x4b8e123f,0x4d2fa539,0x4d3e971c,0x4e1f872c,0x4e1f963a,
0x50eaf192,0x50efa429,0x50f2b4e8,0x50f8e1b2,0x50fbe182,0x50feb428,0x52c9e0a3,0x52ce973a,
0x52e384cb,0x52e8f3b0,0x52ebc083,0x52ecb738,0x52ef840b,0x52f9e3a0,0x52fe940a,0x53c8e1b2,
0x53cbe182,0x53ce872b,0x53eac192,0x53eca729,0x58bc213e,0x58be302c,0x58bf210e,0x59ae210f,
0x59ae213c,0x5a9c302e,0x5a9f032e,0x5b8c213e,0x5b8e032f,0x5b8f210e,0x5c3eb428,0x5e2f840b
};

void get4x4(int **x, int *code4x4, const int i) {
//   ------
  const int Msum=34; int code=code4x4[i];
  x[2][2]=(code&0xf)+1; code>>=4; x[2][0]=(code&0xf)+1; code>>=4;
  x[1][2]=(code&0xf)+1; code>>=4; x[1][1]=(code&0xf)+1; code>>=4; 
  x[1][0]=(code&0xf)+1; code>>=4; x[0][2]=(code&0xf)+1; code>>=4;
  x[0][1]=(code&0xf)+1; code>>=4; x[0][0]=(code&0xf)+1;
  x[0][3]=Msum-x[0][0]-x[0][1]-x[0][2]; x[1][3]=Msum-x[1][0]-x[1][1]-x[1][2];
  x[3][0]=Msum-x[0][0]-x[1][0]-x[2][0]; x[3][2]=Msum-x[0][2]-x[1][2]-x[2][2];
  x[3][3]=Msum-x[0][0]-x[1][1]-x[2][2]; x[3][1]=Msum-x[3][0]-x[3][2]-x[3][3];
  x[2][1]=Msum-x[0][1]-x[1][1]-x[3][1]; x[2][3]=Msum-x[2][0]-x[2][1]-x[2][2];
} // get4x4

void putCenter4x4(int **x, int **b, const int o, const int n) {
//   ------------
  get4x4(x, code4x4, random_(num4x4));
  for (int i=0; i<4; i++) for (int j=0; j<4; j++) b[i+o][j+o]=x[i][j]-(x[i][j]>8  ?  8 : 9); // (4*4+1)/2; (8.5)
  Turn(o, n);
} // putCenter4x4

void putBorder(int **b, const int o, const int n) { // random choices from top and right
//   ---------
  int *top=tSideOa, *right=tSideOb, length=n-o-1; // remaining choices in top, right 
  for (int i=o+1; i<(n-1); ++i) { int k=random_(length); b[o][i]=top[k]; b[n][i]=-top[k];
    for (int j=k; j<length; ++j) top[j]=top[j+1]; k=random_(length); b[i][o]=right[k]; b[i][n]=-right[k];
    for (int j=k; j<length; ++j) right[j]=right[j+1]; --length;
  }
  b[o][n-1]=top[0]; b[n][n-1]=-top[0]; b[n-1][o]=right[0]; b[n-1][n]=-right[0]; Turn(o, n);
} // putBorder

void makeCenter(int **b, const int size) { // bordered 4x4
//   ----------
  int *top=tSideOa, *right=tSideOb, v=9; /* (4*4+1)/2; (8.5) */ int o=(size-4)/2, n=o+3; putCenter4x4(xSquare, b, o, n);  
  for (int i=6; i<=size; i+=2) { int c=0, r=0; o=(size-i)/2;  n=o+i-1;  
    if ((i&2)!=0) { /* singly even */ const int k=(i-2)/4; int j=k; while (j--) { top[c++]=-(v++); top[c++]=v++; }
      top[c++]=-(v++); right[r++]=-(v++); j=k-1; while (j--) { right[r++]=v++; right[r++]=-(v++); }
      b[n][n]=-v; b[o][o]=v++; /* NW */ b[n][o]=-v; b[o][n]=v++; /* NE */ right[r++]=v++; j=k-1;
      while (j--) { right[r++]=-(v++); right[r++]=v++; } right[r++]=v++; top[c++]=-(v++); j=k-1; 
      while (j--) { top[c++]=v++; top[c++]=-(v++); } right[r++]=-(v++);
    } else { /* doubly even */ top[c++]=-(v++); const int k=(i-4)/4;
      int j=k; while (j--) { top[c++]=v++; top[c++]=-(v++); }
      if (i==8) right[r++]=v++; else {
        right[r++]=-(v++); right[r++]=v++; j=k-2; while (j--) { right[r++]=-(v++); right[r++]=v++; } right[r++]=v++;
      } right[r++]=-(v++); right[r++]=-(v++); b[n][n]=-v; b[o][o]=v++; /* NW */ b[n][o]=-v; b[o][n]=v++; /* NE */
      right[r++]=v++; right[r++]=v++; j=k-1; while (j--) { right[r++]=-(v++); right[r++]=v++; } right[r++]=-(v++);
      j=k; while (j--) { top[c++]=-(v++); top[c++]=v++; } top[c++]=-(v++);
    } // if ((i&2)!=0)
    putBorder(b, o, n);
  } // for (i=6; ...
  makeActual(xSquare, size);
} // makeCenter

const int numperm2x2=8;
char perm2x2[8][4]={{0,3,1,2},{0,3,2,1},{1,2,0,3},{1,2,3,0},{2,1,0,3},{2,1,3,0},{3,0,1,2},{3,0,2,1}}; // 2x2

void makeByDoubling(int **b, int **x, const int m, const int n) {
//   --------------
  int i=m;
  while (i<n) { const int mid=i*i/2; char *p=perm2x2[random_(numperm2x2)];
    for (int r=0, R=0; r<i; ++r, R+=2) for (int c=0, C=0; c<i; ++c, C+=2) {
      const int u=b[r][c], v=(u-1)*4+1;
      if (u<=mid) { x[R][C]=v+p[0]; x[R][C+1]=v+p[1]; x[R+1][C]=v+p[2]; x[R+1][C+1]=v+p[3]; }
      else        { x[R][C]=v+p[1]; x[R][C+1]=v+p[0]; x[R+1][C]=v+p[3]; x[R+1][C+1]=v+p[2]; }
    } i*=2; for (int r=0; r<i; ++r) for (int c=0; c<i; ++c) b[r][c]=x[r][c];
  }
 } // makeByDoubling

void makeFrom4x4(int **b, int **x, const int n, const bool pan) {
//   -------------
  biggestValue=n*n/2; // checked in isCorrect
  if (pan) get4x4(b, code4x4pan, random_(num4x4ap)); else get4x4(b, code4x4, random_(num4x4));
  makeByDoubling(b, x, 4, n);
} // makeFrom4x4

void makeFromMxM(int **b, int **x, const int m, const int n) {
//   -----------
  biggestValue=n*n/2; // checked in isCorrect
  for (int r=0; r<m; ++r) for (int c=0; c<m; ++c) b[r][c]=x[r][c]; makeByDoubling(b, x, m, n);
} // makeFromMxM

const char *notMagic="\a\nERROR: Square is NOT magic! Please report by email\n";
const char *notZigZag2="\a\nERROR: Square is NOT zigzag2! Please report by email\n";

bool checkSquare(int **x, const int n) {
//   -----------
  if (isCorrect(x, n)) { if (!isZigZag2(x, n)) { printf("%s", notZigZag2); return F; }
  } else { printf("%s", notMagic); return F; } return T;
} // checkSquare

bool isPow2(const int n) { // n>4
//   ------
  if ((n&3)==0) { int v=n/2; while (v>2) { if ((v%2)!=0) return F; v/=2; } return T; } return F;
} // isPow2

bool makeEven(const int n, bool pan, bool *writeError, FILE *wfp) {
//   --------
  if ((n&3)==2) return F;
  if (random_(5)) {
    if (isPow2(n)) makeFrom4x4(bSquare, xSquare, n, pan); else {
      int m=n; while (T) { m/=2; if (m&1) { m+=m; break; }} makeCenter(bSquare,m);
      makeFromMxM(bSquare, xSquare, m, n);
    }
  } else { makeEven8(bSquare, n); makeActual(xSquare, n); }
  if (!checkSquare(xSquare, n)) return F; *writeError=!printSquare(xSquare, n, wfp); return T;
} // makeEven

bool makeOdd(const int n, bool *writeError, FILE *wfp) {
//   -------
  if (n&2) makeOdd7(bSquare, n); else makeOdd9(bSquare, n);
  makeActual(xSquare, n); if (!checkSquare(xSquare, n)) return F;
  *writeError=!printSquare(xSquare, n, wfp); return T;
} // makeOdd
//======================================================= main ===================================================

bool validOrder(const int n) {
//   ----------
  if ((n<7)|((n&3)==2)) { printf("\aERROR: There are no zigzag2 magic squares of order %d.\n", n); return F; } 
  return T;
}// validOrder

int main() {
//  ----
  bool another=T, inputSize=T, writeError=F, ok=F; seed_rand();
  if (openDir()) {
    int n=0; 
    do {     
      if (inputSize) { printf("\nOrder? "); n=getSize(); }
      if (validOrder(n)) {
	if (allocateSquares(n)) { FILE *wfp=NULL;
	  if ((wfp=open_File(n))!=NULL) {
            bool pan=F; if (isPow2(n)) { printf("Make pandiagonal, (y or n)? "); pan=getY(); }
            printf("\nHow many? "); int howMany=getSize();
            while (howMany--) {
              ok=n&1 ?  makeOdd(n, &writeError, wfp) : makeEven(n, pan, &writeError, wfp);
              if (writeError) ok=F; if (!ok) break;
            } fclose(wfp);  
	  }
        } else printf("\a\nERROR: Storage allocation failed.\n");
      } // if (validOrder
      if (writeError) { perror("\a\nError writing file"); another=F; }
      else if (ok) {
        printf("\nMake another square? input y (yes) or n (no) or the order of the square: ");
        if (getYorOrder(&n)) inputSize=(n<=0); else another=F;
      } else another=F;
    } while (another);
  }
  freeSquares(); printf("\nHit return to close the console.");
  while (T) if (getchar()=='\n') break; return ok ? EXIT_SUCCESS : EXIT_FAILURE;
} // main